现代c++笔记(2)

2021-06-14  本文已影响0人  Teech
Explicit 构造函数
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之间的对比

上一篇下一篇

猜你喜欢

热点阅读