程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++必知必會(3)

C++必知必會(3)

編輯:C++入門知識

條款26操作符函數查找

class X

{

public:

Xoperator %( const X& ) const; //二元取余操作

XmemFunc1( const X&);

voidmemFunc2();

};

可以采用中綴或函數調用語法來調用這個重載的操作符:如下

X a,b,c;

a = b%c; //采用中綴語法調用成員操作符%

a = b.operator %(c); //成員函數調用語法

a = b.memFunc1(c); //另一個成員函數調用

然而,對重重愛操作符中的中綴調用的處理機制與此不同:

X operaator %(const X &, int); //非成員操作符聲明

//…

void X::memFunc2()

{

*this% 12; //調用非成員操作符%

operator%(*this, 12); //錯誤!實參太多

}

第一個對operator %的中綴調用,將會匹配非成員的那一個。這不是一個重載的例子,而是編譯器在兩個不同的地方查找候選函數。第二個對operator %的非中綴調用准許標准的函數查找規則,因而匹配那個成員函數,但是這裡我們會遇到一個錯誤,因為我們試圖將三個實參傳遞給一個二元函數。(記住,對成員函數的調用存在一個隱式的實參this!)

條款27 能力查詢

能力查詢通常是通過對不相關的類型進行dynamic_cast轉換而表達的。

Class Shape{

};

class Rollable{

};

class Square : public Shape{

};

class Wheel : public Rollable, publicRollable{

};

Shape* s = getSomeShape();

Rollable *roller = dynamic_cast(s);

這種dynamic_cast用法通常稱為很像轉型,因為它視圖在一個類成次結果中執行橫向轉換。如果s所指對象時一個Square,那麼dynamic_cast將會失敗,從而知道s所指向的Shape不是Rollable。如果s指向的是一個Circle或從Rollable派生下來的其他Shape,那麼轉型將會成功。

條款28 指針比較的含義

在C++中,一個對象可以有多個有效的地址,因此指針比較不是地址問題,而是對象同一性問題。請看以下例子。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved