单一参数构造函数
单一构造函数可以实现隐式类型转换
但是,有些情况我们不希望发生隐式类型转换。因为这会造成一些错误的语法的兼容。
显式的初始化可以避免隐式类型转换。
用static_cast也可以实现显式的类型转换。
拷贝构造函数
什么是拷贝构造函数 ?
接收一个当前类对象的构造函数
拷贝构造函数如果进行传值而不是传引用,可能会陷入一种无限递归。
拷贝构造函数不希望对拷贝的值进行修改。
移动构造函数
目的:进一步提升系统性能
场景:把旧对象赋予新对象,并且不再使用旧对象。
构造函数的参数列表中的参数要声明为右值,这样我们可以放心大胆地偷资源。
当某些特殊成员函数(如拷贝构造)未定义时,编译器可以合成一个移动构造函数。如果没有定义移动构造函数,但是定义了拷贝构造函数,默认的移动构造函数将采用拷贝构造函数。·
移动构造函数通常声明为不可抛出异常的函数。
Str2(Str2&&) noexcept
{
//...
}
什么情况会抛出异常?
分配内存时内存不够。拷贝构造函数可能会出现,移动构造函数一般不出现,但是如果以偶定构造函数调用拷贝构造函数时,可能会出问题。
vector在进行push_back的时候,有一个异常安全机制,就是发生异常时,也会保留原vector的值。注意,如果移动构造函数没有noexcept标志,vector将会调用拷贝构造函数来确保安全。
右值引用对象在表达式中是左值。
Str(str&& x) noexcept
{
std::string tmp =x.a;
//x被视为左值去使用
//想去偷资源 std::string tmp = std::move(x.a);
}