本期是C++基礎(chǔ)語(yǔ)法分享的第六節(jié),今天給大家來(lái)分享一下:
(1)引用;
(2)宏;
(3)成員初始化列表;
(4)封裝;
(5)繼承;
(6)多態(tài);
引用
左值引用
常規(guī)引用,一般表示對(duì)象的身份。
右值引用
右值引用就是必須綁定到右值(一個(gè)臨時(shí)對(duì)象、將要銷毀的對(duì)象)的引用,一般表示對(duì)象的值。
右值引用可實(shí)現(xiàn)轉(zhuǎn)移語(yǔ)義(Move Sementics)和精確傳遞(Perfect Forwarding),它的主要目的有兩個(gè)方面:
消除兩個(gè)對(duì)象交互時(shí)不必要的對(duì)象拷貝,節(jié)省運(yùn)算存儲(chǔ)資源,提高效率。
能夠更簡(jiǎn)潔明確地定義泛型函數(shù)。
引用折疊
X& &、X& &&、X&& & 可折疊成 X&
X&& && 可折疊成 X&&
宏
宏定義可以實(shí)現(xiàn)類似于函數(shù)的功能,但是它終歸不是函數(shù),而宏定義中括弧中的“參數(shù)”也不是真的參數(shù),在宏展開(kāi)的時(shí)候?qū)?“參數(shù)” 進(jìn)行的是一對(duì)一的替換。
成員初始化列表
好處
更高效:少了一次調(diào)用默認(rèn)構(gòu)造函數(shù)的過(guò)程。
有些場(chǎng)合必須要用初始化列表:
常量成員,因?yàn)槌A恐荒艹跏蓟荒苜x值,所以必須放在初始化列表里面
引用類型,引用必須在定義的時(shí)候初始化,并且不能重新賦值,所以也要寫(xiě)在初始化列表里面
沒(méi)有默認(rèn)構(gòu)造函數(shù)的類類型,因?yàn)槭褂贸跏蓟斜砜梢圆槐卣{(diào)用默認(rèn)構(gòu)造函數(shù)來(lái)初始化
initializer_list 列表初始化
用花括號(hào)初始化器列表初始化一個(gè)對(duì)象,其中對(duì)應(yīng)構(gòu)造函數(shù)接受一個(gè) 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 語(yǔ)句中復(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}); // 編譯錯(cuò)誤!“ {1, 2, 3} ”不是表達(dá)式, // 它無(wú)類型,故 T 無(wú)法推導(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è)計(jì)(Object-oriented programming,OOP)是種具有對(duì)象概念的程序編程典范,同時(shí)也是一種程序開(kāi)發(fā)的抽象方針。
面向?qū)ο笕筇卣?—— 封裝、繼承、多態(tài)
封裝
把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏。關(guān)鍵字:public, protected, private。不寫(xiě)默認(rèn)為 private。
public 成員:可以被任意實(shí)體訪問(wèn)
protected 成員:只允許被子類及本類的成員函數(shù)訪問(wèn)
private 成員:只允許被本類的成員函數(shù)、友元類或友元函數(shù)訪問(wèn)
繼承
基類(父類)——》 派生類(子類)
多態(tài)
多態(tài),即多種狀態(tài)(形態(tài))。簡(jiǎn)單來(lái)說(shuō),我們可以將多態(tài)定義為消息以多種形式顯示的能力。
多態(tài)是以封裝和繼承為基礎(chǔ)的。
C++ 多態(tài)分類及實(shí)現(xiàn):
重載多態(tài)(Ad-hoc Polymorphism,編譯期):函數(shù)重載、運(yùn)算符重載
子類型多態(tài)(Subtype Polymorphism,運(yùn)行期):虛函數(shù)
參數(shù)多態(tài)性(Parametric Polymorphism,編譯期):類模板、函數(shù)模板
強(qiáng)制多態(tài)(Coercion Polymorphism,編譯期/運(yùn)行期):基本類型轉(zhuǎn)換、自定義類型轉(zhuǎn)換
靜態(tài)多態(tài)(編譯期/早綁定)
函數(shù)重載
class A{public: void do(int a); void do(int a, int b);};
動(dòng)態(tài)多態(tài)(運(yùn)行期期/晚綁定)
虛函數(shù):用 virtual 修飾成員函數(shù),使其成為虛函數(shù)
動(dòng)態(tài)綁定:當(dāng)使用基類的引用或指針調(diào)用一個(gè)虛函數(shù)時(shí)將發(fā)生動(dòng)態(tài)綁定
注意:
可以將派生類的對(duì)象賦值給基類的指針或引用,反之不可
普通函數(shù)(非類成員函數(shù))不能是虛函數(shù)
靜態(tài)函數(shù)(static)不能是虛函數(shù)
構(gòu)造函數(shù)不能是虛函數(shù)(因?yàn)樵谡{(diào)用構(gòu)造函數(shù)時(shí),虛表指針并沒(méi)有在對(duì)象的內(nèi)存空間中,必須要構(gòu)造函數(shù)調(diào)用完成后才會(huì)形成虛表指針)
內(nèi)聯(lián)函數(shù)不能是表現(xiàn)多態(tài)性時(shí)的虛函數(shù)
動(dòng)態(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)注
127文章
8013瀏覽量
143466 -
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73890
原文標(biāo)題:C++基礎(chǔ)語(yǔ)法梳理:引用、封裝、繼承和多態(tài)
文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論