c,c++初心者のための疑問点メモ
#ifdef と#ifndefの違いは
前者は定義されているか、後者は定義されていないかをチェックしている。
#ifdef は、指定されたシンボルが定義されているかどうかをチェック。もし定義されていた場合は、その後ろに続くコードがコンパイルされる。定義されていない場合は、その後ろに続くコードはコンパイルされる。
#ifdef DEBUG
std::cout << "Debug mode enabled." << std::endl;
#endif
#ifndef は、指定されたシンボルが定義されていないかどうかをチェック。もし定義されていなかった場合は、その後ろに続くコードがコンパイルされる。定義されている場合は、その後ろに続くコードはコンパイルされない。
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
// ...
};
#endif
こちらはヘッダーファイルが複数回インクルードされるのを防ぐためによく使われるぽい。
参照演算子(アドレス演算子)とかポインターとか
&
が参照演算子と言われ、変数やオブジェクトのアドレスを取得するために使われる。オブジェクトの参照を宣言するために使われる。
例えば、
int a = 5;
int* b = &a;
というコードで、&演算子は、a変数のアドレスをポインターbに割り当てる。
また、
int& c = a;
というコードで、&演算子は、a変数への参照をcに割り当てる。 つまり、cを変更するとaも変更される。
int a = 5;
int& c = a;
c = 10;
std::cout << a; // 10 が出力される
参照を用いることで、元の変数と同じメモリアドレスを共有し、同じ値を指すようになる。参照はポインタと似たような使い方をするが、参照はポインタよりも安全で使いやすい機能
ポインタと参照のちがい
int a = 5;
int *b = &a;
int& c = a;
int& c = a
は、
参照を使ってcをaの別名として定義している。
これはcがaと同じメモリアドレスを指すことを意味する。
つまり、cの値を変更すると、元のaの値も変更される。
int *b = &a
は、
ポインタを使ってbにaのアドレスを格納している。
bはaとは異なるメモリアドレスを指していて、*bを使ってaの値を取得することができる。
*bの値を変更しても、元のaの値は変わらない。