C++学习——类的初始化
生活随笔
收集整理的這篇文章主要介紹了
C++学习——类的初始化
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1.類通過構(gòu)造函數(shù)進行數(shù)據(jù)成員初始化
- 2.類成員初始化方式?
- 3.什么情況下必須使用列表初始化?
- 4.為什么用列表初始化成員變量會快一些?
- 5.派生類構(gòu)造函數(shù)的執(zhí)行順序
1.類通過構(gòu)造函數(shù)進行數(shù)據(jù)成員初始化
一般來說,類中的數(shù)據(jù)成員是私有的,不能通過對象共有訪問的方式對數(shù)據(jù)成員賦初始值。一般來說,構(gòu)造函數(shù)就是用來用來在創(chuàng)建對象時初始化對象, 為對象數(shù)據(jù)成員賦初始值。
構(gòu)造函數(shù)是類的一種特殊成員函數(shù),不需要人為調(diào)用,而是在建立對象時自動被執(zhí)行。
2.類成員初始化方式?
賦值初始化,通過在函數(shù)體內(nèi)進行賦值初始化; 列表初始化,在冒號后使用初始化列表進行初始化。 這兩種方式的主要區(qū)別在于:對于在函數(shù)體中初始化,是在所有的數(shù)據(jù)成員被分配內(nèi)存空間后才進行的。列表初始化是給數(shù)據(jù)成員分配內(nèi)存空間時就進行初始化, 就是說分配一個數(shù)據(jù)成員只要冒號后有此數(shù)據(jù)成員的賦值表達式(此表達式必須是括號賦值表達式), 那么分配了內(nèi)存空間后在進入函數(shù)體之前給數(shù)據(jù)成員賦值, 就是說初始化這個數(shù)據(jù)成員此時函數(shù)體還未執(zhí)行。列表初始化:
#include<iostream> using namespace std;class solution { public:solution(int value1,int value2):a(value1),b(value2){}//列表初始化void print() {cout << "a=" << a << " " << "b=" << b << endl;} private:int a;int b; }; int main() {solution s(1, 2);s.print();return 0; }賦值初始化:
#include<iostream> using namespace std;class solution { public:solution(int value1,int value2){a = value1;b = value2;}//列表初始化void print() {cout << "a=" << a << " " << "b=" << b << endl;} private:int a;int b; }; int main() {solution s(1, 2);s.print();return 0; } a=1 b=23.什么情況下必須使用列表初始化?
必須使用成員初始化的四種情況:
當(dāng)初始化一個引用成員時;當(dāng)初始化一個常量成員時;當(dāng)調(diào)用一個基類的構(gòu)造函數(shù),而它擁有一組參數(shù)時;當(dāng)調(diào)用一個成員類的構(gòu)造函數(shù),而它擁有一組參數(shù)時; #include<iostream> using namespace std;class solution { public:solution(int& value1,int value2):a(value1),b(value2){}//正確,列表初始化/*solution(int& value1, int value2) {a = value1;b = value2;}//錯誤,賦值初始化*/void print() {cout << "a=" << a << " " << "b=" << b << endl;} private:int& a;int b; }; int main() {int a = 1;solution s(a, 2);s.print();return 0; }4.為什么用列表初始化成員變量會快一些?
賦值初始化是在構(gòu)造函數(shù)當(dāng)中做賦值的操作,而列表初始化是做純粹的初始化操作。我們都知道,C++的賦值操作是會產(chǎn)生臨時對象的。臨時對象的出現(xiàn)會降低程序的效率。
5.派生類構(gòu)造函數(shù)的執(zhí)行順序
虛擬基類的構(gòu)造函數(shù)(多個虛擬基類則按照繼承的順序執(zhí)行構(gòu)造函數(shù))。基類的構(gòu)造函數(shù)(多個普通基類也按照繼承的順序執(zhí)行構(gòu)造函數(shù))。類類型的成員對象的構(gòu)造函數(shù)(按照初始化順序)派生類自己的構(gòu)造函數(shù)。 #include<iostream> using namespace std;//虛基類 class A { public:A(int value) :a(value) {cout << "A的初始化" << endl;} private:int a; };//基類 class B { public:B(int value) :b(value) {cout << "B的初始化" << endl;} private:int b; };//類類型的成員 class C { public:C() {cout << "C的初始化" << endl;} };//派生類 class D:public B,virtual public A { public:D(int value1, int value2) :B(value1), A(value2) {//初始化順序和初始化列表的順序無關(guān),構(gòu)造函數(shù)的初始化順序按照一定規(guī)則進行。cout << "D的初始化" << endl;} private:C c; }; int main() {D d(1, 2);return 0; } A的初始化 B的初始化 C的初始化 D的初始化總結(jié)
以上是生活随笔為你收集整理的C++学习——类的初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux-01-概述
- 下一篇: C++学习——set与map