C++——临时对象
2017-11-13 17:31
183 查看
class Test { int t; public: Test() { Test(0); } Test(int rec) { t = rec; } int getVal(); }; int Test::getVal() { return t; }
这个程序,比较简单,说一下产生问题的点,类有两个构造函数,一个无参的,一个含有一个int类型的构造函数,程序的本意是在无参构造函数中利用都有参数的构造函数去初始化类,运行之后,查看t的值,是一个随机值。程序的结果和我们的本意是不同的,造成这个结果的原因是临时对象。
当我们Test o定义一个对象时,会调用无参的初始化函数,所以会进而调用Test(0),这里手工调用了构造函数,手工调用构造函数的结果是产生了一个新的临时对象,它的作用域只在当前这一条语句当中,而且作用域也是当前语句。所以这个无参的构造函数调用结束后只是产生了一个临时对象,然后就进行了销毁。我们定义的o对象的成员变量并没有初始化或者赋值,所以这就是为什么结果是一个随机值。如果想按照上述想法可以写成如下形式。
class Test { int t; public: Test() { *this = Test(0); } Test(int rec) { t = rec; } int getVal(); }; int Test::getVal() { return t; }
这里我们把产生的临时对象赋值给了当前我们定义的对象。因为编译器默认提供了对象的重载赋值符号,所以会完成成员变量的浅拷贝。因为这里不涉及成员变量占用系统资源,所以浅拷贝是可以的。
但是在程序设计里,应该尽量避免临时对象的产生。编译器也会在不影响结果的调用下尽量少的产生临时对象。比如Test a = Test(0),语法来说应该是产生了一个临时对象然后调用拷贝构造函数初始化了a对象,但是编译器优化成了Test a(10),因为编译器这样做没有影响结果而且避免了临时对象。
相关文章推荐
- C++中临时对象及返回值优化
- C++中的临时对象
- C++中临时对象及返回值优化
- C++中临时对象及返回值优化
- C++中临时对象及返回值优化
- 小问题大思考之C++临时对象
- C++ 临时对象 笔记
- c++临时对象
- 聊聊C++临时对象的析构时间点------顺便再次提醒大家谨慎使用string的c_str方法
- C++对于表达式临时对象的处理
- c++临时对象创建的问题
- C++中的临时对象,对临时对象的引用,和临时对象的指针
- C++中的临时对象
- C++中的临时对象
- 从汇编看c++中临时对象的析构时机
- 不要返回c++临时对象的指针
- C++ 中临时对象的陷阱
- C++临时对象
- 深度探索c++对象模型之临时对象的探讨
- 关于c++临时对象几个链接