c++中類的對象初始化的實現(xiàn)示例
在 C++ 中,類的對象初始化是創(chuàng)建對象時為其成員變量賦予初始值的過程,核心依賴構造函數(shù)(類的特殊成員函數(shù))。根據(jù)場景和需求,對象初始化有多種方式,下面詳細介紹:
一、構造函數(shù):初始化的核心
構造函數(shù)是與類同名的特殊成員函數(shù),用于對象創(chuàng)建時的初始化,其特點:
- 無返回值(無需寫
void); - 可重載(定義多個參數(shù)不同的構造函數(shù));
- 若未手動定義,編譯器會生成默認構造函數(shù)(無參,僅為成員變量執(zhí)行默認初始化)。
二、對象初始化的具體方式
1. 默認初始化(無參構造函數(shù))
當類有默認構造函數(shù)(無參構造函數(shù))時,可直接創(chuàng)建對象,無需傳遞參數(shù)。
默認構造函數(shù)的來源:
- 手動定義:
類名(); - 編譯器自動生成(僅當未定義任何構造函數(shù)時)。
示例:
#include <iostream>
using namespace std;
class Person {
private:
string name;
int age;
public:
// 手動定義默認構造函數(shù)
Person() {
name = "Unknown";
age = 0;
cout << "默認構造函數(shù)被調用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
// 默認初始化(調用默認構造函數(shù))
Person p1; // 正確:無參構造
p1.show(); // 輸出:Name: Unknown, Age: 0
return 0;
}
注意:若手動定義了帶參構造函數(shù),編譯器不再生成默認構造函數(shù),此時需顯式定義,否則Person p1;會報錯。
2. 帶參數(shù)的構造函數(shù)初始化
通過自定義帶參數(shù)的構造函數(shù),在創(chuàng)建對象時傳遞參數(shù),直接初始化成員變量。
示例:
class Person {
private:
string name;
int age;
public:
// 帶參數(shù)的構造函數(shù)
Person(string n, int a) {
name = n; // 為成員變量賦值
age = a;
cout << "帶參構造函數(shù)被調用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
// 用帶參構造函數(shù)初始化
Person p2("Alice", 18); // 直接傳遞參數(shù)
p2.show(); // 輸出:Name: Alice, Age: 18
return 0;
}
3. 成員初始化列表(推薦)
構造函數(shù)的成員初始化列表用于在進入構造函數(shù)體之前,直接初始化成員變量(而非在函數(shù)體內賦值)。
適用場景:
- 初始化
const成員變量(必須在定義時初始化); - 初始化引用成員(
&,必須在定義時初始化); - 初始化沒有默認構造函數(shù)的成員對象(如類的成員是另一個類的對象,且該類無默認構造)。
語法:
類名(參數(shù)列表) : 成員1(值1), 成員2(值2), ... {
// 構造函數(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) {
// 構造函數(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ù)體內賦值更高效(直接初始化,而非先默認構造再賦值)。
4. 拷貝構造函數(shù)初始化
用已存在的對象初始化新對象時,會調用拷貝構造函數(shù)。
拷貝構造函數(shù)的語法(參數(shù)必須是同類對象的const引用):
類名(const 類名& 已有對象) {
// 用已有對象的成員初始化當前對象的成員
}
調用場景:
- 用對象 A 初始化對象 B(
類名 B = A;或類名 B(A);); - 對象作為函數(shù)參數(shù)按值傳遞;
- 函數(shù)返回對象(按值返回)。
示例:
class Person {
private:
string name;
int age;
public:
// 帶參構造函數(shù)
Person(string n, int a) : name(n), age(a) {}
// 拷貝構造函數(shù)(自定義)
Person(const Person& other) {
name = other.name; // 拷貝other的name
age = other.age; // 拷貝other的age
cout << "拷貝構造函數(shù)被調用" << endl;
}
void show() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
Person p4("Charlie", 22); // 先創(chuàng)建p4
Person p5 = p4; // 用p4初始化p5(調用拷貝構造)
Person p6(p4); // 另一種寫法(同樣調用拷貝構造)
p5.show(); // 輸出:Name: Charlie, Age: 22
p6.show(); // 輸出:Name: Charlie, Age: 22
return 0;
}
注意:若未手動定義拷貝構造函數(shù),編譯器會生成默認拷貝構造函數(shù)(淺拷貝)。若類中包含指針成員,淺拷貝可能導致內存問題(需手動實現(xiàn)深拷貝)。
5. 列表初始化(C++11 及以上)
使用大括號{} 初始化對象,支持多種場景,且更安全(防止窄化轉換,如int不能隱式接收double的小數(shù)部分)。
示例:
class Person {
private:
string name;
int age;
public:
// 帶參構造函數(shù)(支持列表初始化)
Person(string n, int a) : name(n), age(a) {}
void show() { cout << name << ", " << age << endl; }
};
int main() {
// 列表初始化(調用帶參構造)
Person p7{"David", 25}; // 等價于 Person p7("David", 25);
Person p8 = {"Eve", 26}; // 也支持等號+大括號
p7.show(); // David, 25
p8.show(); // Eve, 26
return 0;
}
優(yōu)勢:
- 統(tǒng)一初始化語法(可用于內置類型、數(shù)組、容器等);
- 防止窄化轉換(如
Person p{123.45, "abc"}會編譯報錯,因參數(shù)類型不匹配)。
6. 委托構造函數(shù)(C++11 及以上)
允許一個構造函數(shù)調用同一個類的另一個構造函數(shù),減少代碼重復。
示例:
class Person {
private:
string name;
int age;
public:
// 核心構造函數(shù)(帶參數(shù))
Person(string n, int a) : name(n), age(a) {
cout << "核心構造函數(shù)被調用" << endl;
}
// 委托構造:調用帶參構造函數(shù)(默認name為"Unknown",age為0)
Person() : Person("Unknown", 0) {
cout << "委托構造函數(shù)(無參)被調用" << endl;
}
// 委托構造:調用帶參構造函數(shù)(僅指定age,name默認"Guest")
Person(int a) : Person("Guest", a) {
cout << "委托構造函數(shù)(僅age)被調用" << endl;
}
};
int main() {
Person p9; // 調用無參委托構造 → 核心構造
Person p10(30); // 調用單參委托構造 → 核心構造
return 0;
}
輸出:
核心構造函數(shù)被調用
委托構造函數(shù)(無參)被調用
核心構造函數(shù)被調用
委托構造函數(shù)(僅age)被調用
7. 聚合類的初始化
聚合類是一種特殊的類(或結構體),滿足:
- 無用戶定義的構造函數(shù);
- 無私有 / 保護的非靜態(tài)成員;
- 無基類;
- 無虛函數(shù)。
聚合類可直接用初始化列表初始化成員(按成員聲明順序)。
示例:
// 聚合類(結構體,滿足聚合類條件)
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. 動態(tài)對象初始化(new關鍵字)
用new創(chuàng)建堆上的對象時,需顯式調用構造函數(shù)初始化,后續(xù)用delete釋放。
示例:
class Person {
private:
string name;
public:
Person(string n) : name(n) {}
void show() { cout << name << endl; }
};
int main() {
// 動態(tài)初始化(堆上創(chuàng)建對象)
Person* p11 = new Person("Helen"); // 調用帶參構造
Person* p12 = new Person{"Ivy"}; // C++11列表初始化
Person* p13 = new Person(); // 調用默認構造(若存在)
p11->show(); // Helen
p12->show(); // Ivy
// 釋放堆內存
delete p11;
delete p12;
delete p13;
return 0;
}
三、初始化與賦值的區(qū)別
- 初始化:對象創(chuàng)建時賦予初始值(調用構造函數(shù)或初始化列表),僅執(zhí)行一次;
- 賦值:對象創(chuàng)建后,通過賦值運算符(
=)修改成員變量,可執(zhí)行多次。
對const成員、引用成員等,只能初始化,不能賦值。
總結
C++ 對象初始化方式多樣,核心是通過構造函數(shù)實現(xiàn),根據(jù)場景選擇:
- 簡單初始化:用默認構造或帶參構造;
- 高效 / 特殊成員(
const、引用):用成員初始化列表; - 復用對象:用拷貝構造;
- 簡潔安全:用列表初始化(
{}); - 減少代碼重復:用委托構造。
到此這篇關于c++中類的對象初始化的實現(xiàn)示例的文章就介紹到這了,更多相關c++ 類對象初始化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(6.字型轉換字符串)
這篇文章主要介紹了C++實現(xiàn)LeetCode(6.字型轉換字符串),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-07-07
C語言數(shù)據(jù)類型枚舉enum全面詳解示例教程
生活中有很多地方會用到枚舉,比如一周有7天,可以一一枚舉;性別有男、女...等等都可以可以一一枚舉,今天來和筆者一起學習一下c語言枚舉吧2021-10-10
基于OpenCV實現(xiàn)車道線檢測(自動駕駛 機器視覺)
無人駕駛技術是機器學習為主的一門前沿領域,在無人駕駛領域中機器學習的各種算法隨處可見,本文將為大家介紹無人駕駛技術中的車道線檢測,感興趣的小伙伴可以了解一下2021-11-11

