2023.05.29

C/C++初心者の疑問あれこれ

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の値は変わらない。