Cpp 对象模型探索 / 成员初始化列表
目录
一、何时必须使用?
二、优势
三、细节探究
一、何时必须使用?
- 成员变量是 const 类型。
- 成员变量是引用。
- 基类中含有带形参的构造函数且不存在默认的构造函数。
- 成员变量是类对象,该对象含有带形参的构造函数且不存在默认的构造函数。
二、优势
#include <iostream>class X
{X(int value = 0) :m_i(value){printf("this = %p", this);std::cout << "X(int)构造函数被调用" << std::endl;}X(const X &tmpv){printf("this = %p", this);std::cout << "X 拷贝构造函数被调用" << std::endl;}X& operator=(const X &tmp){printf("this = %p", this);std::cout << "X 赋值运算符被调用" << std::endl;return *this;}~X(){printf("this = %p", this);std::cout << "X 析构函数被调用" << std::endl;}public:int m_i;
};class A
{
public:X xobj; A(){ xobj = 1000; }
};int main()
{A aobj;return 0;
}
结果
this = 00CFFA60X(int)构造函数被调用
this = 00CFF89CX(int)构造函数被调用
this = 00CFFA60X 赋值运算符被调用
this = 00CFF89CX 析构函数被调用
this = 00CFFA60X 析构函数被调用
从编译器角度分析上述结果的原由,如下:
class A
{
public:X xobj; A()// 从编译器角度分析,在初始化列表中,执行了如下代码。// X xobj; 此处仅仅是执行了申请 sizeof(X) 大小的内存块。// xobj.X::X(); 在上述内存块中执行构造函数。{ // 从编译器角度分析,此处的代码如下:// X xtmp; 此处仅仅是执行了申请 sizeof(X) 大小的内存块。// xtmp.X::X(); 在上述内存块中执行构造函数。// xobj.operator=(xtmp); 此处执行赋值构造函数。xobj = 1000; }
};
若将代码 xobj = 1000; 移入构造函数初始化列表中,则结果如下:
this = 00AFF82CX(int)构造函数被调用
this = 00AFF82CX 析构函数被调用
省略了创建临时变量和赋值的操作,即:在成员初始化列表中初始化变量,优势是提高程序运行效率。
三、细节探究
- 成员初始化列表中的代码可以看成编译器插入到构造函数体最前面的代码,即:最先被执行。
- 成员初始化列表中变量初始化顺序是变量在类中的定义顺序,而不是在初始化列表中排布的顺序。
栗子:
#include <iostream>
class A
{
public:A():k_(100),i_(k_){std::cout << "i_ = " << i_ << std::endl;std::cout << "k_ = " << k_ << std::endl;}
private:int i_;int k_;
};int main()
{A aobj;return 0;
}
结果
i_ = -858993460
k_ = 100
由此可知,上述的结论是正确的。
(SAW:Game Over!)
Cpp 对象模型探索 / 成员初始化列表相关推荐
- C++:用成员初始化列表对数据成员初始化
1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{private:double real;double imag;public:Comple ...
- C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point { private: int x,y; pu ...
- lt;转载自刘佳ID:freedom0203和waretgt; C++中成员初始化列表的使用
刘佳: C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point { private: int x,y ...
- C++ 语法之【成员初始化列表】
C++ 语法之[成员初始化列表] 类对象构造过程 定义[成员初始化列表] 必须使用[成员初始化列表]的情况 情况一:const类成员或者被声明为引用的类成员 情况二:初始化成员是对象(包含继承) 情况 ...
- C++成员初始化列表
C++类成员初始化列表 C++类型定义 C++构造函数的初始化列表定义 C++构造函数执行的两个阶段:初始化阶段和计算阶段 为什么使用初始化列表 C++里面哪些东西必须放在初始化列表里面 成员变量的初 ...
- C++ 类(构造函数的成员初始化列表)
文章概述 构造函数的成员初始化列表 构造函数的成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A {private:int a;public:A(int a){this-&g ...
- C++学习笔记:成员初始化列表【Cherno】
先带着几个问题来看文章: 为什么要有初始化列表.怎么写初始化列表,初始化列表的好处是什么: 1:为什么要有初始化列表: 很简单,为了提高效率和C++风格化,先说C++风格化,如果我们要在一个构造函数中 ...
- Cpp 对象模型探索 / 类普通成员函数的调用方式
C++设计时有一个要求,类普通成员函数的调用性能要和全局函数差不多.所以编译器在处理类的普通成员函数的宗旨是将其当作全局函数来处理. 为了达到上述目的,编译器会对类的普通成员函数进行如下操作: 在函数 ...
- Cpp 对象模型探索 / 对象访问成员变量的原理
一.栗子 1.源码 #include <iostream> #include <stdio.h>class Base { public:Base() { std::cout & ...
最新文章
- js调用html5cookie,CSS+JS+Cookie实现页脚固定广告展示
- 【项目管理】敏捷开发项目管理流程
- (chap9 基于HTTP的功能追加协议) HTTP瓶颈
- Python小知识 | 这些技能你不会?(三)
- 【view桌面虚拟化系列】1-vSphere搭建
- Java中间件:淘宝网系统高性能利器
- 量子通信入门相关书籍
- Spring Cloud 入门 之 Hystrix 篇(四)
- php 类名 属性6,php基础知识(类中属性和方法练习)--2018年9月6日14:01:15
- 前端开发如何独立解决跨域问题
- 无基础学python能干什么-呼市学Python语言能干什么
- shell脚本 把一个文件的内容全部转换为大写
- 中国各省级行政区对应MODIS区块号
- SR 学习记录----JUNOS为例
- 讯飞tts语音引擎_讯飞iFLYOS语音让家居产品更智能
- 君不密则失臣,臣不密则失身,机事不密则害成
- 百度大脑开放日走进厦门 全面解析AI如何赋能企业服务智能化
- kotlin之开发经验整理
- 自助建站工具 搭建出来的网站真的适合SEO吗?
- 产品logo的设计:图标与几何构成