您的位置:首页 > 编程语言 > C语言/C++

C++声明与定义的区别(读CPLS有感)

2014-12-26 10:58 232 查看
        声明指定了一个名字所关联的类型,定义则更进一步指定了名字所对应的实体,

所谓的实体就是适当数量的存储,一个定义首先肯定是一个声明。

       换句话说:能否根据代码在内存中开辟出空间,是声明与定义最大的区别

在很多情况下不能简单的根据声明就能在内存中给变量(或者其他标识符)开辟出空间。

任何描述了初始值的声明都是一个定义。

        下面我们通过《C++程序设计语言(特别版)》上的习题来具体的分析声明与定义

的区别:

首先给定一些声明和定义:

char ch;
string s;
int count = 1;
const double pi = 3.1415;
extern int error_number;

const char *name = "Njal";
const char *season[] = {"spring","summer","fall","winter"};

struct Date
{
int d;
int m;
int y;
};
int day(Date *p)
{
return p->d;
}
double sqrt(double);
template<class T>T abs(T a)
{
return a<0 ? -a:a;
}
typedef complex<short> Point;
struct User;
enum Beer {Carksberg, Tuborg, Thor };
namespace NS { int a;}

那么问题来了,这里面哪些是声明哪些是定义呢,该到了运用我们上面规则的时候了,
看编译器是否能准备的开辟出空间。

这样一来

char ch;
string s;
int count = 1;比如这三行代码,变量ch编译器可以在内存中为其分配一个字节(char型变量占一字节),
s则是一个地址,在内存中也有分配,count则是一个整型变量,占据内存的四个字节。

同理我们也可以得到

const double pi = 3.1415;
const char *name = "Njal";
const char *season[] = {"spring","summer","fall","winter"};
struct Date
{
int d;
int m;
int y;
};
typedef complex<short> Point;
enum Beer {Carksberg, Tuborg, Thor };这些都是定义。
还有两个函数定义和名词空间的定义可能不太号理解:

int day(Date *p)
{
return p->d;
}
template<class T>T abs(T a)
{
return a<0 ? -a:a;
}
namespace NS { int a;}

day函数和abs函数都是定义了函数实体的,所以这两个指定函数的代码也是定义。
对于名词空间,我们可以理解为给一段程序盖了一间屋子,在屋子里打篮球跟在

户外打篮球都是打篮球,屋子里的漂移投篮跟屋子外的漂移投篮是一个动作。

这样就剩下非定义的声明了:

extern int error_number;
double sqrt(double);
struct User;这三行代码所引用实体必须在其他地方定义,函数sqrt的代码体必须通过另外的某个声明描述,int变量error_number的存储必须由某个另外的error_number的声明去分配,
必须有另外的某个对类型User的声明来定义出这个类型是什么样子。

下面我们来改写那些不是定义的声明,并将定义转换为声明。

对于extern int error_number是声明了一个引用外部的变量,其定义在另外的地方,

我们只要把extern去掉,变为本地声明的变量即可。

没有函数实体的函数声明,我们添加上函数实体就是定义。

一个class、struct、union或者enum如果带有其所有成员的声明,那么它就是一个

定义。无法写出一个不是定义的名字空间声明。

按照上面的规则我们就可以实现将定义转换为声明如下:



将声明转化为定义如下:



到此我们就完成了例子,同学们定义与声明的区别你们理解了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 定义声明