Cpp操作员=两个班级之间

时间:2014-02-14 08:49:35

标签: c++ operators

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

这是我的main.cpp

的header.h
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);

为什么我没有收到错误?

3 个答案:

答案 0 :(得分:2)

如果你想避免这种情况,你应该将你的“A from B”构造函数标记为explicit

explicit A(const B &obj);

任何未标记为显式的构造函数都将被编译器用于隐式转换。

答案 1 :(得分:0)

通过添加A(const B &obj);,您提供了一种将B转换为A的方法,该方法在t=u;中使用,因此编译器可以执行您所要求的操作,并且不需要任何错误。转换可以完成,因为参数const A &obj允许转换。

答案 2 :(得分:0)

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

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