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 成員變量的唯一方法就是使用初始化列表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM