【C/C++学习笔记之声明式和定义式】

【C/C++学习笔记之声明式和定义式】在学习 EffectiveC 的时候 看到了声明式和定义式这两个概念 突然感觉自己好像一直对这两个概念都区分不清楚

大家好,欢迎来到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

(0)
上一篇 2025-07-08 21:33
下一篇 2025-07-08 21:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信