7. list 1 example0.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# include <stdio .h>
int main(int , char **) // you can omit unused variable
{
printf ("input values :");
int val [10];
// declears variable after function call
for (int i = 0; i < 10; i++) // declears variable in the init expression
scanf ("%d", val + i);
for (int i = 0; i < 10; i++)
printf ("%d ", val[i]);
printf ("n");
return 0;
}
34. 左辺値参照は基本的にはポインタです。
宣言は
1
2
int a = 0; // local variable
int &r = a; // reference of a
このように行います。
左辺値参照はこのように、lvalue(ローカル変数などの具体的
に名前のついた値) で初期化しないと作れません。
1
2
3
4
5
6
7
int &r;
// ‘’ r declared as reference but not initialized
int &e = 1;
// invalid initialization of non - const reference of type
// ‘ int ’ & from an rvalue of type ‘’ int
const int &f = 1;
// ok
歴史的経緯から、定数左辺値参照はなんと領域を確保するの
48. 19 隠蔽と friend
しかし set adc value や get adc value って余計な関数呼び出
しが発生するだけじゃね?って適当な人が直接 value を書き
換えたとします。
これは後々 hal の中身を書き換えたり、不正な値が代入され
ないかチェックしたりということができなくなるのでよくあ
りません。
しかし、C のコードだと結構簡単にできてしまいます。
49. list 15 access0.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# include <stdio .h>
struct hal_adc {
unsigned int value ;
};
void set_adc_value ( hal_adc *adc , unsigned int value ) {
adc -> value = value ;
}
unsigned int get_adc_value (const hal_adc *adc) {
return adc -> value ;
}
int main(int , char **)
{
hal_adc adc;
adc. value = 3;
// set_adc_value (&adc , 3);
printf ("%dn", adc. value);
// printf ("%dn", get_adc_value (& adc));
}
50. libkairo だと構造体を hal adc prv.h というヘッダファイルで
定義して、制御屋はそこで定義されてるものは直接使わない
ようにしようという事にしていますが、強制力はありま
せん。
しかし、それを C++ でやってみるとこれはコンパイルが通
りません。
51. list 16 access1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# include <cstdio >
class hal_adc {
private :
unsigned int value ;
public :
unsigned int get_value () {
return this -> value;
}
void set_value ( unsigned int value) {
this -> value = value;
}
};
int main(int , char **)
{
hal_adc adc;
adc. value = 3;
// ‘ unsigned int hal_adc :: ’ value is private
std :: printf ("%dn", adc.value);
// ‘ unsigned int hal_adc :: ’ value is private
return 0;
}