C++11 帶來的新特性 (1)

1 語法改進

1.1 模板表達式中的空格

  • 在c++03 及之前
vector<list<int>>;   //Error
vector<list<int> >;  //OK
  • c++11
vector<list<int>>;   //OK

1.2 nullptr 和 std::nullptr_t

  • 在c++03 及之前
void f(int);
void f(void*);
f(0);  //call f(int)
f(NULL); //有歧義
  • c++11
f(nullptr);//call f(void*)

nullptr是關鍵詞,其類型是std::nullptr_tc++

2 auto-自動類型推斷

auto i = 42;   //int
double f();    
auto d = f();  //double
auto n;        //Error
static auto vat = 0.19;

vector<string> v;
auto pos = v.begin();

auto f = [](int x)-> bool{return x+1;}

3 for循環

基本形式:express

for( decl : coll ){
    statement
}

等價於:函數

for( auto _pos = coll.begin(), _end = coll.end(); _pos != NULL; ++_pos){
    decl = * _pos;
    statement
}

或者(其中begin()和end()是全局函數):編碼

for( auto _pos = begin(coll), _end = end(coll); _pos != NULL; ++_pos){
    decl = * _pos;
    statement
}
  • 示例1
for( int i : {2, 3, 4, 5,8} ){
    std::cout<< i << std::endl;
}
  • 示例2。使用引用方式,修改容器中的元素。
std::vector<double> vec;
...
for( auto & elem : vec ){
    elem *= 3;
}
  • 示例3。結合模板,同時使用const修飾元素。
template < typename T>
void printElements( const T& coll ){
    for( const auto& elem : coll ){
        std::cout<< elem << std::endl;
    }
}
  • 示例3。結合模板,同時使用const修飾元素。
template < typename T>
void printElements( const T& coll ){
    for( const auto& elem : coll ){
        std::cout<< elem << std::endl;
    }
}
  • 示例4。range方式使用for循環,會調用拷貝構造函數。
Get() const{
        return m_data;
    }   
private:
    int m_data;
};

ostream& operator<<(ostream& os, const X& x)
{
            os << x.Get();
                return os; 
}

int main(){
    vector<X> v = {1, 3, 5, 7, 9}; 
    cout << "\nElements:\n";
    for (auto x : v)
    {   
        cout << x << ' ';
    }   
    return 0;  
}

輸出:c++11

X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.

Elements:
X copy ctor.
1 X copy ctor.
3 X copy ctor.
5 X copy ctor.
7 X copy ctor.
9

爲了防止調用拷貝構造函數,提升下率,加上引用。code

for (auto &x : v)
    {   
        cout << x << ' ';
    }

執行輸出:ci

X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.
X copy ctor.

Elements:
1 3 5 7 9

發現已經不調用拷貝構造函數了。字符串

  • 反面示例。在for循環中,不能顯示調用(使用explicit)類型轉換函數:
class C  {
public :
    explicit C( const std::string & s); //顯示轉換
    ...
};

int main(){
    std::vector<std::string> vs;
    for( const C& elem : vs ){
        std::cout << elem << std::endl;
    }
}

報錯。去掉「explicit」後,可正常運行。string

invalid initialization of reference of type ‘const C&’ from expression of type ‘std::__cxx11::basic_string<char>’

4 字符串

  • 原始字符串

在字符串前面加上關鍵字R,表示這是一個原始字符串。
下面這兩個是等效的。it

"\\\\n"
    R"\\n"

下面這兩個也是等效的。

R"nc(a\
         b\nc()"
         )nc";
    "nc(a\\\n         b\\nc()\"\n         )nc";
  • 編碼的字符串

使用編碼前綴制定字符串編碼。以下

L"hello"    // 定義wchar_t編碼的字符串

前綴有如下幾種:
- u8表示UTF-8編碼。
- u表示char16_t
- U表示char32_t
- L表示寬字符集,類型wchar_t

5 強枚舉類型

c++11中的枚舉類型以下所示:

enum class Salutation : char { mr, ms, co, none };
  • 與int類型之間顯示轉換是不容許的。
  • 使用 Salutation::mr 方式引用枚舉類型。
  • 能夠顯示的指定一個後臺類型,如上例中的char。若是不顯示指定,默認是int類型。 待續。。。
相關文章
相關標籤/搜索