如何区分C++中类的声明和定义

ynney_2011 2012-02-26 08:36:47
C++ primer 58页上说头文件一般包含类的定义,extern变量的声明和函数的声明。
看到网上总结说区别声明和定义就是看是否被分配了内存。既然这样假如我写了下面这个类:
class A
{
A();
int get()const;
int i;
};

void main()
{
.....
}
既然类A是一个定义,那在进入main函数之前是否已经为类A分配了内存,但是我记得说只有在类实例化一个对象的时候才会分配内存的啊。这不是矛盾了么。。。。那类的声明又是什么意思?
...全文
2912 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
长空飞鸟 2013-11-24
  • 打赏
  • 举报
回复
引用 10 楼 jenicooper 的回复:
定义一个类,在实例化它之前并不产生内存开销;这与基本类型有所区别。
首先你的说法 class A { A(); int get()const; int i; }; 是一个类的定义! 但是! 类的定义与基本类型的定义有所区别,编译器仅对其进行语汇分析及名字的决议,并未占用内存!
diggcat 2013-07-13
  • 打赏
  • 举报
回复
如果我的一个类中有静态的数据成员和成员函数,那么该类的定义与申明是要分开的,是否意味着在该类中其他的成员函数可以再申明时后面紧跟函数体,而像静态成员函数以及构造函数就得在类外面定义呢?
不思議醬 2013-06-07
  • 打赏
  • 举报
回复
这让我有了谢谢小东呢
vcchendefu 2012-10-20
  • 打赏
  • 举报
回复
那么我的在头文件中声明一个类的时候,构造函数放在哪呢;如果是个这个类成员函数放在一起的话,那么有什么要求没有啊
[Quote=引用 9 楼 的回复:]
直观一点理解就是:
申明:阐述了有这么一个东西;
定义:阐述了这个东西在干嘛。

class A;
这就是申明


class A
{
//....
}
这就是定义
[/Quote]
食财物权情性 2012-02-27
  • 打赏
  • 举报
回复
declaration
声明:指将一个名称引入当前编译单元,或者重新声明一个前面已经声明过的名称,声明指定了如何解释一个名称和该名称具有的属性;
例如:
int main(void)
{
int a; // 声明了变量a,类型为int
int *pa; // 声明了变量pa,类型为指向int型的指针类型
}
definition
定义:除了以下情况,声明就是定义
a.声明函数但不包括函数体;
b.声明包含extern链接限定符,例如:extern int a;
c.声明既没有初始化语法,也没有函数体;
d.类声明中声明静态数据成员;
e.类名字声明;
f.typedef声明;
g.using声明或者using指令;
以上情况适用于C具有的特征,C++则完全适用,一般来说定义要为其对象分配或预留存储空间,而声明则不用。
translation unit
编译单元:一个源文件,.c .cpp等和它所包含的文件一起,在经过预处理之后形成一个源码文件,标准称之为translation unit(编译单元)包括一系列的声明和定义;一个program(程序)由一个或多个编译单元组成。编译器将各个翻译单元编译为目标代码(.obj),通过连接器(linker)将这些编译后的编译单元(即目标代码)连接成完整的指令序列(可执行文件、静态库、动态库等)。
one definition rule
一次定义规则:是指定义在所有进入连接的编译单元中只能有一次。

观点、例子
A:头文件只放声明
example_a.h
void function();
example_a.cpp:
#include "example_a.h"
void function()
{}
wyfsh534797296 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 steven30832 的回复:]

直观一点理解就是:
申明:阐述了有这么一个东西;
定义:阐述了这个东西在干嘛。

class A;
这就是申明


class A
{
//....
}
这就是定义
[/Quote]

nice
jenicooper 2012-02-27
  • 打赏
  • 举报
回复
定义一个类,在实例化它之前并不产生内存开销;这与基本类型有所区别。
steven30832 2012-02-27
  • 打赏
  • 举报
回复
直观一点理解就是:
申明:阐述了有这么一个东西;
定义:阐述了这个东西在干嘛。

class A;
这就是申明


class A
{
//....
}
这就是定义
xiyoulaoyuanjia 2012-02-26
  • 打赏
  • 举报
回复
关于头文件包含类定义说明如下:

类的定义是具有内部链接特性的,即它不是声明,不能在同一编译单元(即不在一个cpp文件中)重复出现,但是它具有内部链接,(所谓内部链接指的是该名称对于所在编译单元是局部的,在链接时不会与其他编译单元中同样的名称产生命名冲突),所以类如果要在单个编译单元之外使用它必须被定义在一个头文件中
详见<<大规模C++程序设计>>
matthewxfz 2012-02-26
  • 打赏
  • 举报
回复
广义上来说:声明是更宽范的感念,定义也是一种声明。
youcry 2012-02-26
  • 打赏
  • 举报
回复
如果只是写 class A;
这样就是对A 的申明,而没有对他定义。

在这个时候对 A 做sizeof(A) 编译器会提示 error C2027: use of undefined type 'A'

但是如果你这么写
class A
{

};

这个时候,你再写 sizeof(A),就不会错了, 结果会是1

你说的在进入main函数之前是否已经为类A分配了内存?
如果类A,申明了变量,比如这样
class A
{
int a;
};
那么在main 函数之前,是会对这个类分配内存空间的
ynney_2011 2012-02-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]
楼主所说的情况,并不适合用变量的声明和定义的那种说法来解释。

确切地说,定义一个类就是定义一种自己创建的数据类型。
[/Quote]
有点小懂了。。谢谢。
pathuang68 2012-02-26
  • 打赏
  • 举报
回复
楼主所说的情况,并不适合用变量的声明和定义的那种说法来解释。

确切地说,定义一个类就是定义一种自己创建的数据类型。
qscool1987 2012-02-26
  • 打赏
  • 举报
回复
定义类型和实例化对象不是同一个概念
pathuang68 2012-02-26
  • 打赏
  • 举报
回复
1. 声明不分配内存,定义则会分配内存。这是最主要的区别。
2. 很多时候,声明和定义是同时出现的。

64,649

社区成员

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

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