c++中定义与声明的区别

dlopeor98 2008-05-02 11:11:00
Effective C++第三版第二条里有这么一个例子:
class GamePlayer {

private:

static const int NumTurns = 5; // constant declaration

int scores[NumTurns]; // use of constant

...

};

他下面注释说这个static const int NumTurns = 5;是声明式而不是定义式。后面又说const int GamePlayer::NumTurns;这个才是定义式
为什么呢?C++Primer里讲变量的定义用于为变量分配存储空间,还可以为变量指定初始值。那static const int NumTurns = 5应该是定义式啊,请知道的朋友指点一下,谢谢
...全文
212 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
喵新人 2011-10-06
  • 打赏
  • 举报
回复
1.变量的声明,基本与定义是一样的,即声明变量处即是定义了改变量,如int a; 在处定义了变量。从概念上讲,声明即是让编译器知道要声明的对象是个函数,类,变量等,不为它分配实际的内存空间。所以有函数声明,变量声明,类声明。主要区别是表现在一个类中
class student
{
int a; //此处就是声明,并不为a分配内存空间。
};
student stu; //此处定义了一个student对象(变量)stu,并为之分配内存空间,包括类中变量a
2.函数声明:主要用于实际定义函数处在调用函数后面,如:
int max(int* p,5); //函数声明,如果这里没有这个声明,将会出错
int main()
{
int a[5]={1,2,3,4,5};
max(a,5); //调用函数
}
int max(int* p,int n) //此处才实际定义函数max
{
int max=p[0];
for(int i=1;i<n;i++)
{
if(max<p[i]) max=p[i];
}
return max;
}
其次就是在类中声明其成员函数,在类外(包括在另一个文件中)实际定义。
如:
class student
{
public:
int get_value(); //声明
private:
int a;
};
int student::get_value() //类外定义
{
return a;
}
yxycjsfq 2008-05-05
  • 打赏
  • 举报
回复
我都被搞晕喽,声明和定义太难区别喽!
有谁能系统的说一下啊 !!
Treazy 2008-05-03
  • 打赏
  • 举报
回复
这里就是声明

声明和定义在c++中概念比c中模糊了,个人觉得还是把c的先搞透了吧

再研究c++的不同就行了
baihacker 2008-05-03
  • 打赏
  • 举报
回复
你可以多次声明,但是在同一个模块的同一个域内只能定义一次...
否则就会出现已定义的符号的错误.
dlopeor98 2008-05-03
  • 打赏
  • 举报
回复
那一般该怎么区分声明和定义呢?
visame 2008-05-03
  • 打赏
  • 举报
回复
这与static变量的初始化时间有关
visame 2008-05-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dlopeor98 的回复:]
那一般该怎么区分声明和定义呢?
[/Quote]
很麻烦,你先学习一下下面的几个例子:

all but one of the following are definitions:
int a; // defines a
extern const int c = 1; // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; }; // defines S, S::a, and S::b
struct X { // defines X
int x; // defines nonstatic data member x
static int y; // declares static data member y
X(): x(0) { } // defines a constructor of X
};
int X::y = 1; // defines X::y
enum { up, down }; // defines up and down
namespace N { int d; } // definesN and N::d
namespace N1 = N; // defines N1
X anX; // defines anX
whereas these are just declarations:
extern int a; // declares a
extern const int c; // declares c
int f(int); // declares f
struct S; // declares S
typedef int Int; // declares Int
extern X anotherX; // declares anotherX
using N::d; // declares N::d
baihacker 2008-05-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 arong1234 的回复:]
常量不需要空间
[/Quote]

最强的可以做到把所有出现这个static const类成员的地方全部使用立即数寻址,如果能在编译时计算的全部编译时计算.
最弱的是在常量区有一个变量,使用时访问一次
dlopeor98 2008-05-02
  • 打赏
  • 举报
回复
常量不需要空间??常量是储存在哪里的?栈中么?
michney 2008-05-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 dlopeor98 的帖子:]
Effective C++第三版第二条里有这么一个例子:
class GamePlayer {

private:

static const int NumTurns = 5; // constant declaration

int scores[NumTurns]; // use of constant

...

};

他下面注释说这个static const int NumTurns = 5;是声明式而不是定义式。后面又说const int GamePlayer::NumTurns;这个才是定义式
为什么呢?C++Primer里讲变量的定义用于为变量分配存储空间,还可以…
[/Quote]
特殊情况,static 成员比较特殊
baihacker 2008-05-02
  • 打赏
  • 举报
回复
再换个角度思考

如果是定义:那么这个头文件多次被包含,那么就会有多个NumTurns,但是这是静态链接属性,所以不会有问题

如果是声明:那么只在实现文件有定义,只有一个实体,但是是内部链接属性,所以是作为class的内部去链接

然而按无论推测的哪种情况,都不会对这个类的表现产生影响.

arong1234 2008-05-02
  • 打赏
  • 举报
回复
常量不需要空间
baihacker 2008-05-02
  • 打赏
  • 举报
回复
上次讨论过了

这里是声明,后面得加上
const int GamePlayer::NumTurns;
才是定义


但是,在有些编译器里不加后面的定义也行
static const同时出现的时候后面不加,可以看作定义吧.

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