当前位置:首页 > 公众号精选 > 混说Linux
[导读]定义一个变量,就是在内存中为你定义的这个变量开辟一段内存空间,如果这个变量没有初始化,那么系统会随机给这个变量赋一个值,这个值我一般称它为"垃圾数"。没有初始化的变量我认为它是没有意义的,是在浪费内存,就比如人刚出生的时候上帝需要给他赋予点东西,比如条件反射,比如哭,比如吮吸........这样人的意义得以体现。对于类的成员来说,我们最好的做法就是在构造函数中对每一个类成员进行初始化。

定义一个变量,就是在内存中为你定义的这个变量开辟一段内存空间,如果这个变量没有初始化,那么系统会随机给这个变量赋一个值,这个值我一般称它为"垃圾数"。没有初始化的变量我认为它是没有意义的,是在浪费内存,就比如人刚出生的时候上帝需要给他赋予点东西,比如条件反射,比如哭,比如吮吸........这样人的意义得以体现。对于类的成员来说,我们最好的做法就是在构造函数中对每一个类成员进行初始化。

我们来看一个简单的例子:


class name{public: name(int aa, int bb) {}private: int a; int b;};


上面例子中的变量 a 和 b 的值都没有在构造函数中初始化,这时候它们的值就会是一个"垃圾数",我们稍微改一下:


class name{public: name(int aa, int bb):a(aa) { b = bb; }private: int a; int b;};


可以看到 a 的值是用初始化列表的方式进行初始化,而 b 的值是通过构造函数的参数进行赋值。


在类对象调用构造函数的时候,以上两种方式都可以确保 a 和 b 的值是可以确定的,但是初始化和赋值两种方式是有区别的

  1. 初始化发生的时机肯定比赋值早。初始化会在程序刚开始运行的时候发生,而赋值是只有在程序执行到这条语句才会发生。

  2. 初始化的执行效率要比赋值高。类成员在构造函数中执行的赋值语句之前已经被系统进行了初始化,当执行赋值的时候就需要抹掉之前default的初始化的数据,这样就相当于多做了一次无用功,而构造函数中运行的初始化列表则不需要做这次无用功。

  3. 常量成员和引用成员只能使用初始化列表。这是c++的语法。



class name{public: name(int aa, int bb):b(bb),a(aa) {}private: int const a; int &b;};


代码中的类成员 a 和 b 是必须使用初始化列表初始化的,这是c++语法规定的。


另外,类成员的初始化的顺序的固定的:如果有基类的话,先初始化基类,然后按照类中声明的顺序去初始化派生类中的类成员。上述代码中可以看到,构造函数初始化列表是先写 b 后写 a,即使是这样也是会按声明的顺序先初始化 a 后初始化 b。


我们来做一个实验就可以彻底明白:


class Name{public: Name():b(2),a(b + 2) {}  void print() { cout << "a = " << a << " ,  b = " << b << endl; }private: int const a; int b;}; int main(){ Name Leon; Leon.print();  return 0;}


编译后的结果为:


结果很明显,当初始化 a 的时候,b还没被初始化为2,b还是个垃圾数,所以最终打印的 a 的值依然是个垃圾数,b 则后面被初始化为 2。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

C语言是一种高级程序设计语言,它提供了十分完备的规范化流程控制结构。因此采用C51语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,易于调试和维护。对于一个较大的程序...

关键字: C51语言 变量 存储

用静态局部变量,还是临时变量,要牵涉到你项目具体情况,比如:RAM资源、代码运行效率等。(临时变量还会有一个数据拷贝过程)所以,该如何分配堆栈,该用静态还是临时变量,需要综合考虑你项目的情况而定。

关键字: 静态局部 变量 项目

在C语言中,按照生命周期来分,变量只有两类:静态变量和动态变量。

关键字: C语言 变量

一、IO口数字输入/输出端口有下列特性:□ 每个输入/输出位都可以独立编程。□ 允许任意组合输入、输出。□ P1 和 P2 所有 8 个位都可以分别设置为中断。□ 可以独立操作输入和输出数据寄存器。□ 可以分别设置上拉或

关键字: io口 msp430f149 初始化

//时钟默认情况//FLL时钟FLL选择XT1//辅助时钟ACLK选择XT132768Hz//主系统时钟MCLK选择DCOCLKDIV1048576Hz//子系统时钟SMCLK选择DCOCLKDIV1048576Hz#i...

关键字: msp430f5438 初始化 xt1

/**  * 获得本次开机后使用的流量  */     public void getData() {         //PackageManager 包管理类         Package

关键字: Android 变量 流量

一些产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备。而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零。

关键字: STM32 初始化 变量 复位 非零方法

1、C8051f的UART0是异步、全双工串口。其波特率发生器规定由定时器1定时器提供。可配置为8位UART或9位UART(多机通讯第九位用于片选作用)。SYSCLK=24.5MHZ(我的板子采用内部晶振频率作为系统时钟...

关键字: c8051f300 uart0 初始化 串口发送

(1)初始值不是0的全局变量 在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到RAM的指定区域(编译过程中为全局变量分配的空间)。(2)未初始化的局部变量 实际的

关键字: 51单片机 keil 函数 变量 编译处理
关闭