C++11(1)

统一的列表初始化


struct Point
{
    int _x;
    int _y;
   /*explicit*/ Point(int x,int y)
    :_x(x),_y(y){cout<<"1"<<endl;}
};


class A
{
    private:
    int _a;
    public:
    explicit A(int a)
    :_a(a){}

};


    //单参数类型支持隐式类型转换
void test2()
{
    A aa(2);//单参数的类型,可以使用正常的方式
    //A b=2;//也可以使用这种隐式类型的转换
    //2拷贝构造一个A,在进行拷贝构造成b
    //加一个explicit,就不能这样了
    string s1="hjs";//string的构造函数没有加explicit
    vector<string> v;
    v.push_back("hjk");//这也是隐式类型转换

}



void test1()
{

    //以前
    Point p={1,2};//c语言是使用这种方式来初始化
    int brr[5]={1,2,3,4,5};//使用这种大括号进行初始化

    
    //现在s
    int a=1;
    int b={2};//现在还可以这样进行初始化,=也省略了
    int c{3};
    int arr[5]{1,2,3,4};
    Point k{1,2};
    int * ptr=new int[5]{1,2,3};//初始化了前3个值,后面的值全都是0
    Point* ptrd=new Point[2]{{1,1},{2,2}};//现在还可以这样进行初始化,里面必须要又两个{}
    //new要去调用他的构造函数



    //正常调用point
    Point p1(1,2);//调用构造函数
    
    //c++11支持的多参数的构造函数
    Point p2={1,2};
    Point p3{1,2};



}

initializer_list


auto il={1,2,3};
void test3()

{
    //都是因为支持initializer_list的构造函数

    //以前的vector初始化
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    vector<int> v2={1,2,3,4};//现在vector也可以这样初始化, 掉的就是initializer list进行初始化

    initializer_list<int> lt={1,2,3};//
    list<int> l={1,2,3};//链表也可以这样初始化
    map<string,string> dic={{"dasd","dsa"},{"dsada","fd"}};//map也可以
    v2={10,20,30};//也可以用赋值,不是构造,在赋值运算符重载那里使用了initialzer_list 

    for(auto e:v2)
    {
        cout<<e<<" ";
    }

}
  List(initializer_list<T> ilt) //使用initializer_list进行初始化
        {
            _head = new Node;     //无参构造
            _head->_next = _head; //因为是双向链表
            _head->_prev = _head;

            typename initializer_list<T>::iterator it=ilt.begin();
            while(it!=ilt.end())
            {
                PushBack(*it);
                it++;
            }
        }

声明

auto

自动推导类型,范围for

decltype

推导对象的类型,可以作为模板参数


int func(int a)
{
    return a;
}
void test4()
{
    const int x=10;
    cout<<typeid(x).name()<<endl;//获得x的类型名字
    decltype(x) z=2;//获得x的类型名,来初始化另一个变量
    double y=2.2;
    decltype(x*y) ret;//ret类型为double
    decltype(&x) p;//p类型为int*

    int(*func)(int)=func;//函数指针
    auto pfunc=func;//直接用auto也可以
    decltype(pfunc) pfun3=func;//定义一个变量
    map<string,string> dict={{"sort","排序"},{"insert","插入"}};
    auto it=dict.begin();
    auto cpit=it;
    //但是不能把auto作为模板参数
    vector<decltype(it)> v;//这样就很方便
    v.push_back(it);

}

nullptr

避免了NULL 定义为0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevin~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值