c++ 初始化列表和构造函数初始化区别
先上代码
#include <iostream> class MyContruct
{
public:
MyContruct()
{
std::cout << "MyContruct() is called" << std::endl;
}
MyContruct(const MyContruct&)
{
std::cout << "MyContruct(const MyContruct&) is called" << std::endl;
}
MyContruct& operator=(const MyContruct&)
{
std::cout << "MyContruct& operator=(const MyContruct&) is called" << std::endl;
return *this;
}
~MyContruct()
{
std::cout << "~MyContruct() is called" << std::endl;
}
}; class Mytest
{
public:
Mytest(MyContruct mc) :m_pMc(mc)
{
std::cout << "Mytest(MyContruct mc) is called" << std::endl;
/*m_pMc = mc;*/
}
~Mytest()
{
std::cout << "~Mytest() is called" << std::endl;
}
private:
MyContruct m_pMc;
}; int main()
{
MyContruct mc;
std::cout << std::endl;
Mytest mt(mc);
std::cout << std::endl;
return 0;
}
当用初始化列表时,输出如下:

当不用初始化列表时:

总结:当不用初始化列表进行初始化时,先调用默认构造函数构造了类成员,然后再调用赋值运算符对之前默认构造的类成员进行赋值,这实际上进行了两步操作。
当用初始化列表了,程序直接调用了拷贝构造函数,只需要一步操作。
c++ 初始化列表和构造函数初始化区别的更多相关文章
- C++构造函数初始化列表与构造函数中的赋值的区别
C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值. 一.内部数据类型(char,int……指针等) class Animal { public: Animal(int wei ...
- C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: class TestClass1 { public: TestClass1() { cout << ...
- 从初始化列表和构造函数谈C++的初始化机制
来源:http://blog.csdn.net/theprinceofelf/article/details/20057359 前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头 ...
- C++基础 (3) 第三天 构造函数 构造函数初始化列表 拷贝构造函数 析构函数 静态成员变量
// 同类之间无私处 2构造函数 3析构函数 4构造函数的种类和析构函数的顺序 结论:析构函数的调用顺序,跟对象的构造顺序相反,谁先构造,谁最后一个被析构. 拷贝构造函数: 注意: 等号写在下面和写在 ...
- 【c++】构造函数初始化列表中成员初始化的次序性
上代码 #include <iostream> using namespace std; class A { public: A(int v): j(v + 2), i(j) {} voi ...
- [转]C++ 初始化列表的初始化顺序
构造函数初始化列表仅用于初始化成员的值,并不指定这些初始化执行的次序.成员被初始化的次序就是定义成员的次序.第一个被定义的成员先被初始化,依次类推.一般,初始化的顺序无关紧要,然而,如果一个成员是根据 ...
- c++利用初始化列表在类内部和类外部定义构造函数的区别
case 1:在类外定义构造函数,所有data member都在初始化列表中进行初始化. class SupportClass { public: SupportClass() { cout < ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
- C++构造函数初始化列表与赋值
C++中类的初始化操作一般有四个部分组成: 1.构造函数初始化列表 2.构造函数体内赋值 3.类外部初始化 4.类声明时直接赋值 对于内部数据类型(char,int,float...),构造函数初始化 ...
随机推荐
- python打印图形
i = 0 while i < 5: # print('*****') 效果与下行相同 print('*'*5) i+=1 print('\n\n') i = 1 while i < 6: ...
- Spring学习记录2——简单了解Spring容器工作机制
简单的了解Spring容器内部工作机制 Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Sp ...
- 【LC_Lesson4】---罗马数字到整数得转换
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如, 罗马数字 2 写做 II ,即为两个并列 ...
- 关于Hive中case when不准使用子查询的解决方法
在公司用Hive实现个规则的时候,遇到了要查询某个字段是否在另一张表中,大概情况就是 A表: id value1 value2 1 100 0 2 101 1 3 102 1 B表: value1 1 ...
- MySQL 相关规约(v1.0) (转)
0)前言 a. 基本规约 [强制]表存储引擎必须使用InnoDB(针对主库一般是强制要求的) [强制]表字符集默认使用utf8,必要时候使用utf8mb4(个人踩坑:emoji表情存储问题)•说明:• ...
- 进击.net 三大框架
spring mybatis NHibernate
- Frameworks.Entity.Core 4
Project.Core\Frameworks.Entity.Core\Commons\ 1 AutoMapperExtension.cs AutoMapper扩展方法 2枚举类型扩展方法EnumEx ...
- (初学JS)JS基础——ATM机终端程序编写<1.0>
初步学习了JS基础,为了更好地将所学知识熟练运用,我进行了银行ATM存取款机的模拟程序编写,主要通过VScode终端实现系列操作. 我的ATM程序包括6个主要功能:1.查询余额 2.存钱 3. 取钱 ...
- Image Retargeting - 图像缩略图 图像重定向
Image Retargeting 图像缩略图.图像重定向 前言 这篇文章主要对比DL出现之前的几种上古算法,为了作为DL方法的引子而存在,顺便博客也该更新点新内容上来了,这篇博文就是介绍了我最近在玩 ...
- PyCharm安装和使用教程(Windows系统)
说明: PyCharm 是一款功能强大的 Python 编辑器, 本文简单的介绍下PyCharm 在 Windows下是如何安装的. PyCharm 的下载地址:http://www.jetbrain ...