C++ 构造函数的初始化列表
生活随笔
收集整理的這篇文章主要介紹了
C++ 构造函数的初始化列表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(1)如果我們有一個類成員,它本身是一個類或者是一個結構,而且這個成員它只有一個帶參數的構造函數,沒有默認構造函數。這時要對這個類成員進行初始化,就必須調用這個類成員的帶參數的構造函數,如果沒有初始化列表,那么它將無法完成第一步,就會報錯。
#include <iostream>using namespace std;class A {private:int m_a;public:A(int a) {cout << "A()..." << endl;m_a = a;}~A() {cout << "A被析構了" << endl;}void printA() {cout << "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_a1(a1), m_a2(a2) { // 初始化列表cout << "B(A&, A&, int)....." << endl;m_b = b;}~B() {cout << "B被析構了" << endl;}void printB() {cout << "b = " << m_b << endl;m_a1.printA();m_a2.printA();} };int main(){A a1(10), a2(100);B b(a1, a2, 1);b.printB(); } #include <iostream>using namespace std;class A { public://顯示提供一個帶參數的構造函數A(int a) {m_a = a;cout << "a = " << m_a << "調用了構造函數" << endl;}~A(){cout << "a = " << m_a << "被析構了" << endl;}void printA(){cout << " a = " << m_a << endl;} private:int m_a; };class B { public:B(A& a1, A& a2, int b) : m_a1(a1), m_a2(a2) { // 初始化列表cout << "B(A&, A&, int)....." << endl;m_b = b;}B(int a1, int a2, int b) : m_a1(a1), m_a2(a2) {cout << "B(int, int, int)" << endl;m_b = b;}void printB() {cout << "b = " << m_b << endl;m_a1.printA();m_a2.printA();}~B() {cout << "b = " << m_b << " 調用了析構函數" << endl;}private:int m_b;A m_a2;A m_a1; };int main(void) {B b2(30, 40, 50);b2.printB();return 0; }注:
(2)當類成員中含有一個const對象時,或者是一個引用時,他們也必須要通過成員初始化列表進行初始化,因為這兩種對象要在聲明后馬上初始化,而在構造函數中,做的是對他們的賦值,這樣是不被允許的。初始化列表中的初始化順序,與聲明順序有關,與前后賦值順序無關。
#include <iostream>using namespace std;class A{public://顯示提供一個帶參數的構造函數A(int a){m_a = a;cout << "a = " << m_a << "調用了構造函數" << endl;}~A(){cout << "a = " << m_a << "被析構了" << endl;}void printA(){cout << " a = " << m_a << endl;}private:int m_a; };class B{public:B(int b) :a1(10), a2(100) { //在初始化B的時候通過初始化列表給內部對象a1 和a2 進行了初始化m_b = b;/*a1(10);a2(20);*/cout << "b = " << m_b << "調用了構造函數" << endl;}B(int aa1, int aa2, int b) : a1(aa1), a2(aa2), m_b(b) { //通過初始化列表不僅能夠初始化成員對象, 還可以初始化成員變量}void printB(){cout << "b = " << m_b << endl;a1.printA();a2.printA();}~B(){cout << "b = " << m_b << " 調用了析構函數" << endl;}private:int m_b;A a2;A a1; };//類內部的對象初始化的順序,跟對象的定義順序一樣,跟初始化列表中的順序無關 //析構的順序就跟構造的順序相反class ABC{public:ABC(int a, int b, int c, int m) :m_m(m) { // const常量只能在 初始化列表中 初始化cout << "ABC(int, int, int)" << endl;m_a = a;m_b = b;m_c = c;// const 常量不能在這里進行初始化操作}~ABC(){cout << "~ABC()" << endl;}void printABC(){cout << m_a << "," << m_b << "," << m_c << "," << endl;}private:int m_a;int m_b;int m_c;const int m_m; // 常量 };class ABCD{public:ABCD(int a, int b, int c, int d, int m) :m_abc(a, b, c, m), m_d(d) {//常量成員變量不能夠賦值,只能通過初始化列表進行初始化m_d = d;}ABCD(ABC&abc, int d) :m_abc(abc){m_d = d;}private:ABC m_abc;int m_d; };int main(void){B b(10, 20, 30);b.printB();ABC abc(10, 20, 30, 6);ABCD abcd(1, 2, 3, 4, 6);ABCD abcd1(abc, 40);}注:通過初始化列表不僅能夠初始化成員對象, 還可以初始化成員變量。
總結
以上是生活随笔為你收集整理的C++ 构造函数的初始化列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 深拷贝
- 下一篇: C++ 不能在构造函数中调用构造函数