c++ 學習記錄 建構函式 成員變數的初始化
阿新 • • 發佈:2020-09-21
參考連結:http://c.biancheng.net/view/2223.html
在建構函式中對成員變數初始化的方法有倆種
一:在函式體中對成員變數一一賦值
二:採用初始化列表,下面是一個簡單例子:
class Student{ private: char *m_name; int m_age; float m_score; public: Student(char *name, int age, float score); void show(); }; //採用初始化列表 Student::Student(char *name, int age, floatscore): m_name(name), m_age(age), m_score(score) {//TODO:}
如本例所示,定義建構函式時並沒有在函式體中對成員變數一一賦值,其函式體為空(當然也可以有其他語句),而是在函式首部與函式體之間添加了一個冒號:
,後面緊跟m_name(name), m_age(age), m_score(score)
語句,這個語句的意思相當於函式體內部的m_name = name; m_age = age; m_score = score;
語句,也是賦值的意思
初始化列表可以用於全部成員變數,也可以只用於部分成員變數。下面的示例只對 m_name 使用初始化列表,其他成員變數還是一一賦值:
Student::Student(char *name, int age, float score): m_name(name){ m_age = age; m_score = score; }
注意,成員變數的初始化順序與初始化列表中列出的變數的順序無關,它只與成員變數在類中宣告的順序有關
#include <iostream> using namespace std; class Demo{ private: int m_a; int m_b; public: Demo(int b); void show(); }; Demo::Demo(int b): m_b(b), m_a(m_b){ } void Demo::show(){ cout<<m_a<<", "<<m_b<<endl; } int main(){ Demo obj(100); obj.show(); return 0; }
執行結果:
2130567168, 100
在初始化列表中,我們將 m_b 放在了 m_a 的前面,看起來是先給 m_b 賦值,再給 m_a 賦值,其實不然!成員變數的賦值順序由它們在類中的宣告順序決定,在 Demo 類中,我們先宣告的 m_a,再宣告的 m_b,所以建構函式和下面的程式碼等價:
Demo::Demo(int b): m_b(b), m_a(m_b){ m_a = m_b; m_b = b; }
給 m_a 賦值時,m_b 還未被初始化,它的值是不確定的,所以輸出的 m_a 的值是一個奇怪的數字;給 m_a 賦值完成後才給 m_b 賦值,此時 m_b 的值才是 100。
obj 在棧上分配記憶體,成員變數的初始值是不確定的
建構函式初始化列表還有一個很重要的作用,那就是初始化 const 成員變數。初始化 const 成員變數的唯一方法就是使用初始化列表