欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++構(gòu)造函數(shù)初始化列表注意的坑

原文鏈接:https://www.zhoubotong.site/post/87.html
之所以寫這篇文章,是覺得里面有些細節(jié)如果不注意,很容易出錯或踩坑,網(wǎng)上有很多教程對這塊的描述部分存在錯誤。希望下面的介紹能給大家?guī)韼椭?/p>

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、建陽網(wǎng)站維護、網(wǎng)站推廣。

大家知道當(dāng)我們需要初始化類中的成員變量時,除了可以直接在構(gòu)造函數(shù)里面進行直接賦值,還可以使用初始化列表的方式來對成員變量進行初始化。

提到這里,順便說下什么是構(gòu)造函數(shù)初始化列表。

C++初始化列表

語法

Contructor(type1 var1, type2 var2): m_var1(var1), m_var2(var2)
{
}

參數(shù)

屬性 描述
type1 形參 var1 的類型。
var1 形參 var1。
type2 形參 var2 的類型。
var2 形參 var2。
m_var1 成員變量 m_var1。
m_var2 成員變量 m_var2。

說明

我們使用初始化列表的方式,用形參 var1 初始化了成員變量 m_var1,用形參 var2 初始化了成員變量 m_var2。舉個例子:

#include <iostream>
using namespace std;
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
}
void Student::show() {
    cout << m_name << " age is " << m_age << "score is " << m_score << endl;
}
int main() {
    Student stu((char *)"鳩摩智", 28, 5);
    stu.show();

    Student *pstu =
        new Student((char *)"慕容復(fù)", 27, 86); // 使用指針對象 new 實例化
    pstu->show();
    return 0;
}


上面的例子定義構(gòu)造函數(shù)時并沒有在函數(shù)體中對成員變量賦值,而是在函數(shù)首部與函數(shù)體之間添加了一個冒號:,后面緊跟m_name(name), m_age(age), m_score(score)語句,
可以理解成相當(dāng)于函數(shù)體內(nèi)部的m_name = name; m_age = age; m_score = score;也是賦值的意思。
注意:使用構(gòu)造函數(shù)初始化列表并沒有效率上的優(yōu)勢,僅僅是書寫方便,當(dāng)成員變量較多時這種寫法非常簡潔。

下面重點說下需要注意的地方:
初始化列表可以用于全部成員變量,也可以只用于部分成員變量。什么意思?比如我們只對 m_name 使用初始化列表,其他成員變量還是=賦值:

// 采用初始化列表
Student::Student(char *name, int age, float score)
    : m_name(name) { // 只用于部分成員變量
    m_age = age;
    m_score = score;
}

輸出結(jié)果是一樣的。 注意!注意!注意!,成員變量的初始化順序與初始化列表中列出的變量的順序無關(guān),它只與成員變量在類中聲明的順序有關(guān)。
請大家仔細看下面的代碼:

#include <iostream>
using namespace std;
class Student {
  private:
    int m_age;
    float m_score;

  public:
    Student(float s);
    void show();
};
Student::Student(float s) : m_score(s), m_age(m_score) {} //注意這里:我們將m_score放在了m_age的前面,看起來是先給m_score賦值,再給m_age賦值(m_age=m_score),其實不是的
void Student::show() { cout << m_age << ", " << m_score << endl; }
int main() {
    Student stu(99);
    stu.show();
    return 0;
}

結(jié)論

所以成員變量的賦值順序由它們在類中的聲明順序決定,在 上面的Student 類中,我們先聲明的 m_age,再聲明的 m_score,
給 m_age 賦值時,m_score 還未被初始化,所以輸出的m_age的值是默認類型的0;給 m_age 賦值完成后才給m_score 賦值,此時 m_score 的值才是99。
如果大家對上面理解了,我們再看下面的代碼,大家可以猜下輸出啥?

#include <iostream>
using namespace std;
class Student {
  private:
    int m_age;
    float m_score;

  public:
    Student(float s);
    void show();
};
Student::Student(float s) : m_score(s), m_age(m_score) {
    m_age = m_score;
    m_score = s;
}

void Student::show() { cout << m_age << ", " << m_score << endl; }
int main() {
    Student stu(99);
    stu.show();
    return 0;
}

輸出:99, 99,大家請細品!寫到最后再提下:構(gòu)造函數(shù)初始化列表還有一個很重要的作用,那就是初始化 const 成員變量。
網(wǎng)上很多教程說初始化 const 成員變量的唯一方法就是使用初始化列表。這是錯誤的,描述的不夠嚴謹,為什么這樣說,我們來看網(wǎng)上很多教程的例子:

#include <iostream>
using namespace std;
class Student {
  public:
    Student(string name, int age) {
        m_name = name;
        m_age = age;
    }
    void show();

  private:
    const string m_name;
    int m_age;
};
void Student::show() { cout << m_name << ", " << m_age << endl; }

int main() {
    Student stu("鳩摩智", 28);
    stu.show();
    Student stu1("慕容復(fù)", 27);
    stushow();
    return 0;
}

輸出:

于是網(wǎng)上很多教程說只能使用初始化列表的方式,來進行初始化,現(xiàn)在,按照網(wǎng)上的說法修改程序如下:

#include <iostream>
using namespace std;
class Student {
  public:
    Student(string name, int age) : m_name(name), m_age(age) {}
    void show();

  private:
    const string m_name;
    int m_age;
};
void Student::show() { cout << m_name << ", " << m_age << endl; }

int main() {
    Student stu("鳩摩智", 28);
    stu.show();
    Student stu1("慕容復(fù)", 27);
    stushow();
    return 0;
}

這次在構(gòu)造函數(shù)上面,使用了初始化列表的方式,初始化了 const 成員變量,這次程序沒有報錯,因此,const 成員變量只可以使用初始化列表的方式進行初始化( 誤人)。
這個描述是錯誤的,并不是const 成員變量只能使用初始化列表。在構(gòu)造函數(shù)里面初始化賦值是沒有任何問題的。
針對上面的問題我們來改下代碼。注意這里只是改變了m_name的數(shù)據(jù)類型為指針型。

#include <iostream>
using namespace std;
class Student {
  public:
    Student(char *name, int age) { // 使用構(gòu)造方法初始化賦值
        m_name = name;
        m_age = age;
    }
    void show();

  private:
    const char *m_name; // 注意這里是指針變量的常量
    int m_age;
};
void Student::show() { cout << m_name << ", " << m_age << endl; }

int main() {
    Student stu((char *)"鳩摩智", 28);
    stu.show();
    Student stu1((char *)"慕容復(fù)", 27);
    stushow();
    return 0;
}

所以類中對于const 修飾,既可以使用初始化列表的方式賦值,也可以使用構(gòu)造函數(shù)的方式賦值。

網(wǎng)站標(biāo)題: C++構(gòu)造函數(shù)初始化列表注意的坑
本文URL:http://chinadenli.net/article16/dsoiedg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站設(shè)計、域名注冊、品牌網(wǎng)站設(shè)計、小程序開發(fā)、網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)