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

C++ 學習筆記(一些新特性總結3)

編輯:C++入門知識

C++ 學習筆記(一些新特性總結3)


C++ 學習筆記(一些新特性總結3)

public、protected 和 private 繼承

public 繼承時,基類的存取限制是不變的。

class MyClass
{   
public: // Unrestricted access
    int myPublic;

protected: // Defining or derived class only
    int myProtected;

private: // Defining class only
    int myPrivate;
}

class MyChild1 : public MyClass
{
// myPublic is public
// myProtected is protected
// myPrivate is private
};

protected 繼承時,基類的 public 成員變成 protected 成員。

class MyChild2 : protected MyClass
{
// myPublic is protected
// myProtected is protected
// myPrivate is private
};

private 繼承時,基類的所有成員都變成 private 成員,這也是默認的繼承方式。

class MyChild3 : private MyClass
{
// myPublic is private
// myProtected is private
// myPrivate is private
};

enum 類型的一些注意事項

同一個作用域內的 enum 名字很容易沖突。所以聲明 enum 時要小心。比如:

enum Color1 { Red = 3, Green = 4, Blue = 5 };
enum Color2 { Red = 30, Green = 40, Blue = 50 };

雖然是兩個不同的 enum,但是 Color1 與 Color2 的 Red 、Green 和 Blue 會相互沖突。 所以應該盡量將 enum 限制在較小的范圍內。比如限制在一個 namespace 中或者限制在一個類中,當然也可以限制在一個函數中,不過這樣就無法在函數外面訪問了。

class MyClass
{
    enum Color { Red, Green, Blue };
};
void myFunction()
{
    enum Color { Red, Green, Blue };
}

C++11 中引入了一種更安全的 enum,可以解決 enum 名字容易沖突的問題。下面是個例子。

enum class Color1 { Red = 3, Green = 4, Blue = 5 };
enum class Color2 { Red = 33, Green = 44, Blue = 55 };

int main() 
{
    Color2 c = Color2::Red;
    cout << (int)c << endl;
}

但是這種 enum 有點嚴格的過頭了。連 enum 到 int 的默認類型轉換都禁止了。下面的代碼就會報錯。

Color2 c = Color2::Red;
cout << c << endl; // error
if(c == 3) // error

這種 enum 還有一個特點,就是我們可以決定這個類型具體用什麼類型的整型變量來實現。比如下面的例子:

enum class Color1 : long { Red = 3, Green = 4, Blue = 5 };
enum class Color2 : char { Red = 33, Green = 44, Blue = 55 };

int main() 
{
    cout << sizeof(Color1) << endl;
    cout << sizeof(Color2) << endl;
}

constexpr 關鍵字

C++14 中進一步擴展了常量這個概念。一個表達式如果可以在編譯時就確定它的值,那麼它就能作為一個常量來使用。比如下面這個例子用一個函數的返回值來作為一個數組的長度。

constexpr int getDefaultSize(int multiplier)
{
return 3 * multiplier;
}

// Compile-time evaluation
int myArray[getDefaultSize(10)];

[[deprecated]]

C++14 中引入了 [[deprecated]] 這個屬性,可以用來修飾一個函數或對象。比如:

// Mark as deprecated
[[deprecated]] void foo() {}

編譯代碼時, foo() 這個函數被調用編譯器會給出警告。

noexcept 關鍵字

用來指示一個函數不會拋出任何異常。有助於編譯器去優化代碼。

void foo() noexcept {} // may not throw exceptions

變量模板

在 C++14 之前, 只有函數模板和類模板。C++14 又引入了一種新的模板類型,稱為變量模板。下面是個例子:

template
constexpr T pi = T(3.1415926535897932384626433L);

這樣 pi 就成了一個變量模板,用它可以給其他變量初始化。

int i = pi; // 3
float f = pi; // 3.14...

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