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之间的对比
网友评论