c++中類(lèi)的對(duì)象初始化的實(shí)現(xiàn)示例
在 C++ 中,類(lèi)的對(duì)象初始化是創(chuàng)建對(duì)象時(shí)為其成員變量賦予初始值的過(guò)程,核心依賴(lài)構(gòu)造函數(shù)(類(lèi)的特殊成員函數(shù))。根據(jù)場(chǎng)景和需求,對(duì)象初始化有多種方式,下面詳細(xì)介紹:
一、構(gòu)造函數(shù):初始化的核心
構(gòu)造函數(shù)是與類(lèi)同名的特殊成員函數(shù),用于對(duì)象創(chuàng)建時(shí)的初始化,其特點(diǎn):
- 無(wú)返回值(無(wú)需寫(xiě)
void); - 可重載(定義多個(gè)參數(shù)不同的構(gòu)造函數(shù));
- 若未手動(dòng)定義,編譯器會(huì)生成默認(rèn)構(gòu)造函數(shù)(無(wú)參,僅為成員變量執(zhí)行默認(rèn)初始化)。
二、對(duì)象初始化的具體方式
1. 默認(rèn)初始化(無(wú)參構(gòu)造函數(shù))
當(dāng)類(lèi)有默認(rèn)構(gòu)造函數(shù)(無(wú)參構(gòu)造函數(shù))時(shí),可直接創(chuàng)建對(duì)象,無(wú)需傳遞參數(shù)。
默認(rèn)構(gòu)造函數(shù)的來(lái)源:
- 手動(dòng)定義:
類(lèi)名(); - 編譯器自動(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; // 正確:無(wú)參構(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ù)初始化
通過(guò)自定義帶參數(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í)初始化); - 初始化沒(méi)有默認(rèn)構(gòu)造函數(shù)的成員對(duì)象(如類(lèi)的成員是另一個(gè)類(lèi)的對(duì)象,且該類(lèi)無(wú)默認(rèn)構(gòu)造)。
語(yǔ)法:
類(lèi)名(參數(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ù)體可做其他操作,無(wú)需再給成員賦值
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ù)的語(yǔ)法(參數(shù)必須是同類(lèi)對(duì)象的const引用):
類(lèi)名(const 類(lèi)名& 已有對(duì)象) {
// 用已有對(duì)象的成員初始化當(dāng)前對(duì)象的成員
}
調(diào)用場(chǎng)景:
- 用對(duì)象 A 初始化對(duì)象 B(
類(lèi)名 B = A;或類(lèi)名 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); // 另一種寫(xiě)法(同樣調(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ù)(淺拷貝)。若類(lèi)中包含指針成員,淺拷貝可能導(dǎo)致內(nèi)存問(wèn)題(需手動(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)一初始化語(yǔ)法(可用于內(nèi)置類(lèi)型、數(shù)組、容器等);
- 防止窄化轉(zhuǎn)換(如
Person p{123.45, "abc"}會(huì)編譯報(bào)錯(cuò),因參數(shù)類(lèi)型不匹配)。
6. 委托構(gòu)造函數(shù)(C++11 及以上)
允許一個(gè)構(gòu)造函數(shù)調(diào)用同一個(gè)類(lèi)的另一個(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ù)(無(wú)參)被調(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)用無(wú)參委托構(gòu)造 → 核心構(gòu)造
Person p10(30); // 調(diào)用單參委托構(gòu)造 → 核心構(gòu)造
return 0;
}
輸出:
核心構(gòu)造函數(shù)被調(diào)用
委托構(gòu)造函數(shù)(無(wú)參)被調(diào)用
核心構(gòu)造函數(shù)被調(diào)用
委托構(gòu)造函數(shù)(僅age)被調(diào)用
7. 聚合類(lèi)的初始化
聚合類(lèi)是一種特殊的類(lèi)(或結(jié)構(gòu)體),滿(mǎn)足:
- 無(wú)用戶(hù)定義的構(gòu)造函數(shù);
- 無(wú)私有 / 保護(hù)的非靜態(tài)成員;
- 無(wú)基類(lèi);
- 無(wú)虛函數(shù)。
聚合類(lèi)可直接用初始化列表初始化成員(按成員聲明順序)。
示例:
// 聚合類(lèi)(結(jié)構(gòu)體,滿(mǎn)足聚合類(lèi)條件)
struct Student {
string name; // 公有成員
int age;
float score;
};
int main() {
// 直接初始化聚合類(lèi)的成員(按聲明順序)
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)建后,通過(guò)賦值運(yùn)算符(
=)修改成員變量,可執(zhí)行多次。
對(duì)const成員、引用成員等,只能初始化,不能賦值。
總結(jié)
C++ 對(duì)象初始化方式多樣,核心是通過(guò)構(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++中類(lèi)的對(duì)象初始化的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)c++ 類(lèi)對(duì)象初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
關(guān)于"引用"的幾點(diǎn)說(shuō)明介紹
引用聲明完畢后,相當(dāng)于目標(biāo)變量名有兩個(gè)名稱(chēng),即該目標(biāo)原名稱(chēng)和引用名,且不能再把該引用名作為其他變量名的別名2013-09-09
c++ 類(lèi)成員變量默認(rèn)初始值的實(shí)現(xiàn)
本文主要介紹了c++ 類(lèi)成員變量默認(rèn)初始值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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)的愛(ài)心實(shí)例代碼
大家好,本篇文章主要講的是使用用C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,歡迎借鑒學(xué)習(xí)C++做一顆會(huì)跳動(dòng)的愛(ài)心實(shí)例代碼2021-12-12
Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例
這篇文章主要為大家介紹了Java?C++題解?leetcode第k個(gè)數(shù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
C語(yǔ)言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言循環(huán)隊(duì)列的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下2014-07-07

