阅读了这个问题后,我知道了声明和定义之间的区别。那么这是否意味着定义等于声明加初始化?
阅读了这个问题后,我知道了声明和定义之间的区别。那么这是否意味着定义等于声明加初始化?
在程序中,声明通常指引入一个新的名称。例如,您可以通过描述其“签名”来声明一个新函数:
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 };
T
的通用对象,通常采用以下形式:T x = i;
但在C++中,它可以是:
T x(i);
T x {i};
使用C++11。
那么定义是否等于声明加初始化呢?
这取决于你所讨论的内容。如果你讨论的是一个对象,例如:
int x;
这是一个没有初始化的定义。而下面这个则是一个有初始化的定义:
int x = 0;
int x;
既是定义也是声明。 - Angew is no longer proud of SOint 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;
};
...但这会涉及到更复杂的功能。
baz
需要是const
或constexpr
,否则它将无法编译),但我认为编译器允许初始化而不需要定义,是因为该值可以在编译时求值的表达式中使用。所以如果你有类似int x = T::baz;
的代码,编译器会对其进行搜索和替换,表达式变成int x = 42;
。如果你将baz
推入函数调用中,foo(T::baz);
,那么你应该通过定义来分配内存给它。 - undefinedint myfunc(void) {
int myvar;
...
void helloWorld(); //declaration or Prototype.
void helloWorld()
{
std::cout << "Hello World\n";
}