c++拷贝构造和编译优化
2016-04-15 19:29
549 查看
#include <iostream> using namespace std; class MyClass { public: MyClass(); MyClass(int i); MyClass(const MyClass &c); ~MyClass(); //后面main中测试发现func1 和func2之后没有调用拷贝构造,应该是被优化了 MyClass func1(int i){ cout<<"func1"<<endl; return MyClass(0); } MyClass func2(int i){ MyClass a; cout<<"func2"<<endl; return a; } private: int m_i; }; MyClass::MyClass() { m_i = 0; cout << "MyClass()" << endl; } MyClass::MyClass(int i) { m_i = i; cout << "MyClass(int i)" << endl; } MyClass::MyClass(const MyClass &c) { m_i = c.m_i; cout << "MyClass(const MyClass &c)" << endl; } //这里调用了两次拷贝构造函数&c MyClass test(const MyClass c) { cout << "test" << endl; return c; } MyClass::~MyClass() { cout<<"~"<<endl; } int main() { MyClass c2; cout << "-------------------------------" << endl; MyClass c1=c2.func2(2); cout << "-------------------------------" << endl; MyClass c3=test(c2); cout << "-------------------------------" << endl; return 0; } //结果如下 MyClass() ------------------------------- func1 MyClass(int i) ------------------------------- MyClass() func2 ------------------------------- MyClass(const MyClass &c) test MyClass(const MyClass &c) ~ -------------------------------
扩展
将拷贝构造函数声明为explicit,则会阻止隐式拷贝构造函数的调用.隐式拷贝构造函数的调用主要发生在三个点:
1.一个对象作为函数参数,以值传递的方式传入函数体.
2.一个对象作为函数返回值,以值传递的方式从函数返回.
3.以AAA = xxx的方式创建对象AAA,xxx为与AAA为同类型的对象.
因而,将拷贝构造函数声明成explicit并不是良好的设计,一般只将有单个参数的constructor声明为explicit,而copy constructor不要声明为explicit.
参考http://www.cnblogs.com/dwdxdy/archive/2012/07/17/2595479.html
相关文章推荐
- c语言中的几种重要的编程语句
- C++中的类模板详细讲述
- C/C++求对数
- 单链表(C++实现)
- NLPIR汉语分词系统在VS中使用
- C++中以bool作返回值的函数的常见错误
- 命名规则
- 讨论关于C++当中的模板实现(上)
- 『C++ Primer学习笔记』Chapter 5
- 【c++】必须在类初始化列表中初始化的几种情况
- C++中一个计算程序运行时间的工具类
- opencv 3.1.0 访问像素值的三种方法(C++)
- oj--C++结构体之统计最高最低分
- C++和C语言的区别
- C++作业2-2
- 巩固C语言(番外篇)----二级指针
- 话说:学好C语言,走遍天下都不怕
- 华为机试正式版(西安c/c++/java),今天下午去机试的题目,新奇出炉了!
- Windows平台下GCC编程之从键盘输入10名学生的C语言成绩存入一维数组内,编写程序计算10名学生的最高分、平均分和及格人数
- C++笔记