網(wǎng)站的后端怎么開發(fā)編程培訓(xùn)
文章目錄
- 一、匿名對象 生命周期
- 1、匿名對象 生命周期 說明
- 2、代碼示例 - 匿名對象 生命周期
- 二、構(gòu)造函數(shù) 中調(diào)用 構(gòu)造函數(shù)
- 1、構(gòu)造函數(shù) 中 不能調(diào)用 構(gòu)造函數(shù)
- 2、代碼示例 - 構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)
構(gòu)造函數(shù)初始化列表 總結(jié) :
- 初始化列表 可以 為 類的 成員變量 提供初始值 ;
- 初始化列表 可以 調(diào)用 類的 成員變量 類型的 構(gòu)造函數(shù) 進(jìn)行成員變量初始化操作 ;
- 初始化列表 可以 使用 構(gòu)造函數(shù) 中傳入的 參數(shù) ;
- 類初始化時(shí) , 根據(jù)定義順序 , 先調(diào)用 成員變量的 構(gòu)造函數(shù) , 然后調(diào)用外部類構(gòu)造函數(shù) , 析構(gòu)函數(shù)正好相反 ;
- 實(shí)例對象 的 const 成員變量 必須只能在 初始化列表 中進(jìn)行 初始化 , 所有的構(gòu)造函數(shù)都要進(jìn)行初始化操作 ;
- 構(gòu)造函數(shù) 中 不能調(diào)用 構(gòu)造函數(shù) ;
一、匿名對象 生命周期
1、匿名對象 生命周期 說明
調(diào)用 類名(構(gòu)造函數(shù)參數(shù))
創(chuàng)建的是 匿名對象 ;
匿名對象 的 生命周期 僅限于 該 匿名對象 所在的 代碼表達(dá)式 ,
一旦 該行代碼執(zhí)行完畢 , 匿名對象就會被銷毀 ;
匿名對象 的 生命周期 僅限于 那一行代碼 中 ;
匿名對象 生命周期 分以下幾種情況 :
- 單獨(dú)創(chuàng)建 匿名對象 , 不使用變量 接收該 匿名對象 , 匿名對象 的生命周期 僅限于 創(chuàng)建匿名對象 的那一行代碼表達(dá)式 , 一旦該行代碼執(zhí)行完畢 , 匿名對象 就會被銷毀 ;
- 如果 匿名對象 被用于 對象初始化 , 匿名對象 不會被銷毀 , 而是被轉(zhuǎn)為 普通對象 , 賦值給變量 ;
- 如果 匿名對象 被用于 為現(xiàn)存對象賦值 , 會將 匿名對象 的值賦值給 現(xiàn)有對象 , 賦值完畢后 , 匿名對象仍在本行代碼執(zhí)行結(jié)束后銷毀 ;
2、代碼示例 - 匿名對象 生命周期
下面的代碼中 , 在 fun 函數(shù)中 , 調(diào)用 Student(18, 180) 代碼 , 創(chuàng)建 Student 類型的匿名對象 , 匿名對象的生命周期 只存在于 這一行代碼 , 該行代碼執(zhí)行完畢后 , 匿名對象 就會被 析構(gòu) ;
void fun()
{cout << "創(chuàng)建匿名對象之前" << endl;// 創(chuàng)建 Student 類型的匿名對象// 匿名對象的生命周期 只存在于 這一句話Student(18, 180);cout << "創(chuàng)建匿名對象之后" << endl;
}
代碼示例 :
#include "iostream"
using namespace std;class Student
{
public:// 帶參構(gòu)造函數(shù)Student(int age, int height){m_age = age;m_height = height;cout << "執(zhí)行 Student 的構(gòu)造函數(shù)" << endl;}~Student(){cout << "執(zhí)行 Student 的析構(gòu)函數(shù)" << endl;}public:int m_age; // 年齡int m_height; // 身高
};void fun()
{cout << "創(chuàng)建匿名對象之前" << endl;// 創(chuàng)建 Student 類型的匿名對象// 匿名對象的生命周期 只存在于 這一句話Student(18, 180);cout << "創(chuàng)建匿名對象之后" << endl;
}int main()
{// 該函數(shù)中定義了一個(gè)匿名對象fun();// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行system("pause");return 0;
}
執(zhí)行結(jié)果 :
創(chuàng)建匿名對象之前
執(zhí)行 Student 的構(gòu)造函數(shù)
執(zhí)行 Student 的析構(gòu)函數(shù)
創(chuàng)建匿名對象之后
Press any key to continue . . .
二、構(gòu)造函數(shù) 中調(diào)用 構(gòu)造函數(shù)
1、構(gòu)造函數(shù) 中 不能調(diào)用 構(gòu)造函數(shù)
構(gòu)造函數(shù)中 調(diào)用 構(gòu)造函數(shù) 是危險(xiǎn)行為 ;
構(gòu)造函數(shù) 中調(diào)用 構(gòu)造函數(shù) , 并不會為本對象進(jìn)行初始化操作 ;
構(gòu)造函數(shù) 的調(diào)用方式 , 天然就會創(chuàng)建一個(gè) 匿名對象 ,
如果 沒有變量 接收 這個(gè) 匿名對象 , 該匿名對象 在 本行表達(dá)式執(zhí)行完畢后 , 就會被銷毀 ;
2、代碼示例 - 構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)
下面的代碼中 ,
先定義 有參構(gòu)造函數(shù) ,
// 帶參構(gòu)造函數(shù)Student(int age, int height){m_age = age;m_height = height;cout << "執(zhí)行 Student 的構(gòu)造函數(shù)" << endl;}
然后 , 在無參的 構(gòu)造函數(shù)中 , 調(diào)用 有參構(gòu)造函數(shù) ;
// 構(gòu)造函數(shù)中 調(diào)用 構(gòu)造函數(shù) 是危險(xiǎn)行為Student(){// 構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)// 此時(shí) 創(chuàng)建 的是匿名對象// 如果 匿名對象 沒有被接收 // 就會在 本代碼 執(zhí)行結(jié)束后 立刻銷毀Student(18, 180);}
Student(18, 180) 調(diào)用方式 , 會創(chuàng)建一個(gè) 匿名對象 ;
如果 匿名對象 沒有被接收 , 就會在 本代碼 執(zhí)行結(jié)束后 立刻銷毀 ;
本實(shí)例對象 的成員變量實(shí)際上沒有進(jìn)行初始化 , 當(dāng)前為隨機(jī)值 ;
這也是 打印 對象成員變量 的值為隨機(jī)值 的原因 ;
s.m_age = -858993460 , s.m_height = -858993460
代碼示例 :
#include "iostream"
using namespace std;class Student
{
public:// 帶參構(gòu)造函數(shù)Student(int age, int height){m_age = age;m_height = height;cout << "執(zhí)行 Student 的構(gòu)造函數(shù)" << endl;}// 構(gòu)造函數(shù)中 調(diào)用 構(gòu)造函數(shù) 是危險(xiǎn)行為Student(){// 構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù)// 此時(shí) 創(chuàng)建 的是匿名對象// 如果 匿名對象 沒有被接收 // 就會 本代碼 執(zhí)行結(jié)束后 立刻銷毀Student(18, 180);}~Student(){cout << "執(zhí)行 Student 的析構(gòu)函數(shù)" << endl;}public:int m_age; // 年齡int m_height; // 身高
};void fun()
{// 創(chuàng)建 Student 類型的匿名對象// 匿名對象的生命周期 只存在于 這一句話Student(18, 180);
}int main()
{// 該函數(shù)中定義了一個(gè)匿名對象//fun();Student s;cout << "s.m_age = " << s.m_age << " , s.m_height = " << s.m_height << endl;// 控制臺暫停 , 按任意鍵繼續(xù)向后執(zhí)行system("pause");return 0;
}
執(zhí)行結(jié)果 :
執(zhí)行 Student 的構(gòu)造函數(shù)
執(zhí)行 Student 的析構(gòu)函數(shù)
s.m_age = -858993460 , s.m_height = -858993460
Press any key to continue . . .