C++11新特性

一、原生字符串(raw string literals)

比如我们写硬盘上一个文件的访问路径:"C:\Program Files\Microsoft.NET\ADOMD.NET",你需要把它写成以下格式

string path = "C:\\Program Files\\Microsoft.NET\\ADOMD.NET";

 

这样取消字符串转义太麻烦了,C++11下可以这样写:

string path = R"(C:\Program Files\Microsoft.NET\ADOMD.NET)";

除了上面这样,你还可以使用引号

string path = R"(this "word" is good)";

二、委托构造函数(Delegating constructors)

说简单一点就是你的一个构造函数可以调用另一个构造函数

#include <bits/stdc++.h>
using namespace std;
multimap<int, int> r;
multimap<int, int>::iterator it;
class people
{
public:
    string name;
    int age;
    int id;
    people(int age,int id):age(age),id(id)
    {
        
    }
    //委托构造函数不能具有其他成员初始化表达式
    // people(int age,int id,string name):name(name),people(age,id)
    // {

    // }
    people(int age,int id,string name):people(age,id)
    {
        
    }
}

三、初始化列表

用列表的形式来初始化数组,这种方式非常直观,但只能适用于数组,不能适用于我们自定义的容器: 

int anArray[5] = { 3, 2, 7, 5, 8 }; // ok

std::vector<int> vArray = { 3, 2, 7, 5, 8 }; // 不支持

C++11现在支持了

#include <bits/stdc++.h>
using namespace std;
template<typename T>
class test{
    private:
     vector<T> arr;
    public:
     test(){}
     test(const initializer_list<T>& li){
         for(auto x : li){
             arr.push_back(x);
         }
     }
};
class Value{
    public:
    int x,y;
    double z;
    Value(int a,int b,double c):x(a),y(b),z(c){

    }
};
int main(){
    test<int> t={1,2,3,4};
    return 0;
}

四、统一初始化

C++对象初始化方法有很多种,C++ 11中,允许通过以花括号的形式来调用构造函数。这样多种对象构造方式便可以统一起来了

#include <bits/stdc++.h>
using namespace std;
multimap<int, int> r;
multimap<int, int>::iterator it;
class Value{
    public:
    int x,y;
    double z;
    //不加这个构造函数也不会报错,但是为了看起来清晰建议还是加上
    Value(int a,int b,double c):x(a),y(b),z(c){

    }
};
Value te(){
    return {1,2,0.1};
}
int main(){
    Value v = te();
    printf("%d %d %lf\n",v.x,v.y,v.z);
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
multimap<int, int> r;
multimap<int, int>::iterator it;
int main()
{
    r.insert({1,2});
    r.insert({1,3});
    for(it=r.begin();it!=r.end();it++){
        printf("%d %d\n",it->first,it->second);
        //std:cout << it->first << " is " << it->second << std::endl;
    }
    return 0;
}

 

posted @ 2021-05-01 12:27  kongbursi  阅读(126)  评论(0编辑  收藏  举报