C++声明和定义
目录
1. 参考
1. 《C++程序设计语言》4.9
2. 《C++Primer》2.3.5
3. http://bbs.csdn.net/topics/190026622
2. 概念
2.1 声明
声明用于向程序表明变量的类型和名字。(引自参考2)
2.2 定义
变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。
3. 对比
定义是声明,声明大部分是定义,少数情况不是定义。
|
声明 |
定义 |
||
|
非定义 |
定义 |
||
|
是否可以出现多次? |
是 |
否 |
否 |
|
是否有内存分配? |
没有 |
有 |
有 |
|
是否可以直接使用该变量? |
不能 |
能 |
能 |
|
是否知道它的构成? |
不一定知道 |
知道 |
知道 |
3.1 声明但不是定义的情况
除了下面三种情况,声明全都是定义。
3.1.1 声明来自其他文件的非初始化变量
extern int i; // 这是声明不是定义,变量i的定义在其他文件中
注意:如果对来自其他文件的变量进行初始化,那么这就是定义
extern int i = ; // 这是声明且是定义
3.1.2 声明类型
struct User; // 这是声明不是定义
3.1.3 声明方法
double _sqrt(double); // 这是声明不是定义
3.2 声明且是定义的情况
int i;
char ch;
string s;
int count = ;
const double pi = 3.14;
const char *name = "Njal";
const char *season[] = {"spring", "summer", "fall", "winter"};
struct Date { int d, m, y; };
int day(Date *p) { return p->d; };
template <typename T> T _abs(T a) { return a < ? -a : a; }
enum Beer { Carlsberg, Tuborg, Thor};
namespace NS { int a; };
3.3 特殊情况
3.3.1 使用extern修饰变量,且初始化
extern int i = ; // 这是定义
3.3.2 使用typedef
这是个纠结的问题,我现在还没想明白,如果你知道请回复我,谢谢。
C++的作者认为
typedef comple<short> Point; // C++的作者认为这是定义
但是对于这种情况呢?
struct User; // 这是声明非定义 typedef User USER; // 这是不是定义呢?
3.3.3 类定义中的成员变量
struct Date
{
int y; // 这是定义
}
下面是关于声明与定义的帖子的一个回复以及我的观点,读者可以参考。
论坛上某人的回复如下。(引自参考3)
. 变量和对象不加extern永远是定义,类中的除外.
. 函数只有函数头是声明,有函数体是定义.
. 类永远只是声明.类成员函数的函数体是定义. class C
{
static int x;//这里的x是声明
static const int a;;//这里的a是声明
//非static变量在类定义对象时才分配内存.
C();//这里的函数是声明
};
int C::x;//这个才是定义
const int C::a=;//这个才是定义
我的观点:
. "变量和对象不加extern永远是定义"是片面的,例如特殊情况extern int i = 10就是定义。
"变量和对象不加extern永远是定义,类中的除外",我认为类中的变量和对象也是声明。
. "函数只有函数头是声明,有函数体是定义.",我认为是正确的。
. "类永远只是声明.类成员函数的函数体是定义.",我认为类永远都是定义。
class C
{
static int x;//这里的x是定义
static const int a;//这里的a是定义
C();//这里的函数是声明
};
int C::x;//这个是初始化
const int C::a=;//这个是初始化
C++声明和定义的更多相关文章
- C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理
这里的问题实质是我们在头文件中直接定义全局变量或者函数,却分别在主函数和对应的cpp文件中包含了两次,于是在编译的时候这个变量或者函数被定义了两次,问题就出现了,因此,我们应该形成一种编码风格,即: ...
- C\C++中声明与定义的区别
声明和定义是完全同的概念,声明是告诉编译器"这个函数或者变量可以在哪找到,它的模样像什么".而定义则是告诉编译器,"在这里建立变量或函数",并且为它们分配内存空 ...
- 变量声明和定义及extern 转载
在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...
- C/C++中的声明与定义
含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...
- 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏
以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- [转载]C++声明和定义的区别
<C++Primer>第四版 2.3.5节中这么说到: ①变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ②变量声明:用于向程序表明变量的类型和名字 ...
- C/C++:[2]enum-枚举量声明、定义和使用
C/C++:[2]enum-枚举量声明.定义和使用 转自:http://jingyan.baidu.com/article/e75aca85526c1b142edac6d9.html 众所周知,C/C ...
- 【C】 05 - 声明和定义
仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里 ...
- 声明、定义 in C++
序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述: 1.需要建立存储空间的 ...
随机推荐
- 怎样在excel中快速输入当前日期和时间
找到并启动我们的Microsoft Excel软件,如图 在excel中,我们先演示如何快速输入当前“日期”,先在一个“单元格”里面输入“Ctrl+:”(就是“Ctrl“键和“:”键的组合),效果 ...
- 禁用ngen版本的.NET Framework dll加载
在调试时会发现出于性能考虑.NET Framework dll加载的都是ngen版本,比如:System.dll,实际加载System.ni.dll. 如果希望加载非ngen版本,可以设置系统环境变量 ...
- C语言位操作--判断两整数是否异号
判断两整数是否异号: int x, y; //输入比较的两数 bool f = ((x ^ y) < 0); // 返回真,当且仅当x与y异号 说明:当x.y异号,x与y的最高位分别为0和1,取 ...
- maven 使用-P指定环境打包,linux移动配置文件失败,windows成功!
问题描述: windows机器使用-P指定环境打包,最后组装文件组装成功,配置文件成功移动,linux下却只移动了jar包. windows: linux: ...
- 【LOJ6254】最优卡组 堆(模拟搜索)
[LOJ6254]最优卡组 题面 题解:常用的用堆模拟搜索套路(当然也可以二分).先将每个卡包里的卡从大到小排序,然后将所有卡包按(最大值-次大值)从小到大排序,并提前处理掉只有一张卡的卡包. 我们将 ...
- 【CF887E】Little Brother 二分+几何
[CF887E]Little Brother 题意:给你n个圆和一条线段,保证圆和圆.圆和线段所在直线不相交,不相切,不包含.求一个过线段两端点的圆,满足不和任何圆相交(可以相切.包含).问圆的最小半 ...
- Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置
在Thinkphp框架下根目录打开index.php 在头部加入如下代码即可: //入口文件 define('DOMAIN','abc.com');//abc.com换成自己的跟域名 //以下两行是为 ...
- linux 安装Swagger(swagger-editor , swagger-ui)
一.环境要求 1.Nodejs ( 版本6.0x以上 ) 2.npm (npm 3.x) 注: linux 更新nodejs到最新 node -v 4.2.1 sudo npm cache clean ...
- js 的基础知识
一.弱类型意识 js变量是没有类型的 var a = 1; //a 就是一个变量 不要提什么类型 变量可以赋任何类型的值 类型仅仅是值的性质 与变量无关 Js的基本类型 变量未赋值时,其值为und ...
- 51nod1126 求递推序列的第N项
求递推序列的第N项 有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的 ...