0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++基礎(chǔ)語法中的引用、封裝和多態(tài)

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程 ? 2021-09-12 09:58 ? 次閱讀

本期是C++基礎(chǔ)語法分享的第六節(jié),今天給大家來分享一下:

(1)引用;

(2)宏;

(3)成員初始化列表;

(4)封裝;

(5)繼承;

(6)多態(tài);

引用

左值引用

常規(guī)引用,一般表示對象的身份。

右值引用

右值引用就是必須綁定到右值(一個臨時對象、將要銷毀的對象)的引用,一般表示對象的值。

右值引用可實現(xiàn)轉(zhuǎn)移語義(Move Sementics)和精確傳遞(Perfect Forwarding),它的主要目的有兩個方面:

消除兩個對象交互時不必要的對象拷貝,節(jié)省運算存儲資源,提高效率。

能夠更簡潔明確地定義泛型函數(shù)。

引用折疊

X& &、X& &&、X&& & 可折疊成 X&

X&& && 可折疊成 X&&

宏定義可以實現(xiàn)類似于函數(shù)的功能,但是它終歸不是函數(shù),而宏定義中括弧中的“參數(shù)”也不是真的參數(shù),在宏展開的時候?qū)?“參數(shù)” 進(jìn)行的是一對一的替換。

成員初始化列表

好處

更高效:少了一次調(diào)用默認(rèn)構(gòu)造函數(shù)的過程。

有些場合必須要用初始化列表:

常量成員,因為常量只能初始化不能賦值,所以必須放在初始化列表里面

引用類型,引用必須在定義的時候初始化,并且不能重新賦值,所以也要寫在初始化列表里面

沒有默認(rèn)構(gòu)造函數(shù)的類類型,因為使用初始化列表可以不必調(diào)用默認(rèn)構(gòu)造函數(shù)來初始化

initializer_list 列表初始化

用花括號初始化器列表初始化一個對象,其中對應(yīng)構(gòu)造函數(shù)接受一個 std::initializer_list 參數(shù)。

initializer_list 使用

#include 《iostream》#include 《vector》#include 《initializer_list》 template 《class T》struct S { std::vector《T》 v; S(std::initializer_list《T》 l) : v(l) { std::cout 《《 “constructed with a ” 《《 l.size() 《《 “-element list

”; } void append(std::initializer_list《T》 l) { v.insert(v.end(), l.begin(), l.end()); } std::pair《const T*, std::size_t》 c_arr() const { return {&v[0], v.size()}; // 在 return 語句中復(fù)制列表初始化 // 這不使用 std::initializer_list }}; template 《typename T》void templated_fn(T) {} int main(){ S《int》 s = {1, 2, 3, 4, 5}; // 復(fù)制初始化 s.append({6, 7, 8}); // 函數(shù)調(diào)用中的列表初始化 std::cout 《《 “The vector size is now ” 《《 s.c_arr().second 《《 “ ints:

”; for (auto n : s.v) std::cout 《《 n 《《 ‘ ’; std::cout 《《 ‘

’; std::cout 《《 “Range-for over brace-init-list:

”; for (int x : {-1, -2, -3}) // auto 的規(guī)則令此帶范圍 for 工作 std::cout 《《 x 《《 ‘ ’; std::cout 《《 ‘

’; auto al = {10, 11, 12}; // auto 的特殊規(guī)則 std::cout 《《 “The list bound to auto has size() = ” 《《 al.size() 《《 ‘

’; // templated_fn({1, 2, 3}); // 編譯錯誤!“ {1, 2, 3} ”不是表達(dá)式, // 它無類型,故 T 無法推導(dǎo) templated_fn《std::initializer_list《int》》({1, 2, 3}); // OK templated_fn《std::vector《int》》({1, 2, 3}); // 也 OK}

面向?qū)ο?/p>

面向?qū)ο蟪绦蛟O(shè)計(Object-oriented programming,OOP)是種具有對象概念的程序編程典范,同時也是一種程序開發(fā)的抽象方針。

面向?qū)ο笕筇卣?—— 封裝、繼承、多態(tài)

封裝

把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進(jìn)行信息隱藏。關(guān)鍵字:public, protected, private。不寫默認(rèn)為 private。

public 成員:可以被任意實體訪問

protected 成員:只允許被子類及本類的成員函數(shù)訪問

