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