參考鏈接: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, float score): 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 成員變量的唯一方法就是使用初始化列表