声明与定义的区别
清楚明⽩声明与定义是⼀名合格的程序猿的基本要求。本⼈认为,C++编码过程中谈及“声明”和“定义”是因为我们要使⽤⼀个变量、类
型(类、结构体、枚举、共⽤体)或者函数,因此有申明和定义变量、类型和函数之说。C/C++中,使⽤⼀个变量、类型或者函数必须先在
使⽤前申明它。
请记住:
(1)“声明”与“定义”的本质区别是:声明可以出现多次,⽽定义只能出现⼀次。
(2)把申明的东西放在头⽂件,把定义的东西放在源⽂件(.c或者.cpp⽂件)。
(3)类型的定义应该放在头⽂件,因为类型不具有外部连接性,不同源⽂件拥有相同的类型定义不会报编译错误,但头⽂件
不能重复包含。
下⾯介绍申明和定义的具体含义:
申明变量:指明变量所属类型与变量名称,如:externinta;
定义变量:指明变量所属类型、名称、分配内存空间与初始化其初始值,如inta=1;或者inta(1);如果不显⽰初始化,则按照
编译器默认进⾏初始化。
定义类型:指明类型的名称和内容,如structtest{inta;}。或者给已经存在的类型起个别名,如typedefintint32;
注意,类型的作⽤域是源⽂件,即类型不具有外部连接性质,因此可以在不同源⽂件定义相同名称的类型,⽐如定义同名的
类是不会报重定义错误的,这也说明了类型的定义应该放在头⽂件中,但在同⼀个源⽂件定义相同名称的类型则编译器会报重定
义错误。
声明类型:只给出类型的名称,如classA;类型被声明之后,可以⽤于声明其他的标识符,但不能利⽤它来定义对象,也不能使
⽤类型的成员。
classA;//先声明
voidshow(A&a);//申明函数
classA//后定义
{
public:
inta;
charb;
};
以上代码没有错误。但如下代码将报错:
classA;//先声明
intmain(intargc,char*argv[])
{
AclassA;
classA.a=5;
return0;
}
classA//后定义
{
public:
inta;
charb;
};
该程序⽆法通过编译,原因是类A的所有成员的有效范围均是从定义类的地⽅开始,故使⽤未知的构造函数初始化其对象是错误的,会报使⽤
未定义的class“A”错误。
使⽤类型之前给出其定义式即可,即给出类型的名称和内容,或者利⽤typedef给⼀个类型起个别称。虽然说是定义类型,但还是将类型的定
义放在头⽂件,即使被不同的源⽂件包含,因为类型不具有外部连接特性,所以不会报重定义错误的,这和变量和函数不同,不能将变量和
函数的定义放在头⽂件!切记!
这⾥所说的外部连接与内部连接的区别在于链接器链接的时候是否将当前⽬标⽂件中的定义与其它⽬标⽂件对⽐,并报告是否有重定义错
误。内连接不会进⾏对⽐,故不同源⽂件中定义相同名称的类型是不会报错的。
申明函数:指明函数返回类型,函数名称和函数参数
如inttest(chara,intb);
定义函数:指明函数返回类型、函数名称、函数参数和函数体。
如inttest(chara,intb)
{
returna+b;
}
本文发布于:2022-12-08 12:22:13,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/66019.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |