成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

寫了這么久C++,你的引用成員用對了嗎?

開發(fā)
你可能會問:"真的可以在類里放引用嗎?" 當然可以啦!這就像是給類一個永遠忠實的小跟班,一旦確定關系,就會一直跟著你到天涯海角!

嗨!小伙伴們,今天我們來聊一個有趣的話題 - C++類里的引用成員!你可能會問:"真的可以在類里放引用嗎?" 當然可以啦!這就像是給類一個永遠忠實的小跟班,一旦確定關系,就會一直跟著你到天涯海角!

基礎示例

想象一下,你養(yǎng)了一只超級黏人的小貓咪 ??,它總是寸步不離地跟著你轉悠。這種形影不離的關系,在C++中用引用成員來表達再合適不過啦!就像是給小貓咪和主人之間系上了一根永遠都解不開的紅線 ??

class Person {
    string name;
public:
    Person(string n) : name(n) {}
    string getName() { return name; }
};

瞧瞧我們的小貓咪類 ??,它有個特別之處 - 通過引用成員owner永遠記住了它的主人是誰:

class Cat {
    string name;
    Person& owner;  // 這個引用就像是小貓咪的定位器,永遠指向主人 ??
public:
    // 用初始化列表給小貓咪"認主" ??
    Cat(string n, Person& p) : name(n), owner(p) {}
    
    void followOwner() {
        cout << name << " 正在屁顛屁顛地跟著 " << owner.getName() << " 呢~ ??" << endl;
    }
};

要記住哦,引用成員就像是出生就定下的緣分,一旦在構造時確定了,就再也改變不了啦!所以在初始化的時候一定要用初始化列表,就像是在小貓咪"出生證明"上蓋章一樣重要呢!

來試試看吧!

讓我們一起來看看這段可愛的代碼是怎么運作的:

int main() {
    // 首先我們需要一位溫柔的主人 ??
    Person alice("Alice");
    
    // 然后來只黏人的小貓咪,從此形影不離~ ??
    Cat kitty("Kitty", alice);
    
    // 瞧瞧!小貓咪馬上就跟著主人到處溜達啦 ??
    kitty.followOwner();  // 輸出:Kitty正在屁顛屁顛地跟著Alice呢~ ??
}

就是這么簡單!就像魔法一樣,通過引用的力量,我們的小貓咪從此就和主人綁定在一起啦!這就是C++引用成員的魅力所在 - 簡單、直接,還特別有愛。記住哦,這種深厚的"貓主情"一旦建立,就像真正的愛情一樣,天長地久,永不分離!

重要注意事項

使用引用成員時要注意這幾點(我們把嚴肅的規(guī)則說得輕松一點):

  • 就像小貓出生必須有主人一樣,引用成員必須在"出生"(構造)時就被初始化。所以默認構造函數是不行的!
  • 引用成員的初始化必須在構造函數的初始化列表中完成,不能在構造函數體內進行。就像這樣:
Cat(string n, Person& p) 
    : name(n), owner(p)  // ? 正確的方式
{ 
    // owner = p;  ? 在這里初始化引用成員是不行的!
}

為什么一定要在初始化列表中初始化引用成員呢?這是因為:

  • 引用一旦聲明就必須立即初始化,不能先聲明后賦值。這是C++語言的基本規(guī)則,引用必須在聲明時就綁定到一個對象。
  • 當進入構造函數體之前,所有成員變量都已經完成構造。這意味著在構造函數體內進行的任何賦值操作都不是初始化,而是對已經初始化的對象進行修改。
  • 在構造函數體內的賦值操作實際上是在試圖改變引用所指向的對象,而不是在進行初始化。然而,引用一旦綁定到一個對象,就不能再改變其綁定關系。
  • 這就像小貓咪必須在"出生"時就認定主人,而不是先生出來,再決定跟誰走。引用的這種特性確保了對象間的關系在對象生命周期內保持不變。

記住:引用成員特別適合表達"永久關聯"的關系,比如我們例子中的貓和主人。但要謹慎使用,因為這種關系一旦建立就不能改變啦!

初始化列表

嘿!讓我們來聊聊初始化列表這個有趣的話題吧!想象一下,如果你是一位魔法師,你有兩種方式來召喚你的寵物:

  • 第一種是直接用魔法讓它瞬間出現(這就像初始化列表)??,"啪"的一下,你的小伙伴就活靈活現地站在你面前啦!
  • 第二種方式嘛,就像是先召喚出一個"空殼",然后再往里面注入生命力(這就像在構造函數體內賦值)。顯然,第一種方式更簡單直接,對不對?

以下是一個簡單的例子,展示了初始化列表和構造函數體內賦值的區(qū)別:

class Example {
    int value;
public:
    // 使用初始化列表
    Example(int v) : value(v) {
        // 這里不需要再賦值
    }

    // 在構造函數體內賦值
    Example(int v) {
        value = v;  // 先默認構造,再賦值
    }
};

在上面的例子中,使用初始化列表的方式更高效,因為它避免了不必要的默認構造和賦值操作。

所以啊,使用初始化列表不僅僅是為了遵守規(guī)則,它還能讓我們的程序跑得更快呢!就像是坐上了特快列車,"嗖"的一下就到站了!這對于引用成員來說尤其重要,因為它們就像是害羞的小朋友,一定要在"出生"的那一刻就認定好自己的好朋友 

至于普通的成員變量嘛,雖然它們沒那么害羞,可以在"出生"后再交朋友,但是!如果能一開始就交到好朋友,何樂而不為呢?這樣不僅能讓我們的程序跑得更快,還能避免一些不必要的麻煩,就像是省去了"相親"的過程,直接就找到了真愛一樣!

記住哦,在C++的世界里,初始化列表就像是一個溫暖的魔法口袋,能讓我們的對象們快速又開心地誕生!讓我們一起用這個小魔法,創(chuàng)造出更多精彩的程序吧!

  • 初始化列表的優(yōu)勢:使用初始化列表不僅是語法上的要求,對于引用成員來說,它還可以提高性能。因為在初始化列表中,成員變量是直接構造的,而不是先默認構造再賦值。
  • 普通成員變量的初始化:普通成員變量可以在初始化列表中初始化,也可以在構造函數體內賦值。然而,使用初始化列表通常是更好的選擇,尤其是對于類類型的成員,因為它避免了不必要的默認構造和賦值操作。

通過這些補充,我們可以更好地理解為什么引用成員必須在初始化列表中初始化,以及這種方式的優(yōu)勢所在。希望這些信息能幫助你更深入地理解C++中的引用成員!

什么是"直接構造"?

讓我們用一個生動的例子來理解什么是"直接構造"以及它為什么更高效!

想象你在玩積木游戲,你有兩種方式來建造你想要的東西:

  • 直接構造:直接用積木搭建成你想要的形狀
  • 先默認構造再賦值:先隨便搭個樣子,然后再拆掉重建

來看個具體的例子:

class MyClass {
    int value;
public:
    // 構造函數
    MyClass(int v) : value(v) { }  // 直接構造
    
    // 默認構造函數
    MyClass() : value(0) { }
    
    // 賦值操作符
    MyClass& operator=(int v) {
        value = v;
        return *this;
    }
};

class Container {
    MyClass obj;
public:
    // 方式1:直接構造 - 只調用一次構造函數
    Container(int x) : obj(x) { }  // ? 更高效
    
    // 方式2:先默認構造,再賦值 - 調用默認構造函數后還要調用賦值操作符
    Container(int x) {
        obj = x;  // ? 效率較低
    }
};

兩種方式的區(qū)別:

(1) 直接構造(使用初始化列表):

  • 就像直接把積木搭建成想要的形狀
  • 只執(zhí)行一次構造操作
  • 內存中直接創(chuàng)建目標值

(2) 先默認構造再賦值:

  • 像是先搭個空房子,再進行裝修
  • 先調用默認構造函數(創(chuàng)建值為0的對象)
  • 然后再調用賦值操作符(修改為目標值)
  • 執(zhí)行了兩次操作,效率較低

所以說,直接構造就是"一步到位"地創(chuàng)建對象,避免了不必要的中間步驟。特別是對于引用成員這種必須立即初始化的情況,使用初始化列表進行直接構造是唯一的選擇!

使用建議

引用成員最適合表達對象之間的固定關聯關系。在使用時要考慮:

  • 被引用對象的生命周期必須長于包含引用的對象
  • 確保關聯關系確實需要是永久的
責任編輯:趙寧寧 來源: everystep
相關推薦

2020-12-07 11:05:21

HttpClient代碼Java

2020-02-15 15:33:55

Python如何運作

2021-07-21 10:10:14

require前端代碼

2021-11-08 10:00:19

require前端模塊

2022-08-21 14:00:11

消息中間件MQ

2022-01-25 12:41:31

ChromeResponse接口

2022-02-08 13:39:35

LinuxUNIX系統(tǒng)

2024-12-17 15:00:00

字符串Java

2018-06-08 10:12:10

Web緩存體系服務器

2019-12-04 12:33:48

程序員技術設計

2021-05-27 21:18:56

谷歌Fuchsia OS操作系統(tǒng)

2021-05-28 06:16:28

藍牙Wi-FiNFC

2021-04-28 11:35:06

Java框架日志

2020-12-01 10:18:16

RabbitMQ

2024-02-23 09:36:57

C#工具并行處理

2017-03-21 13:53:17

運維戴爾企業(yè)級解決方案

2020-03-30 09:22:03

AI語音技術機器視覺

2024-09-18 10:08:37

2022-05-09 07:27:50

ThreadLocaJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩美女在线看免费观看 | 狠狠爱综合 | 国产精品视频一二三区 | 日韩精品久久一区二区三区 | 99热.com | 国产视频导航 | 亚洲人成人一区二区在线观看 | 国产视频久久久 | 亚洲一区中文字幕 | 日韩欧美一区二区三区免费看 | 国产精品久久久久久久久久久久 | 国产午夜精品视频 | 人操人人 | 成人在线观看欧美 | 久久国产精品久久久久久久久久 | 国产精品久久毛片av大全日韩 | 久久国产精品免费一区二区三区 | 亚洲精品久久久久久一区二区 | 亚洲一区二区三区免费在线观看 | 亚洲一区二区三区免费在线 | 欧美精品第一区 | 亚洲欧美在线观看视频 | 欧美在线观看网站 | 美女午夜影院 | 欧美一区二区三区在线播放 | 亚洲午夜精品视频 | 欧美日韩视频在线第一区 | 99精品在线观看 | 久草在线在线精品观看 | 在线播放一区 | 中文字幕一区二区三区精彩视频 | 久草在线中文888 | 久久毛片| 中文字幕视频在线观看免费 | 九九久久精品 | 精品国产乱码久久久久久丨区2区 | 中文字幕亚洲欧美日韩在线不卡 | 中文字幕一区二区三区四区五区 | 一级片成人 | 国产美女黄色片 | 天堂一区|