前言
在学习Effective C++的时候,看到了声明式和定义式这两个概念,突然感觉自己好像一直对这两个概念都区分不清楚。所以本文主要研究二者区别联系。
一、声明式是什么?
声明是用来告诉编译器变量的名称和类型,但是,绝对不会分配内存
extern int num; // 声明
typedef int INT; // 声明
struct Student; // 声明
//这种写法本人所很少写。在平时的项目基本没有单独声明结构体,
//往往都是直接声明定义一起做啦。
二、定义式是什么?
在声明式的基础之上,还会进行内存的分配,同时也可以对变量进行初始化。还有一点就是,声明和定义往往可以同时进行,这也是为什么我不能将二者区分清楚的原因。
int i = 0;//声明&&定义&&初始化
int i ;//声明&&定义&&未初始化
三、二者在不同场景的对比
1.变量
这个很简单,也很好区分
extern int num; // 声明
int i = 0;//声明&&定义&&初始化
int i ;//声明&&定义&&未初始化
2.函数
这里有函数第二个声明方式我平时很少见过。然后就是,第一个的声明方式对应的与变量的声明&&定义方式(int i)很像,这就搞得我以前总是很容易将二者记混。
int add(int a,int b);//声明
extern add(int a,int b);//声明
int add(int a,int b){
return a+b;
}//声明&&定义
3.结构体
这个也很好区分
struct Student;//声明
struct Student{
int no;
string name;
//........
};//声明&&定义
四、声明式可以赋值吗?
在今天我写下这篇博客之前,我一直认为变量声明就像函数声明那样,是不会被赋值的。但是其实变量的声明和定义可以同时进行。所以声明一个变量并且进行赋值是可以的。
五、在类里类外讨论二者
#include <bits/stdc++.h>
using namespace std;
// 本程序主要用于记录effective c++ P14的类中的静态常量为什么是声明式
class GamePlayer{
private:
static const int NumTurns = 5;//书上说这个是静态常量的一个声明加赋值
int scores[NumTurns];
public:
void fun(){
//该句代码主要为了验证上面的NumTurns是声明还是定义
cout << "NumTurns的地址为:" << &NumTurns;
}
};
const int GamePlayer::NumTurns;//而这里才是静态常量的定义(分配空间)注释掉该行代码之后再运行就会报错
int main(){
GamePlayer gamePlayer;
gamePlayer.fun();
return 0;
}
1.代码背景介绍
上面的代码主要是为了搞清楚,为什么酷似变量的定义(static const int NumTurns = 5;),然而Effective C++却说,这个是声明。
答案:
在C++类中,静态量必须类中声明,类外定义(分配空间)。如果在类中就是定义啦,那么使用该类型所得到的所有对象中关于这一静态量都会各自有一份自己的空间来存储。这样就违背了类中的静态量的设计思想–同一个类,所有对象,共享一份数据。
再接回上文,这里与声明式和定义式有什么关系呢?这个demo给我最深刻的认识就是声明式,不分配空间,定义式,会分配空间。
2.程序运行结果
下面给出上面代码不注释相关静态常量的定义式 和 注释了之后的运行结果
这是不注释的
这是注释了的
3.运行结果解释
类中的fun()函数打印了NumTypes的地址,这就涉及到了内存空间的分配问题。因为类里面的静态量只能做到声明,必须在类外定义。所以注释掉相关代码后,程序自然就不能做到去取出没有分配空间的变量地址,进而报错。
总结
本文简单探索了声明式和定义式的区别,以及二者结合类中的静态成员的相关变化。