大家好,欢迎来到IT知识分享网。
文章目录
前言
在学习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++却说,这个是声明。
再接回上文,这里与声明式和定义式有什么关系呢?这个demo给我最深刻的认识就是声明式,不分配空间,定义式,会分配空间。
2.程序运行结果
下面给出上面代码不注释相关静态常量的定义式 和 注释了之后的运行结果
3.运行结果解释
类中的fun()函数打印了NumTypes的地址,这就涉及到了内存空间的分配问题。因为类里面的静态量只能做到声明,必须在类外定义。所以注释掉相关代码后,程序自然就不能做到去取出没有分配空间的变量地址,进而报错。
总结
本文简单探索了声明式和定义式的区别,以及二者结合类中的静态成员的相关变化。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134866.html