c++中類的對(duì)象初始化的實(shí)現(xiàn)示例
在 C++ 中,類的對(duì)象初始化是創(chuàng)建對(duì)象時(shí)為其成員變量賦予初始值的過程,核心依賴構(gòu)造函數(shù)(類的特殊成員函數(shù))。根據(jù)場(chǎng)景和需求,對(duì)象初始化有多種方式,下面詳細(xì)介紹:
一、構(gòu)造函數(shù):初始化的核心
構(gòu)造函數(shù)是與類同名的特殊成員函數(shù),用于對(duì)象創(chuàng)建時(shí)的初始化,其特點(diǎn):
- 無返回值(無需寫
void); - 可重載(定義多個(gè)參數(shù)不同的構(gòu)造函數(shù));
- 若未手動(dòng)定義,編譯器會(huì)生成默認(rèn)構(gòu)造函數(shù)(無參,僅為成員變量執(zhí)行默認(rèn)初始化)。
二、對(duì)象初始化的具體方式
1. 默認(rèn)初始化(無參構(gòu)造函數(shù))
當(dāng)類有默認(rèn)構(gòu)造函數(shù)(無參構(gòu)造函數(shù))時(shí),可直接創(chuàng)建對(duì)象,無需傳遞參數(shù)。
默認(rèn)構(gòu)造函數(shù)的來源:
- 手動(dòng)定義:
類名(); - 編譯器自動(dòng)生成(僅當(dāng)未定義任何構(gòu)造函數(shù)時(shí))。
示例:
#include <iostream>
using namespace std;
class Person {
private:
string name;
int age;
public:
// 手動(dòng)定義默認(rèn)構(gòu)造函數(shù)
Person() {
name = "Unknown";
age = 0;
cout << "默認(rèn)構(gòu)造函數(shù)被調(diào)用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
// 默認(rèn)初始化(調(diào)用默認(rèn)構(gòu)造函數(shù))
Person p1; // 正確:無參構(gòu)造
p1.show(); // 輸出:Name: Unknown, Age: 0
return 0;
}
注意:若手動(dòng)定義了帶參構(gòu)造函數(shù),編譯器不再生成默認(rèn)構(gòu)造函數(shù),此時(shí)需顯式定義,否則Person p1;會(huì)報(bào)錯(cuò)。
2. 帶參數(shù)的構(gòu)造函數(shù)初始化
通過自定義帶參數(shù)的構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)傳遞參數(shù),直接初始化成員變量。
示例:
class Person {
private:
string name;
int age;
public:
// 帶參數(shù)的構(gòu)造函數(shù)
Person(string n, int a) {
name = n; // 為成員變量賦值
age = a;
cout << "帶參構(gòu)造函數(shù)被調(diào)用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
// 用帶參構(gòu)造函數(shù)初始化
Person p2("Alice", 18); // 直接傳遞參數(shù)
p2.show(); // 輸出:Name: Alice, Age: 18
return 0;
}
3. 成員初始化列表(推薦)
構(gòu)造函數(shù)的成員初始化列表用于在進(jìn)入構(gòu)造函數(shù)體之前,直接初始化成員變量(而非在函數(shù)體內(nèi)賦值)。
適用場(chǎng)景:
- 初始化
const成員變量(必須在定義時(shí)初始化); - 初始化引用成員(
&,必須在定義時(shí)初始化); - 初始化沒有默認(rèn)構(gòu)造函數(shù)的成員對(duì)象(如類的成員是另一個(gè)類的對(duì)象,且該類無默認(rèn)構(gòu)造)。
語法:
類名(參數(shù)列表) : 成員1(值1), 成員2(值2), ... {
// 構(gòu)造函數(shù)體(可空)
}
示例:
class Person {
private:
string name;
const int age; // const成員,必須初始化
int& id; // 引用成員,必須初始化
public:
// 成員初始化列表:直接初始化成員
Person(string n, int a, int& i) : name(n), age(a), id(i) {
// 構(gòu)造函數(shù)體可做其他操作,無需再給成員賦值
cout << "成員初始化列表被使用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << ", ID: " << id << endl;
}
};
int main() {
int num = 1001;
Person p3("Bob", 20, num); // 傳遞參數(shù)到初始化列表
p3.show(); // 輸出:Name: Bob, Age: 20, ID: 1001
return 0;
}
優(yōu)勢(shì):比在構(gòu)造函數(shù)體內(nèi)賦值更高效(直接初始化,而非先默認(rèn)構(gòu)造再賦值)。
4. 拷貝構(gòu)造函數(shù)初始化
用已存在的對(duì)象初始化新對(duì)象時(shí),會(huì)調(diào)用拷貝構(gòu)造函數(shù)。
拷貝構(gòu)造函數(shù)的語法(參數(shù)必須是同類對(duì)象的const引用):
類名(const 類名& 已有對(duì)象) {
// 用已有對(duì)象的成員初始化當(dāng)前對(duì)象的成員
}
調(diào)用場(chǎng)景:
- 用對(duì)象 A 初始化對(duì)象 B(
類名 B = A;或類名 B(A);); - 對(duì)象作為函數(shù)參數(shù)按值傳遞;
- 函數(shù)返回對(duì)象(按值返回)。
示例:
class Person {
private:
string name;
int age;
public:
// 帶參構(gòu)造函數(shù)
Person(string n, int a) : name(n), age(a) {}
// 拷貝構(gòu)造函數(shù)(自定義)
Person(const Person& other) {
name = other.name; // 拷貝other的name
age = other.age; // 拷貝other的age
cout << "拷貝構(gòu)造函數(shù)被調(diào)用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
Person p4("Charlie", 22); // 先創(chuàng)建p4
Person p5 = p4; // 用p4初始化p5(調(diào)用拷貝構(gòu)造)
Person p6(p4); // 另一種寫法(同樣調(diào)用拷貝構(gòu)造)
p5.show(); // 輸出:Name: Charlie, Age: 22
p6.show(); // 輸出:Name: Charlie, Age: 22
return 0;
}
注意:若未手動(dòng)定義拷貝構(gòu)造函數(shù),編譯器會(huì)生成默認(rèn)拷貝構(gòu)造函數(shù)(淺拷貝)。若類中包含指針成員,淺拷貝可能導(dǎo)致內(nèi)存問題(需手動(dòng)實(shí)現(xiàn)深拷貝)。
5. 列表初始化(C++11 及以上)
使用大括號(hào){} 初始化對(duì)象,支持多種場(chǎng)景,且更安全(防止窄化轉(zhuǎn)換,如int不能隱式接收double的小數(shù)部分)。
示例:
class Person {
private:
string name;
int age;
public:
// 帶參構(gòu)造函數(shù)(支持列表初始化)
Person(string n, int a) : name(n), age(a) {}
void show() { cout << name << ", " << age << endl; }
};
int main() {
// 列表初始化(調(diào)用帶參構(gòu)造)
Person p7{"David", 25}; // 等價(jià)于 Person p7("David", 25);
Person p8 = {"Eve", 26}; // 也支持等號(hào)+大括號(hào)
p7.show(); // David, 25
p8.show(); // Eve, 26
return 0;
}
優(yōu)勢(shì):
- 統(tǒng)一初始化語法(可用于內(nèi)置類型、數(shù)組、容器等);
- 防止窄化轉(zhuǎn)換(如
Person p{123.45, "abc"}會(huì)編譯報(bào)錯(cuò),因參數(shù)類型不匹配)。
6. 委托構(gòu)造函數(shù)(C++11 及以上)
允許一個(gè)構(gòu)造函數(shù)調(diào)用同一個(gè)類的另一個(gè)構(gòu)造函數(shù),減少代碼重復(fù)。
示例:
class Person {
private:
string name;
int age;
public:
// 核心構(gòu)造函數(shù)(帶參數(shù))
Person(string n, int a) : name(n), age(a) {
cout << "核心構(gòu)造函數(shù)被調(diào)用" << endl;
}
// 委托構(gòu)造:調(diào)用帶參構(gòu)造函數(shù)(默認(rèn)name為"Unknown",age為0)
Person() : Person("Unknown", 0) {
cout << "委托構(gòu)造函數(shù)(無參)被調(diào)用" << endl;
}
// 委托構(gòu)造:調(diào)用帶參構(gòu)造函數(shù)(僅指定age,name默認(rèn)"Guest")
Person(int a) : Person("Guest", a) {
cout << "委托構(gòu)造函數(shù)(僅age)被調(diào)用" << endl;
}
};
int main() {
Person p9; // 調(diào)用無參委托構(gòu)造 → 核心構(gòu)造
Person p10(30); // 調(diào)用單參委托構(gòu)造 → 核心構(gòu)造
return 0;
}
輸出:
核心構(gòu)造函數(shù)被調(diào)用
委托構(gòu)造函數(shù)(無參)被調(diào)用
核心構(gòu)造函數(shù)被調(diào)用
委托構(gòu)造函數(shù)(僅age)被調(diào)用
7. 聚合類的初始化
聚合類是一種特殊的類(或結(jié)構(gòu)體),滿足:
- 無用戶定義的構(gòu)造函數(shù);
- 無私有 / 保護(hù)的非靜態(tài)成員;
- 無基類;
- 無虛函數(shù)。
聚合類可直接用初始化列表初始化成員(按成員聲明順序)。
示例:
// 聚合類(結(jié)構(gòu)體,滿足聚合類條件)
struct Student {
string name; // 公有成員
int age;
float score;
};
int main() {
// 直接初始化聚合類的成員(按聲明順序)
Student s1 = {"Frank", 19, 90.5};
Student s2{"Grace", 20, 88.0}; // C++11列表初始化
cout << s1.name << ", " << s1.age << ", " << s1.score << endl; // Frank, 19, 90.5
return 0;
}
8. 動(dòng)態(tài)對(duì)象初始化(new關(guān)鍵字)
用new創(chuàng)建堆上的對(duì)象時(shí),需顯式調(diào)用構(gòu)造函數(shù)初始化,后續(xù)用delete釋放。
示例:
class Person {
private:
string name;
public:
Person(string n) : name(n) {}
void show() { cout << name << endl; }
};
int main() {
// 動(dòng)態(tài)初始化(堆上創(chuàng)建對(duì)象)
Person* p11 = new Person("Helen"); // 調(diào)用帶參構(gòu)造
Person* p12 = new Person{"Ivy"}; // C++11列表初始化
Person* p13 = new Person(); // 調(diào)用默認(rèn)構(gòu)造(若存在)
p11->show(); // Helen
p12->show(); // Ivy
// 釋放堆內(nèi)存
delete p11;
delete p12;
delete p13;
return 0;
}
三、初始化與賦值的區(qū)別
- 初始化:對(duì)象創(chuàng)建時(shí)賦予初始值(調(diào)用構(gòu)造函數(shù)或初始化列表),僅執(zhí)行一次;
- 賦值:對(duì)象創(chuàng)建后,通過賦值運(yùn)算符(
=)修改成員變量,可執(zhí)行多次。
對(duì)const成員、引用成員等,只能初始化,不能賦值。
總結(jié)
C++ 對(duì)象初始化方式多樣,核心是通過構(gòu)造函數(shù)實(shí)現(xiàn),根據(jù)場(chǎng)景選擇:
- 簡(jiǎn)單初始化:用默認(rèn)構(gòu)造或帶參構(gòu)造;
- 高效 / 特殊成員(
const、引用):用成員初始化列表; - 復(fù)用對(duì)象:用拷貝構(gòu)造;
- 簡(jiǎn)潔安全:用列表初始化(
{}); - 減少代碼重復(fù):用委托構(gòu)造。
到此這篇關(guān)于c++中類的對(duì)象初始化的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)c++ 類對(duì)象初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
c++ 類成員變量默認(rèn)初始值的實(shí)現(xiàn)
本文主要介紹了c++ 類成員變量默認(rèn)初始值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
C# CLR 中學(xué)習(xí) C++關(guān)鍵詞extern使用詳解
這篇文章主要為大家介紹了C# CLR 中學(xué)習(xí) C++ 之extern使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼
大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼,感興趣的同學(xué)趕快來看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛心實(shí)例代碼2021-12-12
Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例
這篇文章主要為大家介紹了Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下2014-07-07

