吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++基礎語法中的引用、封裝和多態

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程 ? 2021-09-12 09:58 ? 次閱讀

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

(1)引用;

(2)宏;

(3)成員初始化列表;

(4)封裝;

(5)繼承;

(6)多態;

引用

左值引用

常規引用,一般表示對象的身份。

右值引用

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

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

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

能夠更簡潔明確地定義泛型函數。

引用折疊

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

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

宏定義可以實現類似于函數的功能,但是它終歸不是函數,而宏定義中括弧中的“參數”也不是真的參數,在宏展開的時候對 “參數” 進行的是一對一的替換。

成員初始化列表

好處

更高效:少了一次調用默認構造函數的過程。

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

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

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

沒有默認構造函數的類類型,因為使用初始化列表可以不必調用默認構造函數來初始化

initializer_list 列表初始化

用花括號初始化器列表初始化一個對象,其中對應構造函數接受一個 std::initializer_list 參數。

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 語句中復制列表初始化 // 這不使用 std::initializer_list }}; template 《typename T》void templated_fn(T) {} int main(){ S《int》 s = {1, 2, 3, 4, 5}; // 復制初始化 s.append({6, 7, 8}); // 函數調用中的列表初始化 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 的規則令此帶范圍 for 工作 std::cout 《《 x 《《 ‘ ’; std::cout 《《 ‘

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

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

面向對象

面向對象程序設計(Object-oriented programming,OOP)是種具有對象概念的程序編程典范,同時也是一種程序開發的抽象方針。

面向對象三大特征 —— 封裝、繼承、多態

封裝

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

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

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

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

繼承

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

多態

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

多態是以封裝和繼承為基礎的。

C++ 多態分類及實現:

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

子類型多態(Subtype Polymorphism,運行期):虛函數

參數多態性(Parametric Polymorphism,編譯期):類模板、函數模板

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

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

函數重載

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

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

虛函數:用 virtual 修飾成員函數,使其成為虛函數

動態綁定:當使用基類的引用或指針調用一個虛函數時將發生動態綁定

注意:

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

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

靜態函數(static)不能是虛函數

構造函數不能是虛函數(因為在調用構造函數時,虛表指針并沒有在對象的內存空間中,必須要構造函數調用完成后才會形成虛表指針)

內聯函數不能是表現多態性時的虛函數

動態多態使用

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(); // 調用圓形類里面的方法 shape2-》calcArea(); // 調用矩形類里面的方法 delete shape1; shape1 = nullptr; delete shape2; shape2 = nullptr; return 0;}

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 封裝
    +關注

    關注

    127

    文章

    7997

    瀏覽量

    143413
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73859

原文標題:C++基礎語法梳理:引用、封裝、繼承和多態

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序。Spire.XLS for C+
    的頭像 發表于 01-14 09:40 ?148次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    EE-112:模擬C++的類實現

    電子發燒友網站提供《EE-112:模擬C++的類實現.pdf》資料免費下載
    發表于 01-03 15:15 ?0次下載
    EE-112:模擬<b class='flag-5'>C++</b><b class='flag-5'>中</b>的類實現

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    )開發框架。它極大地簡化了JS與C/C++之間的跨語言訪問,為開發者提供了一種邊界性編程體驗友好的解決方案。通過AKI,開發者可以使用讓代碼更易讀的語法糖,實現JS與C/
    發表于 01-02 17:08

    C語言和C++結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?356次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    使用OpenVINO GenAI API在C++構建AI應用程序

    許多桌面應用程序是使用 C++ 開發的,而將生成式AI(GenAI)功能集成到這些應用程序可能會很具有挑戰性,尤其是因為使用像 Hugging Face 這樣的 Python 庫的復雜性。C++
    的頭像 發表于 10-12 09:36 ?469次閱讀
    使用OpenVINO GenAI API在<b class='flag-5'>C++</b><b class='flag-5'>中</b>構建AI應用程序

    ostream在c++的用法

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

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優化與整理,已經是非常貼近開發的使用習慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發表于 07-26 09:20 ?1057次閱讀

    ModusToolbox 3.2在c代碼包含c++代碼的正確步驟是什么?

    使用 ModusToolbox 3.2 我有一個用純 C 語言編寫的 XMC4700 項目。 我正在嘗試添加一些 C++ 函數,并將其合并到我的原始代碼。 我可以構建獨立的 .cpp/.hpp
    發表于 07-23 08:21

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    C++實現類似instanceof的方法

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

    要用指針怎么引用,一般在file2.c引用file1.c的字符串數組是怎么操作的?

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

    C/C++兩種宏實現方式

    #ifndef的方式受C/C++語言標準支持。它不僅可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件(或者代碼片段)不會被不小心同時包含。
    的頭像 發表于 04-19 11:50 ?701次閱讀

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C標準庫hypot接口計算兩個給定數平方和的平
    的頭像 發表于 04-14 11:43 ?2765次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

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

    在前兩篇博客,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客,我們將仔細研究以 C++
    的頭像 發表于 03-28 13:53 ?861次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤
    太阳城御园| 大三巴百家乐官网的玩法技巧和规则| 大发888官网df888| 百家乐官网怎样玩才会赢钱| 新葡京国际娱乐城| 百家乐tt娱乐场开户注册| 百家乐官网赌场技巧网| 大发888官方6222.c| 百家乐是否有规律| 澳门百家乐官网娱乐开户| 大发888娱乐城官方下载lm0| 百家乐官网送钱平台| 乾安县| 新全讯网353788| 百家乐有多少网址| 百家乐官网开户平台| 零点棋牌下载| 678百家乐博彩娱乐场| 单机百家乐官网的玩法技巧和规则 | 宝胜娱乐场| 百家乐赌博现金网平台排名| 百家乐官网在线娱乐平台| 民乐县| 太阳城橙翠园| 真钱百家乐游戏大全| 江阴市| 大发888游戏平台黄埔| 百家乐赌场高手| 土豪百家乐官网的玩法技巧和规则| 永利高百家乐官网开户| 36棋牌的深海捕鱼| 稳赢百家乐的玩法技巧| 喜力百家乐官网的玩法技巧和规则 | 一起游乐棋牌下载| 百家乐蓝盾有赢钱的吗| 为什么百家乐官网玩家越来越多选择网上百家乐官网 | 百家乐娱乐软件| 曼哈顿百家乐官网的玩法技巧和规则 | 百家乐官网波音平台导航网| 永发国际娱乐城| 澳门顶级赌场百家乐的玩法技巧和规则|