首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么区分C++中类的声明和定义

2013-07-08 
如何区分C++中类的声明和定义C++ primer 58页上说头文件一般包含类的定义,extern变量的声明和函数的声明。

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

void main()
{
  .....
}
既然类A是一个定义,那在进入main函数之前是否已经为类A分配了内存,但是我记得说只有在类实例化一个对象的时候才会分配内存的啊。这不是矛盾了么。。。。那类的声明又是什么意思?
[解决办法]
1. 声明不分配内存,定义则会分配内存。这是最主要的区别。
2. 很多时候,声明和定义是同时出现的。
[解决办法]
定义类型和实例化对象不是同一个概念
[解决办法]
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()
{}

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

class A;  
这就是申明


class A
{
//....
}
这就是定义

热点排行