美文网首页
现代c++笔记(2)

现代c++笔记(2)

作者: Teech | 来源:发表于2021-06-14 23:09 被阅读0次
    Explicit 构造函数
    • 避免隐式转换(不仅1个参数 ,多个参数一样)
    struct Complex {
        int real, image;
        explicit Complex(int re,int im=0):real(re),image(im){}
        //Complex(int re, int im = 0) :real(re), image(im) {}
        Complex operator+(const Complex& x) {
            return Complex(real + x.real, image + x.image);
        }
    };
    Complex x{ 3,5 };
    Complex x2 = x + 5; //编译不过,由于5不能被隐试转换成Complex 
    //如果P的构造函数explicit P(int a,int b,int c);这种定义
    //P({1,2,3}) 编译不过 initializer_list 也被编译不过
    //P(1,2,3)
    
    range based for
    for(decl:coll){
      statement
    }
    void fun1() {
        for (int i : {1, 2, 3})
            cout << i << endl;
    }
    vector<double> coll;
    //赋值
    for (auto p : coll)
      cout<<p<<endl;
    //直接拿引用 可以修改容器内容 关联式容器不能直接修改
    for (auto &p : coll)
      p *= 3;
    //等价于
    for(auto p = coll.begin();p!=coll.end();++p)
    {
      const auto& e = *p;
      e *= 3;
    }
    //
    class C {
    public:
        explicit C(const string& s);
        ...
    }
    vectors<string> vs;
    for (const C& ele : vs)//编译不过string不能隐试转换成C
    ;
    
    =default =delete
    //如果定义一个构造函数,那么编译器不会为你默认生成构造函数ctor
    //如果写上default表示需要编译器自动生成的构造函数,如果delete表示不需要
    //一般函数没有default,但是有delete,但是没意义
    //析构函数如果要default没问题,但是delete的话,只能new完 不能delete 也不能局部变量
    class Zoo {
    public:
        Zoo(int i1,int i2):d1(i1),d2(i2){}
        Zoo(const Zoo&) = delete;   //拷贝构造
        Zoo(Zoo&&) = default;       //右值引用 移动构造函数
        Zoo& operator=(const Zoo&) = default;//拷贝赋值
        Zoo& operator=(Zoo&&) = delete; //移动赋值
        virtual~Zoo(){}
    private:
        int d1, d2;
    };
    
    big five

    一般情况下,如果类中没有指针,一般可以用编译器自动生成的big Five函数(构造,拷贝构造,赋值构造,移动构造,移动赋值)。如果有指针一般就需要自己实现,比如标准库中的complex以及string之间的对比

    相关文章

      网友评论

          本文标题:现代c++笔记(2)

          本文链接:https://www.haomeiwen.com/subject/mqdaeltx.html