【C/C++】成员变量的初始化顺序
变量的初始化顺序:
① 基类的静态变量或全局变量
②派生类的静态变量或全局变量
③基类的成员变量
④派生类的成员变量
注意:
①成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。
②如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
③类中const成员常量必须在构造函数初始化列表中初始化。
④类中static成员变量,必须在类外初始化。
(静态成员是类所有的对象的共享的成员,而不是某个对象的成员。它在对象中不占用存储空间,这个属性为整个类所共有,不属于任何一个具体对象。所以静态成员不能在类的内部初始化。)
看一个例子:
#include <iostream>
using namespace std;class A
{
public:A():n2(0),n1(n2 + 2){}//~A();void print(){cout << "n1:" << n1 << " , n2:" << n2 << endl;}private:int n1;int n2;};
我预测结果为:n1:2 , n2:0
然而运行结果为:
这是因为第①条提到的,成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存中次序有关,而内存中的排列顺序早在编译期就根据变量的定义次序决定了。
又如:
#include <iostream>
using namespace std;class A
{
public:A() {n2=0;n1=n2+2;}void print(){cout << "n1:" << n1 << " , n2:" << n2 << endl;}private:int n1;int n2;};
运行结果为:
这个结果说明,如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
【C/C++】成员变量的初始化顺序相关推荐
- C++成员变量的初始化顺序问题
C++成员变量的初始化顺序问题 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy print? class A { private: int n ...
- 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?
初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...
- C++静态类型成员变量的初始化顺序(单例模式)
对编译器来说,静态成员变量的初始化顺序和析构顺序是一个未定义的行为 #include <string> #include <iostream> using namespace ...
- C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: 1 class TestClass1 2 { 3 public: 4 TestClass1() { 5 cou ...
- java 成员变量的初始化_Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- 构造方法的调用顺序和成员变量的初始化时机以及动态绑定
构造方法的调用顺序:子类构造器中,JVM会自动的先调用父类的构造方法,然后再执行子类构造方法.在JVM自动调用父类构造方法的时候,会完成父类中拥有的成员变量的值的初始化操作,此时子类的成员变量并未初始 ...
- C++类中成员变量的初始化有两种方式
C++类中成员变量的初始化有两种方式: 构造函数初始化列表和构造函数体内赋值.下面看看两种方式有何不同. 成员变量初始化的顺序是按照在那种定义的顺序. 1.内部数据类型(char,int--指针等) ...
- Spring boot变量的初始化顺序
起因是Spring建议"总是在您的bean中使用构造函数建立依赖注入.总是使用断言强制依赖",而且之前用@Autowired时idea总是给警告,于是全部改成了构造器注入,运行时发 ...
- C++类中成员变量的初始化总结
C++类中成员变量的初始化总结 1. 普通的变量: 一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行. 1 class CA 2 { 3 p ...
最新文章
- 烂泥:虚拟化KVM安装与配置
- python 打包wheel文件,自己的SDK包
- 【内核驱动】 Linux内核源码查看方法(基于Vim)
- C++/C 宏定义(define)中# ## 的含义(转)
- 数据结构--直接插入排序
- cjson源代码解读 (一)介绍
- HCIE-Security Day30:IPSec:实验(五)配置基于路由的IPSec PN(采用预共享密钥认证)
- Flutter业务开发常用小技巧(样式布局篇)
- 电商兴桃,打造乡村振兴新样本
- Color---颜色对照表
- python用户管理系统
- java 大臣的旅费_蓝桥杯2013-java大臣的旅费
- ISO26262对软件开发的规定
- 2019年20个最佳产品信息管理(PIM)软件(一)
- crc16 java包_【Java】CRC16Utils(CRC-16 工具类)
- 在javascript中检查相等性的正确方法是什么
- Pytorch:全连接神经网络-MLP回归
- 计算机全国一级b考试试题,全国版计算机等级考试一级B考前冲刺试题
- 安卓 c语言宝典,C语言宝典app下载-C语言宝典下载v1.8.0-西西软件下载
- creator中对于shader的应用
热门文章
- Javascript屏蔽IE和Firefox浏览器默认按键响应(快捷键功能)
- keep dark about sth
- [swift] LeetCode 104. Maximum Depth of Binary Tree
- L1-055 谁是赢家-PAT团体程序设计天梯赛GPLT
- LeetCode 775. Global and Local Inversions
- matlab 钻石绘制,用MATLAB代码模拟大雕和钻石人单挑
- AIX 与Linux 中crontab 介绍
- linux 中用vi编辑器替换字符
- angulajs--入门基础
- Swift UIColor 添加从十六进制值初始化的扩展