目录
1. 《C++程序设计语言》4.9
2. 《C++Primer》2.3.5
3. http://bbs.csdn.net/topics/190026622
声明用于向程序表明变量的类型和名字。(引自参考2)
2.2 定义
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
3. 对比
定义是声明,声明大部分是定义,少数情况不是定义。
声明 |
定义 |
||
非定义 |
定义 |
||
是否可以出现多次? |
是 |
否 |
否 |
是否有内存分配? |
没有 |
有 |
有 |
是否可以直接使用该变量? |
不能 |
能 |
能 |
是否知道它的构成? |
不一定知道 |
知道 |
知道 |
3.1 声明但不是定义的情况
除了下面三种情况,声明全都是定义。
3.1.1 声明来自其他文件的非初始化变量
extern int i; // 这是声明不是定义,变量i的定义在其他文件中
注意:如果对来自其他文件的变量进行初始化,那么这就是定义
extern int i = 10; // 这是声明且是定义
3.1.2 声明类型
struct User; // 这是声明不是定义
3.1.3 声明方法
double _sqrt(double); // 这是声明不是定义
3.2 声明且是定义的情况
int i; char ch; string s; int count = 1; const double pi = 3.14; const char *name = "Njal"; const char *season[] = {"spring", "summer", "fall", "winter"}; struct Date { int d, m, y; }; int day(Date *p) { return p->d; }; template <typename T> T _abs(T a) { return a < 0 ? -a : a; } enum Beer { Carlsberg, Tuborg, Thor}; namespace NS { int a; };
3.3.1 使用extern修饰变量,且初始化
extern int i = 10; // 这是定义
3.3.2 使用typedef
这是个纠结的问题,我现在还没想明白,如果你知道请回复我,谢谢。
C++的作者认为
typedef comple<short> Point; // C++的作者认为这是定义
但是对于这种情况呢?
struct User; // 这是声明非定义 typedef User USER; // 这是不是定义呢?
3.3.3 类定义中的成员变量
struct Date { int y; // 这是定义 }
下面是关于声明与定义的帖子的一个回复以及我的观点,读者可以参考。
论坛上某人的回复如下。(引自参考3)
1. 变量和对象不加extern永远是定义,类中的除外. 2. 函数只有函数头是声明,有函数体是定义. 3. 类永远只是声明.类成员函数的函数体是定义. class C { static int x;//这里的x是声明 static const int a;;//这里的a是声明 //非static变量在类定义对象时才分配内存. C();//这里的函数是声明 }; int C::x;//这个才是定义 const int C::a=11;//这个才是定义
我的观点:
1. "变量和对象不加extern永远是定义"是片面的,例如特殊情况extern int i = 10就是定义。 "变量和对象不加extern永远是定义,类中的除外",我认为类中的变量和对象也是声明。 2. "函数只有函数头是声明,有函数体是定义.",我认为是正确的。 3. "类永远只是声明.类成员函数的函数体是定义.",我认为类永远都是定义。 class C { static int x;//这里的x是定义 static const int a;//这里的a是定义 C();//这里的函数是声明 }; int C::x;//这个是初始化 const int C::a=11;//这个是初始化