首页 > 代码库 > C++声明和定义
C++声明和定义
目录
-
1 参考
-
2 概念
-
2.1 声明
-
2.2 定义
-
3 对比
-
3.1 声明但不是定义的情况
-
3.2 声明且是定义的情况
-
3.3 特殊情况
1. 参考
1. 《C++程序设计语言》4.9
2. 《C++Primer》2.3.5
3. http://bbs.csdn.net/topics/190026622
2. 概念
2.1 声明
声明用于向程序表明变量的类型和名字。(引自参考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 特殊情况
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;//这个是初始化
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。