我在VS2010中遇到了一个令人惊讶的问题。
这是我的main.cpp
的header.hclass 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);
为什么我没有收到错误?
答案 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的实例进行投射时才会执行转换。