匿名物件
Prerequisites:
匿名物件,也就是沒有名字(變數名)的物件,建立後馬上銷毀,沒有生命周期。
語法
類別名()
建立匿名物件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
class Student {
public:
//建構子
Student() {
cout << "建構子" << endl;
}
//解構子
~Student() {
cout << "解構子" << endl;
}
};
int main() {
//建立匿名物件
Student();
return 0;
}
建構子
解構子
返回匿名物件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
class Student {
public:
//建構子
Student() {
cout << "建構子" << endl;
}
//解構子
~Student() {
cout << "解構子" << endl;
}
};
Student createStudent() {
return Student();
}
int main() {
createStudent();
return 0;
}
建構子
解構子
解構子
程式碼執行流程
- 呼叫 createStudent()
- 進入 createStudent(),執行 return Student();,此時產生一個臨時對象,執行 建構子。因為你已經關閉 RVO(Return Value Optimization),這個臨時物件無法被最佳化,因此會觸發額外的拷貝函式,拷貝完之後進行銷毀臨時物件。
- main() 中沒有其他 Student 物件,因此程式結束,銷毀createStudent()的返回拷貝函式產生的物件。
匿名物件指派給變數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
class Student {
public:
//建構子
Student() {
cout << "建構子" << endl;
}
//解構子
~Student() {
cout << "解構子" << endl;
}
};
int main() {
Student s1 = Student();
return 0;
}
建構子
解構子
解構子
程式碼執行流程
- 呼叫 createStudent()
- 進入 createStudent(),執行 return Student();,此時產生一個臨時對象,執行 建構子。因為你已經關閉 RVO(Return Value Optimization),這個臨時物件無法被最佳化,因此會觸發額外的拷貝函式,拷貝完之後進行銷毀臨時物件。
- 程式結束,銷毀s1物件。
匿名物件也是臨時物件
匿名物件是直接由程式碼直接生成。
1
2
3
4
5
int main() {
//由程式碼直接建立物件
Student();
return 0;
}
若函式返回的是匿名物件,編譯器自動管理其生命週期,就會變成臨時物件,所謂的臨時物件就是由編譯器生成。
通過函式傳回的物件(包含匿名物件或不是匿名物件),全是臨時物件。
initializer_list匿名物件
以下程式碼由initializer_list方式建立物件
{8, "cici"} 與 {3, "john"} 為匿名物件,因為他們沒有名字。
1
2
3
4
5
6
7
8
#include <map>
#include <string>
using namespace std;
int main() {
map<int, string> m;
m.insert({ {8, "cici"}, {3, "john"} });
return 0;
}