C++学习——类的初始化
生活随笔
收集整理的這篇文章主要介紹了
C++学习——类的初始化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.類通過構造函數進行數據成員初始化
- 2.類成員初始化方式?
- 3.什么情況下必須使用列表初始化?
- 4.為什么用列表初始化成員變量會快一些?
- 5.派生類構造函數的執行順序
1.類通過構造函數進行數據成員初始化
一般來說,類中的數據成員是私有的,不能通過對象共有訪問的方式對數據成員賦初始值。一般來說,構造函數就是用來用來在創建對象時初始化對象, 為對象數據成員賦初始值。
構造函數是類的一種特殊成員函數,不需要人為調用,而是在建立對象時自動被執行。
2.類成員初始化方式?
賦值初始化,通過在函數體內進行賦值初始化; 列表初始化,在冒號后使用初始化列表進行初始化。 這兩種方式的主要區別在于:對于在函數體中初始化,是在所有的數據成員被分配內存空間后才進行的。列表初始化是給數據成員分配內存空間時就進行初始化, 就是說分配一個數據成員只要冒號后有此數據成員的賦值表達式(此表達式必須是括號賦值表達式), 那么分配了內存空間后在進入函數體之前給數據成員賦值, 就是說初始化這個數據成員此時函數體還未執行。列表初始化:
#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.什么情況下必須使用列表初始化?
必須使用成員初始化的四種情況:
當初始化一個引用成員時;當初始化一個常量成員時;當調用一個基類的構造函數,而它擁有一組參數時;當調用一個成員類的構造函數,而它擁有一組參數時; #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.為什么用列表初始化成員變量會快一些?
賦值初始化是在構造函數當中做賦值的操作,而列表初始化是做純粹的初始化操作。我們都知道,C++的賦值操作是會產生臨時對象的。臨時對象的出現會降低程序的效率。
5.派生類構造函數的執行順序
虛擬基類的構造函數(多個虛擬基類則按照繼承的順序執行構造函數)。基類的構造函數(多個普通基類也按照繼承的順序執行構造函數)。類類型的成員對象的構造函數(按照初始化順序)派生類自己的構造函數。 #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) {//初始化順序和初始化列表的順序無關,構造函數的初始化順序按照一定規則進行。cout << "D的初始化" << endl;} private:C c; }; int main() {D d(1, 2);return 0; } A的初始化 B的初始化 C的初始化 D的初始化總結
以上是生活随笔為你收集整理的C++学习——类的初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux-01-概述
- 下一篇: 2010年 Web的五项技术和五个趋势