到底如何区分声明和定义?

seraphsky 2007-10-03 09:00:41
我一直以为定义是声明+初始化
即int i;是声明
int i =0;是定义
但看侯捷翻译的effective c++上面说string p;也是个定义(在条款定义应该尽量靠后的那节),如果定义过早,就会过早引入构造的负担。
难道我对声明和定义的概念一直有错吗
声明不导致内存分配,那么到底如何区分定义和声明?

PS:新论坛的确很垃圾,提交发言没通过,再点回来的时候内容都没了!还要重新写!
...全文
2842 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgstudyvc 2012-09-19
  • 打赏
  • 举报
回复
mark
zhizun9527 2012-01-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fish6344 的回复:]

"声明"的严谨C++语意,是用以告诉编译器类型及其细节,例如:

class fish6344
{
//数据成员细节...
//成员函数细节...
};

上述声明仅告诉编译器有自定义类型fish6344,编译器仅对其进行语汇分析及名字的决议,并无内存实际佔有!

"定义"的严谨C++语意,即内存佔有,编译器将在相对内存地址上为其对象定址!要注意的是,我们不能……
[/Quote]
++
feishuisheng 2012-01-18
  • 打赏
  • 举报
回复
A
declaration provides information to the compiler about the
characteristics of something such as a type or a function but it
doesn't actually define any code to be used in the executable
program, and you are permitted to make as many declarations of the
same entity as you desire. A definition, on the other hand,
actually defines something that will exist in the executable
program, either some useful variables, or some executable code, and
you are required to have one and only one definition of each entity
in the program. In short, a declaration introduces a name into the
program and a definition introduces some code.
only_lonely 2012-01-12
  • 打赏
  • 举报
回复
翻C++ 标准去。
赵4老师 2012-01-12
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
Defonds 2012-01-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hxxwcc 的回复:]

是否实例化是定义与声明的根本区别
[/Quote]就是这个了
ForestDB 2012-01-12
  • 打赏
  • 举报
回复
关于声明和定义的说法,楼上已经有很多了,核心要点的就是一个是符号,让编译器知道有这么东西(在某个地方),一个真正分配内存。
至于那个条款,个人简单理解就是说变量在用的时候才去定义,这样可以避免条款描述的情况下的性能问题。
boy_11914789 2011-11-11
  • 打赏
  • 举报
回复
被说的一塌糊涂
lirunfa 2011-10-17
  • 打赏
  • 举报
回复
08年的贴...
Memory秀 2011-10-17
  • 打赏
  • 举报
回复
学习了!!!!!
至善者善之敌 2011-06-28
  • 打赏
  • 举报
回复
翻尸了。。。。。。
赵4老师 2011-06-28
  • 打赏
  • 举报
回复
做个可能不太恰当的比喻:
人想让狗帮忙逮只兔子,可是人说话狗听不懂,于是人发明了一种介乎人言和狗语之间的语言,即口令。
人想让电脑帮忙做计算,可是人话电脑听不懂,于是人发明了一种介乎人言和汇编机器码之间的语言,即C语言。
人对狗的口令得让人容易学、也得让狗容易懂。
C语言同样得让人容易学、也得让电脑容易懂。
相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。
林临工作室 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fish6344 的回复:]

"声明"的严谨C++语意,是用以告诉编译器类型及其细节,例如:

class fish6344
{
//数据成员细节...
//成员函数细节...
};

上述声明仅告诉编译器有自定义类型fish6344,编译器仅对其进行语汇分析及名字的决议,并无内存实际佔有!

"定义"的严谨C++语意,即内存佔有,编译器将在相对内存地址上为其对象定址!要注意的是,我们不能……
[/Quote]
class fish6344
{
string s1;
string s2;
};

上述fish6344类应该是个定义,而s1、s2是个声明
makewater 2008-02-29
  • 打赏
  • 举报
回复
恩 8楼说的很精辟,只需要看8楼的其他的可以不用看了
^_^
hxxwcc 2008-02-29
  • 打赏
  • 举报
回复
是否实例化是定义与声明的根本区别
taodm 2008-02-29
  • 打赏
  • 举报
回复
"类永远只是声明.类成员函数的函数体是定义. "说错了
class A;叫声明
class A{....};叫定义
接下来的int A::f(){....}叫实现
A a;叫A的实例化,同时是变量a的定义。
另外,“定义”的同时一定耦合了一个“声明”
Ninstein 2008-02-29
  • 打赏
  • 举报
回复
11楼说的简洁
Eddy_0825 2007-10-04
  • 打赏
  • 举报
回复
申明仅仅是说明有这么一个类型,但没有分配内存空间。
类可以是申明的。但定义后才可以申明对象
avronhust 2007-10-04
  • 打赏
  • 举报
回复
顶8楼!以前对这个问题也困扰过,查过些资料,的确像8楼说的那样
fish6344 2007-10-04
  • 打赏
  • 举报
回复
"声明"的严谨C++语意,是用以告诉编译器类型及其细节,例如:

class fish6344
{
//数据成员细节...
//成员函数细节...
};

上述声明仅告诉编译器有自定义类型fish6344,编译器仅对其进行语汇分析及名字的决议,并无内存实际佔有!

"定义"的严谨C++语意,即内存佔有,编译器将在相对内存地址上为其对象定址!要注意的是,我们不能简单的说:

string s;

是声明或是定义,应视具体情况而定,原则是,如果有内存的实际占有可确定是定义,否则是声明。例如:

class fish6344
{
string s1;
string s2;
};

上述fish6344类是个声明,并无内存占有(未实例化),s1及s2都是string型变量的声明而不是定义,fish6344都没有实体(可以为是虚幻的),哪儿有其成员的内存位置呢?只有实例化fish6344类以后,才会有内存占有。例如:

fish6344 _fish;//在对象实体_fish中有s1及s2的内存占有!

但是上述关于s1及s2的语句放在全局作用域或是另一实体的局部作用域,例如:

#include<iostream>

//全局作用域的:
string s2;//这是定义,s2是实例化的string!

int main()
{
//Main函数体内的:
string s1;;//这是定义,s1是实例化的string!

return 0;
}

二个string语句都是定义,这是典型的类型实例化!

朋友们以此可明确关于'声明'及其'定义'的C++用词语意


加载更多回复(10)

64,660

社区成员

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

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