C++类构造函数,拷贝构造函数,赋值函数,析构函数几点注意
2016-07-07 16:27
357 查看
一个空类时,编译器会默认生成构造函数,拷贝构造函数,赋值函数,析构函数
一个类如果重写拷贝构造函数,那么必须自定义一个构造函数。如下代码会编译出错:error C2512: “B”: 没有合适的默认构造函数可用
拷贝构造函数和赋值函数的正确写法(if(this != &b))
函数返回值是对象时,要考虑return语句的效率。
运行结果:
一个类如果重写拷贝构造函数,那么必须自定义一个构造函数。如下代码会编译出错:error C2512: “B”: 没有合适的默认构造函数可用
class B { public: B(const B &b) { } }; int main(void) { B b; getchar(); return 0; }修正为:
class B { public: B() {} B(const B &b) { } }; int main(void) { B b; getchar(); return 0; }
拷贝构造函数和赋值函数的正确写法(if(this != &b))
class B { public: B(int v) { m_value = v; } B(const B &b) { m_value = b.m_value; } B &operator =(const B &b) { if(this != &b) { m_value = b.m_value; } return *this; } private: int m_value; };
函数返回值是对象时,要考虑return语句的效率。
B createObj0(void) { return B(0); } B createObj1(void) { B b(0); return b; }createObj0创建一个临时对象并返回它,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的过程。createObj1则是先创建b对象,然后拷贝构造把b拷贝到外部存储单元中去,接着还会析构掉b对象。请对比下列两组代码及运行结果:
#include <stdio.h> int g_counter = 0; class B { public: B(void) { m_value = g_counter++; printf("B() m_value=%d\n", m_value); } ~B() { printf("~B() m_value=%d\n", m_value); } B(const B &a) { m_value = g_counter++; printf("B(const B &a) m_value=%d\n", m_value); } B &operator=(const B&a) { printf("B &operator=(const B&a)\n"); return *this; } private: int m_value; }; B createObj0(const B b) { B bb(b); return bb; } B createObj1(const B b) { return B(b); } int main(void) { B __b; B _b = createObj0(__b); return 0; }运行结果:
#include <stdio.h> int g_counter = 0; class B { public: B(void) { m_value = g_counter++; printf("B() m_value=%d\n", m_value); } ~B() { printf("~B() m_value=%d\n", m_value); } B(const B &a) { m_value = g_counter++; printf("B(const B &a) m_value=%d\n", m_value); } B &operator=(const B&a) { printf("B &operator=(const B&a)\n"); return *this; } private: int m_value; }; B createObj0(const B b) { B bb(b); return bb; } B createObj1(const B b) { return B(b); } int main(void) { B __b; B _b = createObj1(__b); return 0; }
运行结果:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解