private 成員:只允許被本類的成員函數(shù)、友元類或友元函數(shù)訪問

繼承

基類(父類)——》 派生類(子類)

多態(tài)

多態(tài),即多種狀態(tài)(形態(tài))。簡單來說,我們可以將多態(tài)定義為消息以多種形式顯示的能力。

多態(tài)是以封裝和繼承為基礎(chǔ)的。

C++ 多態(tài)分類及實現(xiàn):

重載多態(tài)(Ad-hoc Polymorphism,編譯期):函數(shù)重載、運算符重載

子類型多態(tài)(Subtype Polymorphism,運行期):虛函數(shù)

參數(shù)多態(tài)性(Parametric Polymorphism,編譯期):類模板、函數(shù)模板

強制多態(tài)(Coercion Polymorphism,編譯期/運行期):基本類型轉(zhuǎn)換、自定義類型轉(zhuǎn)換

靜態(tài)多態(tài)(編譯期/早綁定)

函數(shù)重載

class A{public: void do(int a); void do(int a, int b);};

動態(tài)多態(tài)(運行期期/晚綁定)

虛函數(shù):用 virtual 修飾成員函數(shù),使其成為虛函數(shù)

動態(tài)綁定:當(dāng)使用基類的引用或指針調(diào)用一個虛函數(shù)時將發(fā)生動態(tài)綁定

注意:

可以將派生類的對象賦值給基類的指針或引用,反之不可

普通函數(shù)(非類成員函數(shù))不能是虛函數(shù)

靜態(tài)函數(shù)(static)不能是虛函數(shù)

構(gòu)造函數(shù)不能是虛函數(shù)(因為在調(diào)用構(gòu)造函數(shù)時,虛表指針并沒有在對象的內(nèi)存空間中,必須要構(gòu)造函數(shù)調(diào)用完成后才會形成虛表指針)

內(nèi)聯(lián)函數(shù)不能是表現(xiàn)多態(tài)性時的虛函數(shù)

動態(tài)多態(tài)使用

class Shape // 形狀類{public: virtual double calcArea(){ 。.. } virtual ~Shape();};class Circle : public Shape // 圓形類{public: virtual double calcArea(); 。..};class Rect : public Shape // 矩形類{public: virtual double calcArea(); 。..};int main(){ Shape * shape1 = new Circle(4.0); Shape * shape2 = new Rect(5.0, 6.0); shape1-》calcArea(); // 調(diào)用圓形類里面的方法 shape2-》calcArea(); // 調(diào)用矩形類里面的方法 delete shape1; shape1 = nullptr; delete shape2; shape2 = nullptr; return 0;}

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7728

    瀏覽量

    142598
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2100

    瀏覽量

    73453

