臨時變量
首先看一段代碼:
#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();
return 0;
}
這個時候可以想一想會輸出什么? mi的值是什么?
運行結果如下:
mi = 515686454
-
程序意圖:
- 在Test()中以0作為參數調用Test(int i)
- 將成員變量mi的初始值設置為0
-
運行結果:
- 成員變量mi的值為隨機值
-
答案:
- 直接調用構造函數將產生一個臨時對象
- 臨時對象的聲明周期只有一條語句的時間
- 臨時對象的作用于只在一條語句中
- 臨時對象是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;
}
小結:
- 直接調用構造函數將產生一個臨時對象
- 臨時對象是性能的瓶頸,也是bug的來源之一
- 現代c++編譯器會盡力避開臨時對象
- 實際工程開發中需要人為的避開臨時對象