C++構(gòu)造函數(shù)的初始化列表詳解
1.問題
class A {
private:
int m_a;
public:
A(int a) {
cout << "A(int a)......." << endl;
m_a = a;
}
void print() {
cout <<"m_a=" << m_a << endl;
}
};
class B {
private:
int m_b;
A m_a1;
A m_a2;
public:
B(A& a1,A& a2, int b)
{
m_b = b;
m_a1(a1);//此處調(diào)用A的拷貝函數(shù)會報錯
m_a2(a2);//此處調(diào)用A的拷貝函數(shù)會報錯
}
};
錯誤:


2.解決方法(初始化列表)
將class B構(gòu)造函數(shù)改寫為:
public:
B(A& a1,A& a2, int b) :m_a1(a1),m_a2(a2)//構(gòu)造函數(shù)的初始化列表
{
m_b = b;
}
};
完整代碼如下:
#include <iostream>
using namespace std;
class A {
private:
int m_a;
public:
A(int a) {
cout << "A(int a)......." << endl;
m_a = a;
}
void print() {
cout <<"m_a=" << m_a << endl;
}
A(const A& another) {
m_a = another.m_a;
}
~A() {
cout << "~A()......" << endl;
}
};
class B {
private:
int m_b;
A m_a1;
A m_a2;
public:
B(A& a1,A& a2, int b) :m_a1(a1),m_a2(a2)//構(gòu)造函數(shù)的初始化列表,調(diào)用拷貝構(gòu)造
{
cout << "B(A& a1,A& a2, int b)......." << endl;
m_b = b;
}
~B() {
cout << "~B()......." << endl;
cout << "m_b=" << m_b << endl;
cout << "A m_a1" << endl;
m_a1.print();
cout << "A m_a2" << endl;
m_a2.print();
}
};
int main(int argc, char** argv) {
A a1(1), a2(2);
B b1(a1, a1, 3);
}
運行結(jié)果:

3.順序問題
構(gòu)造對象成員的順序跟初始化列表的順序無關(guān),而是跟成員對象定義的順序有關(guān)。(面試會問)
例子:
class A {
private:
int m_a;
public:
A(int a) {
cout << "A(int a)......." <<a<< endl;
m_a = a;
}
void print() {
cout <<"m_a=" << m_a << endl;
}
A(const A& another) {
m_a = another.m_a;
}
~A() {
cout << "~A()......"<< endl;
}
};
class B {
private:
int m_b;
A m_a2;
A m_a1;
public:
B(int a1, int a2, int b) :m_a1(a1), m_a2(a2)//調(diào)用有參構(gòu)造函數(shù)
{
cout << "B(int a1, int a2, int b)......." << endl;
m_b = b;
}
~B() {
cout << "~B()......." << endl;
}
};
int main(int argc, char** argv) {
B b2(1, 2, 3);
}
結(jié)果:

跟下面順序有關(guān):
private: A m_a2; A m_a1;
跟下面順序無關(guān):
B(int a1, int a2, int b) :m_a1(a1), m_a2(a2)//調(diào)用有參構(gòu)造函數(shù)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
簡述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制
這篇文章主要介紹了簡述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08
C/C++代碼操作MySQL數(shù)據(jù)庫詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于C/C++代碼操作MySQL數(shù)據(jù)庫的相關(guān)資料,通過文中的這些示例,我們可以連接到MySQL數(shù)據(jù)庫,并執(zhí)行常見的數(shù)據(jù)庫操作,如創(chuàng)建表、插入數(shù)據(jù)和查詢數(shù)據(jù),需要的朋友可以參考下2023-12-12
C++語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實例代碼
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04
C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法
這篇文章主要介紹了C++中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04

