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.需要建立存储空间的 ...
随机推荐
- javaweb基础 01--JSP取得绝对路径应用
1.相关函数说明 * request.getScheme() 等到的是协议名称,默认是http * request.getServerName() 得到的是在服务器的配置文件中配置的服务器名称 比如: ...
- linux常用命令大全2--挂载/dpkg/文件系统分析/apt/光盘/关机
挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2 ...
- C# 未能加载文件或程序集“xxx”或它的某一个依赖项。参数错误。(异常来自 HRESULT:0x80070057 (E_INVALIDARG))
错误信息: 因为电脑突然蓝屏,然后重启,再运行项目,报了这个错. 解决方案: 环境是:VS2012+Win7 通过网上查找, 4.0 删除 C:\Windows\Microsoft.NET\Frame ...
- 23种设计模式之命令模式(Command)
命令模式是一种对象的行为型模式,类似于传统程序设计方法中的回调机制,它将一个请求封装为一个对象,从而使得可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是对命 ...
- 【BZOJ4361】isn 动态规划+树状数组+容斥
[BZOJ4361]isn Description 给出一个长度为n的序列A(A1,A2...AN).如果序列A不是非降的,你必须从中删去一个数, 这一操作,直到A非降为止.求有多少种不同的操作方案, ...
- spring c3po 连接mysql,sqlserver
1 连接mysql (1) http://wenku.it168.com/d_000096351.shtml 2 连接sqlserver (1)http://blog.csdn.net/vinep ...
- hdu6390GuGuFishtion【数论】
GuGuFishtion Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
- CSU 1804 - 有向无环图 - [(类似于)树形DP]
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 ...
- codeforces 869A/B/C
A. The Artful Expedient time limit per test 1 second memory limit per test 256 megabytes input stand ...
- CodeForces - 583C GCD Table map的auto遍历 ,有点贪心的想法
题意:给你n*n gcd表中的所有数(以任意顺序) ,求对角线上的n个数分别是什么.gcd表定义如下,先将n个数填在对角线的上,然后将各个格子填上对应对角线上的数的gcd值,也就是V[i][j]=gc ...