天天看點

C++11 新知識點

翻了下新版的C++ Primer,新的C++ 11真是變化很大,新增了很多文法特性。雖然已經很久沒在寫C++了,但一直對這門經典語言很感興趣的,大緻看了看前幾章基礎部分,總結下新特性備個忘吧。估計也很難有機會用上了... ╮(─▽─)╭

基本文法

類型别名

C++11新規定了一種使用using的别名聲明的方法

typedef double wages;
using wages = double;
           

decltype類型訓示符

通過decltype選安置并傳回操作數的資料類型

//sum的類型是f()的傳回值
decltype(f()) sum = x;

//錯誤示例, cj是z的一個引用, 必須初始化
const int &cj = ci;
decltype(cj) z;
           

變量名加上一層或多層括号時, 編譯器會把它當成是一個表達式, 此時decltype會得到一個引用類型.

decltype((i)) d; //錯誤示例, d是int&, 必須初始化
           

疊代語句

for循環

for (declaration : expression)
    statemet
           

例子:

//将vector對象中每個元素都翻倍
vector<int> v = {0, 1, 2, 3, 5}

for (auto &r : v)
    r *= 2;
           

基本類型

string類型

string:: size_type

size_type是string中一種與機器無關的類型, 一個無符号類型的值而且能夠存放下任何string對象的大小,所有用于存放string類的size函數傳回值的變量, 都應該是string:: size_type類型的.

函數

可變形參函數

initializer_list

适用于全部類型都一樣的可變形參, 定義在同名頭檔案中, 同vector一樣, 也是種模闆類型. 拷貝或指派一個initializer_list對象不會拷貝清單中的元素, 拷貝後原始清單和副本共享元素

例子:

void error_msg(initializer_list<string> il)
{
    for (auto beg = il.begin(); beg != il.end(); ++beg)
    {
        cout << *beg << " ";
        cout << endl;
    }
}
           

函數重載

const_cast強轉重載函數

//比較兩個string的長度, 傳回較短的那一個
const string &shorterString(const string &s1, const string &s2)
{
    return s1.size() <= s2.size() ? s1 : s2;
}

//使用const_cast改造成比較非常量時傳回普通引用
string &shorterString(string &s1, string &s2)
{
    auto &r = shorterString(const_cast<const string&>(s1),
                const_cast<const string&>(s2));
    return const_cast<string&>(r);
}
           

constexpr函數

能用于常量表達式的函數, 函數傳回類型及所有形參類型都得是字面類型, 且函數體重有且隻有一條return語句

constexpr int new_sz() { return 42; }
constexpr int foo = new_sz();
           

函數指針

typedef和decltype定義函數類型及指針

//Func和Func2是函數類型
typedef bool Func(const string&, const string&);
tyedef decltype(lengthCompare) Func2;   //等價類型

//Func和Func2是指向函數的指針
typedef bool (*Func)(const string&, const string&);
typedef decltype(lengthCompare) *Func2; //等價類型
           

成員函數

  • 定義在類内部的函數是隐式的inline函數
  • 參數清單後加const, 用于修改隐式this指針類型, 便于指向常量, 限制this修改所指對象
  • C++11中可以通過在參數清單後面寫上= default來要求編譯器生成預設構造函數
  • 通過mutable關鍵字來聲明一個可變成員函數, 可在const成員函數中改變
  • 通過explicit限制一個實參的構造函數進行隐式轉換

委托構造函數

C++11中可使用委托構造函數來使用它所屬類的其它構造函數來執行自己的初始化過程

class Sales_data {
    Sales_data(std::string s, unsigned cnt, double price):
    bookNo(s), units_sold(cnt), revenu(cnt*price) {}
    Sales_data(): Sales_data("", 0, 0) {}
    Sales_data(std::string s): Sales_data(s, 0, 0) {}
    Sales_data(std::istream &is): Sales_data() {
        read(is, *this)
    }
}
           

轉載于:https://www.cnblogs.com/haoxi/p/7594583.html