3 回答

TA貢獻2019條經驗 獲得超9個贊
宣言
聲明通常是指在程序中引入新名稱。例如,您可以通過描述新功能的“簽名” 來聲明新功能:
void xyz();
或聲明不完整的類型:
class klass;
struct ztruct;
最后但并非最不重要的一點是,聲明一個對象:
int x;
在C ++標準中,在§3.1/ 1中將其描述為:
聲明(第7條)可以在翻譯單元中引入一個或多個名稱,也可以重新聲明以前聲明引入的名稱。
定義
定義是先前聲明的名稱的定義(或者可以是定義和聲明)。例如:
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),它是不透明枚舉聲明(7.2),它是模板參數(14.1),它是參數-不是函數定義聲明符的函數聲明符中的聲明(8.3.5),或者它是typedef聲明(7.1.3),別名聲明(7.1.3),using聲明(7.3。)。 3),static_assert聲明(條款7),屬性聲明(條款7),空聲明(條款7)或using指令(7.3.4)。
初始化
初始化是指在構造時值的“賦值”。對于type的通用對象,T通常采用以下形式:
T x = i;
但是在C ++中可以是:
T x(i);
甚至:
T x {i};
使用C ++ 11。
結論
那么,這是否意味著定義等于聲明加上初始化?
這取決于。關于你在說什么。如果您在談論一個對象,例如:
int x;
這是沒有初始化的定義。相反,以下是帶有初始化的定義:
int x = 0;
在某些情況下,談論“初始化”,“定義”和“聲明”是沒有意義的。例如,如果您在談論一個函數,初始化的意義并不大。
因此,答案是否定的:定義并不自動意味著聲明加初始化。

TA貢獻1818條經驗 獲得超7個贊
宣言說“這東西存在于某處”:
int foo(); // function
extern int bar; // variable
struct T
{
static int baz; // static member variable
};
定義說:“這東西存在于此;為此做記憶”:
int foo() {} // function
int bar; // variable
int T::baz; // static member variable
在定義對象時,初始化是可選的,并說“這是事物的初始值”:
int bar = 0; // variable
int T::baz = 42; // static member variable
有時有可能在聲明時代替:
struct T
{
static int baz = 42;
};
…但這正在涉及更復雜的功能。
- 3 回答
- 0 關注
- 849 瀏覽
添加回答
舉報