本期是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
-
封裝
+關(guān)注
關(guān)注
126文章
7728瀏覽量
142598 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453
原文標(biāo)題:C++基礎(chǔ)語法梳理:引用、封裝、繼承和多態(tài)
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論