原文標(biāo)題:C++基礎(chǔ)語法梳理:引用、封裝、繼承和多態(tài)

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言和C++結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?101次閱讀

    ostream在c++的用法

    ostream 是 C++ 標(biāo)準(zhǔn)庫中一個非常重要的類,它位于 頭文件(實際上,更常見的是通過包含 頭文件來間接包含 ,因為 包含了 和 )。 ostream 類及其派生類(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?416次閱讀

    C++實現(xiàn)類似instanceof的方法

    C++多態(tài)與繼承,但是很多人開始學(xué)習(xí)C++,有時候會面臨一個常見問題,就是如何向下轉(zhuǎn)型,特別是不知道具體類型的時候,這個時候就希望C++ 可以向Java或者Python中有insta
    的頭像 發(fā)表于 07-18 10:16 ?499次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>中</b>實現(xiàn)類似instanceof的方法

    要用指針怎么引用,一般在file2.c引用file1.c的字符串?dāng)?shù)組是怎么操作的?

    file1.c引用uart1_senddata(RTC_SET,sizeof(RTC_SET));正常 但在file2.c (包含file1.h),此時
    發(fā)表于 05-09 08:05

    鴻蒙OS開發(fā)實例:【Native C++

    使用DevEco Studio創(chuàng)建一個Native C++應(yīng)用。應(yīng)用采用Native C++模板,實現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫的功能。使用C標(biāo)準(zhǔn)庫hypot接口計算兩個給定數(shù)平方和的平
    的頭像 發(fā)表于 04-14 11:43 ?2449次閱讀
    鴻蒙OS開發(fā)實例:【Native <b class='flag-5'>C++</b>】

    使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯誤

    在前兩篇博客,我們?向您介紹了新的 MISRA C++ 標(biāo)準(zhǔn)?和?C++ 的歷史?。在這篇博客,我們將仔細(xì)研究以 C++
    的頭像 發(fā)表于 03-28 13:53 ?709次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環(huán)中的錯誤

    c語言,c++,java,python區(qū)別

    操作系統(tǒng)、嵌入式系統(tǒng)等對性能要求較高的場景。C語言的語法相對簡單,學(xué)習(xí)曲線較平緩,也是學(xué)習(xí)其他高級語言的入門語言。 C++C++是在C
    的頭像 發(fā)表于 02-05 14:11 ?2110次閱讀

    vb語言和c++語言的區(qū)別

    Microsoft開發(fā)的一種面向?qū)ο蟮氖录?qū)動編程語言。它的設(shè)計目標(biāo)是簡化編程過程,讓初學(xué)者也能快速上手。與之相比,C++語言是一種通用的、面向?qū)ο蟮木幊陶Z言,其設(shè)計目標(biāo)是提供高性能的系統(tǒng)級編程。 語法: VB語言的語法較為簡單
    的頭像 發(fā)表于 02-01 10:20 ?1948次閱讀

    C++簡史:C++是如何開始的

    的 MISRA C++:2023 博客系列的第二部分。 在這篇博客,我們將深入探討 C++ 的歷史、編程語言多年來的發(fā)展歷程以及它的下一步發(fā)展方向。
    的頭像 發(fā)表于 01-11 09:00 ?513次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    基于C/C++面向?qū)ο蟮姆绞?b class='flag-5'>封裝socket通信類流程簡析

    在掌握了基于 TCP 的套接字通信流程之后,為了方便使用,提高編碼效率,可以對通信操作進(jìn)行封裝,本著有淺入深的原則,先基于 C 語言進(jìn)行面向過程的函數(shù)封裝,然后再基于 C++ 進(jìn)行面向
    的頭像 發(fā)表于 12-26 10:00 ?1679次閱讀

    基于C/C++面向?qū)ο蟮姆绞?b class='flag-5'>封裝socket通信類

    在掌握了基于 TCP 的套接字通信流程之后,為了方便使用,提高編碼效率,可以對通信操作進(jìn)行封裝,本著有淺入深的原則,先基于 C 語言進(jìn)行面向過程的函數(shù)封裝,然后再基于 C++ 進(jìn)行面向
    的頭像 發(fā)表于 12-26 09:57 ?1263次閱讀

    C語言和C++那些不同的地方

    ++11標(biāo)準(zhǔn)。根據(jù)不同的標(biāo)準(zhǔn),它們的功能也會有所不同,但是越新的版本支持的編譯器越少,所以本文在討論的時候使用的C語言標(biāo)準(zhǔn)是C89,C++標(biāo)準(zhǔn)是C++99.我們來介紹
    的頭像 發(fā)表于 12-07 14:29 ?889次閱讀
    <b class='flag-5'>C</b>語言和<b class='flag-5'>C++</b><b class='flag-5'>中</b>那些不同的地方

    vlookup函數(shù)什么時候用絕對引用

    VLOOKUP函數(shù)是Excel中一種非常有用的查找函數(shù),用于在一個表格或范圍查找特定值,并返回該值所在行或列的相關(guān)數(shù)據(jù)。絕對引用是一種在公式中用于固定單元格位置的技巧,可以確保在復(fù)制公式到其他
    的頭像 發(fā)表于 12-01 10:25 ?6414次閱讀

    開箱即用!教你如何正確使用華為云CodeArts IDE for C/C++!

    C/C++編碼體驗、方便的訪問華為云資源、簡單的引用華為云服務(wù)于一身,實現(xiàn)C/C++開發(fā)者在個人研發(fā)作業(yè)體驗和效率上的巨大提升。 為了幫助
    的頭像 發(fā)表于 11-29 17:40 ?741次閱讀
    開箱即用!教你如何正確使用華為云CodeArts IDE for <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>!

    c++多行注釋快捷鍵

    C++,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個語句的方法。當(dāng)你希望暫時禁用一些代碼或者解釋特定部分代碼的作用時,多行注釋是非常有用的。 在C++,多行注釋以 /*
    的頭像 發(fā)表于 11-22 10:24 ?7931次閱讀