价值转换与参考演员

rak*_*afo 5 c++ c++11

值演员参考演员有什么区别?为什么其中一个调用转换(又称创建新对象)而其他不调用?在rhs上使用铸造的注意事项是什么?

假设Derived.为什么那些人实际上不会施放到Base

*this = (Base&) rhs
(Base)* this = rhs
Run Code Online (Sandbox Code Playgroud)

你能用简单的例子来表示吗?

das*_*ght 3

价值转型从现有价值创造新价值;引用转换创建对相同现有值的新引用。

引用转换既不会更改现有对象的内容,也不会创建新对象;它仅限于改变对已有值的解释。另一方面,值转换可以从现有对象创建新对象,因此限制较少。

例如,如果您有一个unsigned char并且想要一个类型的值或引用int,则值转换将起作用,而引用转换将失败:

unsigned char orig = 'x';
int  v(orig); // Works
int &r(orig); // Does not work
Run Code Online (Sandbox Code Playgroud)

rhsDerived,我想将所有继承和非继承的东西分配rhsBase

然后您需要将两边都转换为Base,或者添加一个Derived以 aconst Base&作为参数的赋值运算符。这是一个双向转换的示例(其他程序员阅读您的代码可能很难理解)

struct Base {
    int x;
    Base(int x) : x(x) {}
};
struct Derived1 : public Base {
    Derived1(int x) : Base(x) {}
};
struct Derived2 : public Base {
    Derived2(int x) : Base(x) {}
};
Run Code Online (Sandbox Code Playgroud)

运行下面的代码

Derived1 d1(5);
Derived2 d2(10);
cout << d1.x << " " << d2.x << endl;
((Base&)d1) = (Base&)d2;
cout << d1.x << " " << d2.x << endl;
Run Code Online (Sandbox Code Playgroud)

产生以下打印输出:

5 10
10 10
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,作业将's部分((Base&)d1) = (Base&)d2的内容复制到's部分(demo)。d2Based1Base