隐式转换
类变量刚被定义时使用 = 一个非同类的其它类型变量;其实是调用对应的构造函数。进行初始化,这一过程是编译器识别的。 = 一个同类的变量则是调拷贝构造(此篇文章不讲)
代码说事
#include <iostream>
using namespace std;
class Test
{
public:
Test() {
cout << "Test()" << endl;
}
explicit Test(const int& num) {
a = num;
cout << "Test(int& num)" << endl;
}
Test(const int&& num) {
a = num;
cout << "Test(int&& num)" << endl;
}
Test& operator=(const Test& obj) {
*this = obj;
cout << "Test=" << endl;
}
int a;
};
int main() {
int temp = 0;
Test a = 3;
cout << "************************" << endl;
// Test b = temp; // 编译不过,因为禁止作值隐式转换 Test(int& num)
Test b = std::move(temp); // 转化成右值可以编译
}
输出
Test(int&& num)
************************
Test(int&& num)
explicit
explicit 关键作用就是告诉编译器不要给我 进行隐式转换。上述代码的例子类似于智能指针 unique_ptr ,他禁止了左值的隐式转换。想要 定义一个新的
unique_ptr 指向旧的 unique_ptr 要使用 std::move() 夺取旧指针对其对象的控制权。与上述代码不同之处,两个智能指针是同类数据,所以unique_ptr的实现 使用 privete: 私有了其 左值拷贝构造。