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

        声明指定了一个名字所关联的类型,定义则更进一步指定了名字所对应的实体,

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

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

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

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

        下面我们通过《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如果带有其所有成员的声明,那么它就是一个

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

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


将声明转化为定义如下:



到此我们就完成了例子,同学们定义与声明的区别你们理解了吗?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值