1. ホーム
  2. c++

[解決済み] 変数の初期化、定義、宣言の違いについて

2023-02-18 02:26:28

質問

を読んだ後 質問 を読んで、宣言と定義の違いはわかりました。つまり、定義は宣言+初期化に等しいということでしょうか?

どのように解決するのですか?

宣言

宣言とは、一般に、プログラム中に新しい名前を導入することを指します。例えば を宣言します。 を宣言し、新しい関数のシグネチャを記述します。

void xyz();

または不完全な型を宣言します。

class klass;
struct ztruct;

そして最後に、オブジェクトを宣言することです。

int x;

C++の標準では、§3.1/1で、次のように記述されています。

宣言(第7項)は、1つ以上の名前を翻訳単位に導入するか、以前の宣言によって導入された名前を再宣言することができる。

定義

定義は、以前に宣言された名前を定義したものです(定義と宣言の両方でもかまいません)。例えば

int x;
void xyz() {...}
class klass {...};
struct ztruct {...};
enum { x, y, z };

具体的にはC++の規格では、§3.1/1で、次のように定義されています。

宣言は、関数本体を指定せずに関数を宣言している場合(8.4)、extern指定子(7.1.1)やリンク指定25(7.5)を含み初期化子や関数本体でない場合、クラス定義で静的データメンバを宣言している場合(9.2, 9.4 )、クラス名宣言(9.1)、不透明enum宣言(7.2 )、テンプレートパラメータ宣言(14.1)である場合以外は定義と呼ぶことになります。 2),テンプレートパラメータ(14.1),関数定義の宣言子でない関数宣言子におけるパラメータ宣言(8.3.5),型定義宣言(7.1.3)である。 3)、エイリアス宣言(7.1.3)、using宣言(7.3.3)、static_assert宣言(第7項)、属性宣言(第7項)、空宣言(第7項)、using命令(7.3.4)である場合。

初期化

初期化とは、構築時に値を割り当てることです。型の汎用オブジェクトの場合 T 型の汎用オブジェクトの場合、それはしばしばこのような形式になります。

T x = i;

になりますが、C++では可能です。

T x(i);

とかでもいい。

T x {i};

をC++11で実装しました。

まとめ

つまり、定義=宣言+初期化ということでしょうか?

それは場合によるね。あなたが何について話しているかに。たとえば、オブジェクトについて話している場合。

int x;

これは初期化なしの定義です。代わりに、以下は初期化を伴う定義です。

int x = 0;

ある文脈では、"初期化", "定義", "宣言" について話すことは意味を持ちません。例えば、関数について話している場合。 初期化 はあまり意味がありません。

ということで、答えは ではない : 定義が自動的に宣言と初期化を意味するわけではありません。