目录

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++声明和定义的更多相关文章

  1. C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理

    这里的问题实质是我们在头文件中直接定义全局变量或者函数,却分别在主函数和对应的cpp文件中包含了两次,于是在编译的时候这个变量或者函数被定义了两次,问题就出现了,因此,我们应该形成一种编码风格,即: ...

  2. C\C++中声明与定义的区别

    声明和定义是完全同的概念,声明是告诉编译器"这个函数或者变量可以在哪找到,它的模样像什么".而定义则是告诉编译器,"在这里建立变量或函数",并且为它们分配内存空 ...

  3. 变量声明和定义及extern 转载

    在讨论全局变量之前我们先要明白几个基本的概念: 1. 编译单元(模块):    在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ER ...

  4. C/C++中的声明与定义

    含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...

  5. 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏

    以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...

  6. switch语句下的变量声明和定义

    switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...

  7. [转载]C++声明和定义的区别

    <C++Primer>第四版 2.3.5节中这么说到: ①变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. ②变量声明:用于向程序表明变量的类型和名字 ...

  8. C/C++:[2]enum-枚举量声明、定义和使用

    C/C++:[2]enum-枚举量声明.定义和使用 转自:http://jingyan.baidu.com/article/e75aca85526c1b142edac6d9.html 众所周知,C/C ...

  9. 【C】 05 - 声明和定义

    仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里 ...

  10. 声明、定义 in C++

    序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述:          1.需要建立存储空间的 ...

随机推荐

  1. Elasticsearch学习之深入聚合分析二---案例实战

    以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析,首先建立电视销售的索引,然后 添加几条销售记录 PUT /tvs { "mappin ...

  2. 题目1091:棋盘游戏(DFS)

    题目链接:http://ac.jobdu.com/problem.php?pid=1091 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  3. ftp主动与被动模式区别

    FTP是仅基于TCP的服务,不支持UDP.与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口).通常来说这两个端口是21(命令端口)和20(数据端口).但FTP工作方式的不同 ...

  4. 使用 udev 管理 Linux 设备文件

    本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...

  5. Mongoose学习参考资料

    我们学习node操作mongodb数据库时,可能经常要用到MongoDB 数据库的模型工具Mongoose,下面是我整理的一些学习资料: 番外篇之——使用 Mongoose:https://githu ...

  6. DLRS(近三年深度学习应用于推荐系统论文汇总)

    Recommender Systems with Deep Learning Improving Scalability of Personalized Recommendation Systems ...

  7. 判断一个正整数是否是2的N次方的简洁算法及其证明

    在写代码时遇到了“判断一个正整数是否是2的N次方”的问题,不想调用 java.lang 的 Math 类库进行浮点运算,觉得转换为浮点不是个好办法. 遂在网上搜索了一下,发现有人列出来好几种写法,列举 ...

  8. hdu5692【dfs序】【线段树】

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. 51nod1432 独木舟

    1432 独木舟  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者 ...

  10. Hive和Sqoop测试数据

    测试数据以Oracle数据库自带scott用户emp和dept表为准: 一.MySQL数据库创建的emp和dept表语法及数据: drop table if exists dept;create ta ...