
拷贝构造函数也是构造函数,所以一但声明,默认构造函数就失效了
class Str{
Str(int a){
}
fun(Str x){
}
}
int main(){
//隐式转换
Str x = 1;
//隐式转换
x.fun(2);
}
class Str{
explicit Str(int a){
}
}
class Str{
Str() = default;
//默认拷贝构造函数
//Str(const Str&) = default;
//自定义拷贝构造函数
Str(const Str& a){
//
}
}
int main(){
//使用默认的无参构造函数初始化
Str a;
//使用拷贝构造函数初始化
Str b(a);
//使用拷贝构造函数初始化
}
接收一个当前类右值引用对象的构造函数,它的出现是为了方便程序使用,同时更好的优化速度,移动构造函数移动数据到另一个变量,速度很快,应该就是换了个名字继续用,但是原先的变量就失效了,这个和引用有区别。
class Str{
Str() = default;
//拷贝构造函数
Str(const Str&) = default;
//默认的移动构造函数,注意这里没有const
Str(Str&&) = default;
//自定义的移动构造函数,注意这里没有const
Str(Str&& a){
}
}
int main(){
Str a;
//调用移动构造函数
//注意当没有移动构造函数时,会调用拷贝构造函数
//当既没有移动构造,也没有拷贝构造时,则会自己合成一个默认的移动构造函数,
//默认的移动构造函数会调用每个成员的移动构造函数
Str b = std::move(a);
}
class Str{
Str() = default
//,注意这里没有const
void fun(Str && data){
//这里data可以直接像普通左值变量一样使用
std::cout << data.x << std::endl;
}
public:
int x;
}