😁博客主頁😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客內容🤑:🍭嵌入式開發、Linux、C語言、C++、數據結構、音視頻🍭
?發布時間?:2024-06-06 09:02:26
本文未經允許,不得轉發!!!
目錄
- 🎄一、為什么需要構造函數
- 🎄二、什么是構造函數
- 🎄三、使用構造函數
- 🎄四、默認構造函數
- 🎄五、成員初始化列表
- 🎄六、總結
🎄一、為什么需要構造函數
C++的目標之一是讓使用類對象就像使用標準類型一樣。如果沒有構造函數,就無法創建對象并初始化。下面代碼演示了CDate
類對象初始化時會報錯。
int year = 2001; // 有效初始化struct thing
{char * pn;int m;
};
thing amabob = {"wodget", -23}; // 有效初始化class CDate
{int year;int mon;int day;
};
CDate date = {2024, 06, 05}; // 編譯報錯
這里CDate
類對象初始化出錯的原因是,數據部分是私有的,只能通過類成員函數去訪問,如果將數據設置為公有會違背“數據隱藏”的思想。所以,我們需要一個成員函數,能夠在創建對象時初始化數據部分。C++提供了這樣的函數——構造函數。
🎄二、什么是構造函數
構造函數:專門用于構造新對象、 將值賦給它們的數據成員。
構造函數的函數名
和類名
相同,沒有返回值類型,會在創建對象時自動調用一次,目的是初始化對象。
下面看看怎樣聲明和定義構造函數? 以 CDate
類為例,代碼如下:
class CDate
{
public:CDate(int year, int mon, int day); // 構造函數聲明
private:int m_year;int m_mon;int m_day;
};// 構造函數定義
CDate::CDate(int year, int mon, int day)
{m_year = year;m_mon = mon;m_day = day;
}
在編寫類成員函數時,需要注意,參數名
不能和類成員名
相同,否則最終代碼會寫出year=year
,為了避免這種情況,常見的做法是在數據成員前加m_
前綴表示其為類成員。
🎄三、使用構造函數
C++提供了兩種使用構造函數來初始化對象的方式。
- 1、顯式地調用構造函數:
CDate date = CDate(2024,6,5);
- 2、隱式地調用構造函數:
CDate date(2024,6,5); // 這種形式更緊湊
每次創建類對象(甚至使用 new 動態分配內存)時,C++都自動調用類構造函數。下面是將構造函數與 new
一起使用的方法,這種情況下,對象沒有名稱,但可以使用指針來管理該對象:
CDate *pDate = new CDate(2024,6,5);
另外,如果編譯器支持C++11,則支持下面三種寫法:
CDate date = {2024,6,5}; // C++11
CDate date{2024,6,5};
CDate *pDate = new CDate{2024,6,5};
注意:無法使用對象來調用構造函數,因為在構造函數構造出對象之前,對象是不存在的。因此構造函數被用來創建對象,而不能通過對象來調用。
結合上個小節,下面代碼演示了怎么聲明、定義、使用構造函數:
// g++ 09_Construct_Date.cpp
#include <iostream>using namespace std;class CDate
{
public:CDate(int year, int mon, int day); // 構造函數聲明void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << endl;}private:int m_year;int m_mon;int m_day;
};// 構造函數定義
CDate::CDate(int year, int mon, int day)
{m_year = year;m_mon = mon;m_day = day;
}int main()
{CDate date = CDate(2024,6,5);date.show();CDate date1(2024,6,6);date1.show();CDate *pDate = new CDate(2024,6,7);pDate->show();return 0;
}
運行結果:
🎄四、默認構造函數
首先要清楚一點,構造函數可以存在多個,并且形成重載的關系,編譯器會根據參數自動選擇調用那個構造函數。我們可以改一下上面代碼的類如下,多了兩個重載的構造函數:
class CDate
{
public:CDate(int year, int mon, int day); // 構造函數聲明CDate(int year, int mon); // 構造函數聲明CDate(); // 構造函數聲明void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << endl;}private:int m_year;int m_mon;int m_day;
};
默認構造函數:如果類沒有提供任何的構造函數,則編譯器會自動提供一個默認構造函數,它沒有參數,也不做任何工作。
CDate 類的默認構造函數可能如下:
CDate::CDate(){
}
在未提供顯式初始值去創建對象時會調用默認構造函數,如下:
CDate date; // 未顯示提供初始值,會調用默認構造函數
注意:如果類提供了構造函數,則編譯器就不會在提供默認構造函數。如果該類需要使用默認構造函數,則需要程序員在類中為其提供默認構造函數,或者將其中一個構造函數的參數都給默認值。
在設計類時, 通常應提供對所有類成員做隱式初始化的默認構造函數。
上個小節代碼中,我們為 CDate 類只提供了一個帶有構造函數,所以,如果程序中使用 CDate date;
則會報錯:error: no matching function for call to ‘CDate::CDate()’,下面我們修改一下,為其提供一個默認構造函數:
// g++ 09_Construct_Date.cpp
#include <iostream>using namespace std;class CDate
{
public:CDate(int year, int mon, int day); // 構造函數聲明CDate(){} // 默認構造函數void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << endl;}private:int m_year;int m_mon;int m_day;
};// 構造函數定義
CDate::CDate(int year, int mon, int day)
{m_year = year;m_mon = mon;m_day = day;
}int main()
{CDate date = CDate(2024,6,5);date.show();CDate date1(2024,6,6);date1.show();CDate *pDate = new CDate(2024,6,7);pDate->show();CDate date_default;date_default.show();return 0;
}
運行結果如下:date_default 對象的值是亂碼,因為我們的提供的默認構造沒做任何東西,正常編寫代碼時會做一些初始化動作。
🎄五、成員初始化列表
在C++中,const修飾的變量必須初始化,引用也必須初始化。如果一個類存在const成員或引用成員,則上面的構造函數無法對這兩類成員進行初始化。C++為構造函數提供了 成員初始化列表
來解決這類問題。
成員初始化列表:成員初始化列表由逗號分隔的初始化列表組成(前面帶冒號)。它位于構造函數參數列表的右括號之后、函數體左括號之前。
CDate 類的 成員初始化列表 可以寫成下面代碼:
CDate():m_year(2024), m_mon(1), m_day(1)
{}
注意:成員初始化列表 只能在構造函數中使用。一旦類中出現const成員
或引用成員
,則編譯器會要求每個構造函數都去初始化這兩類成員,且必須使用 成員初始化列表。
下面對上個小節的代碼修改一下,在 CDate 類中聲明一個 const 變量,代碼如下:
// g++ 09_Construct_Date.cpp
#include <iostream>using namespace std;class CDate
{
public:CDate(int year, int mon, int day); // 構造函數聲明//CDate(){} // 默認構造函數CDate():Month(12) // 默認構造函數{//Month = 12; // 報錯:assignment of read-only member ‘CDate::Month’m_year = 2024;m_mon = 1;m_day = 1;}void show(){cout << "Date: " << m_year << "." << m_mon << "." << m_day << endl;}private:int m_year;int m_mon;int m_day;const int Month;
};// 構造函數定義
CDate::CDate(int year, int mon, int day):Month(12)
{m_year = year;m_mon = mon;m_day = day;
}int main()
{CDate date = CDate(2024,6,5);date.show();CDate date1(2024,6,6);date1.show();CDate *pDate = new CDate(2024,6,7);pDate->show();CDate date_default;date_default.show();return 0;
}
🎄六、總結
👉本文詳細介紹了C++中的構造函數,怎樣聲明、定義、使用構造函數,默認構造函數,構造函數的成員初始化列表。
如果文章有幫助的話,點贊👍、收藏?,支持一波,謝謝 😁😁😁
參考:
《C++ Primer Plus》