1. 程式人生 > 實用技巧 >c++ 學習記錄 建構函式 成員變數的初始化

c++ 學習記錄 建構函式 成員變數的初始化

參考連結: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 成員變數的唯一方法就是使用初始化列表