關鍵詞不同

void C++

  1. 當用作函式返回型別時,void 關鍵字指定該函式不返回值。當用於函式的引數列表時,void 指定該函式不帶引數。當在指標的宣告中使用時,void 指定指標是通用的

  2. 如果指標的型別為 void *,則指標可以指向未使用 const 或 volatile 關鍵字宣告的任何變數。除非將其轉換為其他型別,否則無法取消引用 void 指標。void 指標可以轉換為任何其他型別的資料指標。

  3. void 指標可以指向函式,但不能指向 C++中的類成員。

    void vobject;   // C2182  
    void *pv;   // okay  
    int *pint; int i;  
    int main() {  
    pv = &i;  
       // Cast optional in C required in C++  
    pint = (int *)pv;  
    

易失性 C++

  1. 一種型別限定符,可用於宣告可以通過硬體在程式中修改物件。

    volatile declarator ;
    

虛擬 C++

  1. virtual 關鍵字宣告虛擬函式或虛基類。

    virtual [type-specifiers] member-function-declarator  
    virtual [access-specifier] base-class-name 
    

引數

  1. type-specifiers 指定虛擬成員函式的返回型別。

  2. member-function-declarator 宣告成員函式。

  3. access-specifier 定義對基類(public,protected 或 private)的訪問級別。可以出現在 virtual 關鍵字之前或之後。

  4. base-class-name 標識先前宣告的類型別

這個指標

  1. this 指標是一個只能在類,結構或聯合型別的非靜態成員函式中訪問的指標。它指向呼叫成員函式的物件。靜態成員函式沒有 this 指標。

    this->member-identifier  
    

物件的 this 指標不是物件本身的一部分; 它沒有反映在物件的 sizeof 語句的結果中。相反,當為物件呼叫非靜態成員函式時,編譯器將物件的地址作為函式的隱藏引數傳遞。例如,以下函式呼叫:

myDate.setMonth( 3 );  

can be interpreted this way:

setMonth( &myDate, 3 );  

The object's address is available from within the member function as the this pointer. Most uses of this are implicit. It is legal, though unnecessary, to explicitly use this when referring to members of the class. For example:

void Date::setMonth( int mn )  
{  
   month = mn;            // These three statements  
   this->month = mn;      // are equivalent  
   (*this).month = mn;  
}  

The expression *this is commonly used to return the current object from a member function:

return *this;  

The this pointer is also used to guard against self-reference:

if (&Object != this) {  
// do not execute in cases of self-reference 

嘗試,丟擲和捕獲語句(C++)

  1. 要在 C++中實現異常處理,可以使用 try,throw 和 catch 表示式。
  2. 首先,使用 try 塊來包含一個或多個可能引發異常的語句。
  3. throw 表示式表示異常條件 - 通常是 try 塊中發生的錯誤。你可以使用任何型別的物件作為 throw 表示式的運算元。通常,此物件用於傳遞有關錯誤的資訊。在大多數情況下,我們建議你使用 std::exception 類或標準庫中定義的派生類之一。如果其中一個不合適,我們建議你從 std::exception 派生自己的異常類。
  4. 要處理可能丟擲的異常,請在 try 塊之後立即實現一個或多個 catch 塊。每個 catch 塊指定它可以處理的異常型別。
    MyData md;  
try {  
   // Code that could throw an exception  
   md = GetNetworkResource();  
}  
catch (const networkIOException& e) {  
   // Code that executes when an exception of type  
   // networkIOException is thrown in the try block  
   // ...  
   // Log error message in the exception object  
   cerr << e.what();  
}  
catch (const myDataFormatException& e) {  
   // Code that handles another exception type  
   // ...  
   cerr << e.what();  
}  
  
// The following syntax shows a throw expression  
MyData GetNetworkResource()  
{  
   // ...  
   if (IOSuccess == false)  
      throw networkIOException("Unable to connect");  
   // ...  
   if (readError)  
      throw myDataFormatException("Format error");   
   // ...  
}

try 子句之後的程式碼是受保護的程式碼段。throw 表示式丟擲 - 即引發異常。catch 子句之後的程式碼塊是異常處理程式。這是捕獲丟擲異常的處理程式,如果 throw 和 catch 表示式中的型別相容。

    try {  
   throw CSomeOtherException();  
}  
catch(...) {  
   // Catch all exceptions – dangerous!!!  
   // Respond (perhaps only partially) to the exception, then  
   // re-throw to pass the exception to some other handler  
   // ...  
   throw;  
}

朋友(C++)

  1. 在某些情況下,授予對不是類成員的函式或單獨類中的所有成員的成員級訪問許可權會更方便。只有類實現者可以宣告其朋友是誰。函式或類不能將自己宣告為任何類的朋友。在類定義中,使用 friend 關鍵字和非成員函式或其他類的名稱來授予它對類的私有成員和受保護成員的訪問許可權。在模板定義中,可以將型別引數宣告為朋友。

  2. 如果宣告之前未宣告的友元函式,則該函式將匯出到封閉的非類作用域。

    class friend F  
    friend F;
    class ForwardDeclared;// Class name is known.  
    class HasFriends  
    {  
       friend int ForwardDeclared::IsAFriend();// C2039 error expected  
    };  
    

朋友的功能

  1. 友元函式是一個函式,它不是類的成員,但可以訪問類的私有和受保護成員。友元函式不被視為類成員; 它們是具有特殊訪問許可權的普通外部函式。

  2. 朋友不在類的範圍內,並且不使用成員選擇運算子(。和 - >)呼叫它們,除非它們是另一個類的成員。

  3. 友元函式由授予訪問許可權的類宣告。朋友宣告可以放在類宣告中的任何位置。它不受訪問控制關鍵字的影響。

    #include <iostream>  
    
    using namespace std;  
    class Point  
    {  
        friend void ChangePrivate( Point & );  
    public:  
        Point( void ) : m_i(0) {}  
        void PrintPrivate( void ){cout << m_i << endl; }  
    
    private:  
    int m_i;  
    };  
    
    void ChangePrivate ( Point &i ) { i.m_i++; }  
    
    int main()  
    {  
       Point sPoint;  
       sPoint.PrintPrivate();  
       ChangePrivate(sPoint);  
       sPoint.PrintPrivate();  
        // Output: 0  
               1  
    }  
    

類成員為朋友

class B;  

class A {  
public:  
   int Func1( B& b );  

private:  
   int Func2( B& b );  
};  

class B {  
private:  
int _b;  

   // A::Func1 is a friend function to class B  
   // so A::Func1 has access to all members of B  
   friend int A::Func1( B& );  
};  

int A::Func1( B& b ) { return b._b; }   // OK  
int A::Func2( B& b ) { return b._b; }   // C2248