C++中神秘的临时对象分析

tech2022-09-14  104

C++中神秘的临时对象

下面的程序输出什么?为什么?

#include <stdio.h> class Test { int mi; public: Test(int i) { mi = i; } Test() { Test(0); //临时对象 } void print() { printf("mi = %d\n", mi); } }; int main() { Test t; t.print(); //mi是个随机值 return 0; } 1、程序意图: ---在Test()中以0作为参数调用Test(int i) ---将成员变量mi的值初始化设置为零 2、运行结果 ---成员变量mi的值为随机值

结论

1、直接调用构造函数将产生一个临时对象 2、临时对象的生命周期只有一条语句的时间 3、临时对象的作用域只在一条语句中 4、临时对象是C++中值得警惕的灰色地带

解决方案一(避免临时对象)

#include <stdio.h> class Test { int mi; void init(int i) //添加一个成员函数 { mi = i; } public: Test(int i) { init(i); } Test() { init(0); } void print() { printf("mi = %d\n", mi); } }; int main() { Test t; t.print(); return 0; }

例题分析2

#include <stdio.h> class Test { int mi; public: Test(int i) { printf("Test(int i) : %d\n", i); mi = i; } Test(const Test& t) { printf("Test(const Test& t) : %d\n", t.mi); mi = t.mi; } Test() { printf("Test()\n"); mi = 0; } int print() { printf("mi = %d\n", mi); } ~Test() { printf("~Test()\n"); } }; Test func() { return Test(20); } int main() { Test t = Test(10); // 1、生成临时对象 2、用临时对象初始化t对象 ==> Test t = 10; Test tt = func(); // ==> Test tt = Test(20); ==> Test tt = 20; t.print(); tt.print(); return 0; }

小结2

1、直接调用构造函数将产生一个临时对象 2、临时对象是性能的瓶颈,也是bug的来源之一 3、现代C++编译器会尽力避开临时对象 4、实际工程开发中需要人为的避开临时对象
最新回复(0)