CPP 运算符 = 介于 2 个类之间

Cpp Operator = between 2 classes

本文关键字:之间 介于 运算符 CPP      更新时间:2023-10-16

我在VS2010中遇到了一个令人惊讶的问题。

这是我的主要标题.h.cpp

class A;
class B;
class A
{
public:
    double x,y;
    A();
    ~A();
    A(const A &obj);
    A(const B &obj);
    A& operator=(const A &obj);
};
class B
{
public:
    double x,y;
    B();
    ~B();
    B(const B &obj);
    B& operator=(const B &obj);
};

main.cpp 包含方法和 的声明:

#include "header.h"
#include <iostream>
int main() {
    A t;
    B u;
    A a(u);
    t=u;
    return 0;
}

如您所见,要做

A a(u);

我不得不添加此方法

A(const B &obj);

但对于

t=u;

它使用

A& operator=(const A &obj);

为什么我没有收到错误?

如果你想

避免这种情况,你应该将你的"A from B"构造函数标记为explicit

explicit A(const B &obj);

编译器将使用任何未标记为显式的构造函数进行隐式转换。

通过添加A(const B &obj);,您提供了一种将 B 转换为 A 的方法,该方法用于t=u;,以便编译器可以执行您的要求并且不需要错误。 可以进行转换,因为参数const A &obj允许转换。

如果出于某种原因,A(const B &obj)是卑鄙的,但您也希望t=u失败,那么您必须使用显式关键字禁用隐式类型转换。

这意味着,只有当您专门将 B 转换为 A 的实例时,才会执行转换。