为什么当我分配这个类的两个对象时,我的构造函数被调用?

我很困惑,如果这是显而易见的,我很抱歉。 我错了,在下面:

struct MyStruct { MyStruct(){}; MyStruct(MyStruct* arg){}; } 

MyStruct(MyStruct * arg){}; 是一个构造函数将一个指针指向一个MyStruct作为参数?

因为我有一个问题,这个构造函数(我认为是这样)被调用时,我这样做:

 int main() { MyStruct obj; MyStruct* objPtr; obj = objPtr; return 0; } 

当分配obj到objPtr我希望编译器抱怨,但它不,而是调用MyStruct(MyStruct * arg); 我认为这是一个构造函数采取指针参数。

任何帮助,将不胜感激。 此外,如果我添加一个复制赋值运算符到类,它仍然发生。

编辑:谢谢你的答案。 它看起来像我有一些阅读要做到这一点,这个话题似乎(任何人想知道)在C ++中转换构造函数。 另外我猜的明确的关键字。 下面是一个解释它的SO问题的链接:

什么是C ++中的转换构造函数? 这是为了什么?

  1. 编译器为您合成一个赋值运算符:

     MyStruct& MyStruct::operator=(MyStruct const&) = default; 
  2. 当它看到这个任务时,找到一个操作员的候选人(这是它创建的人)。 然后它看到它可以使用您的构造函数进行转换,以允许赋值( MyStruct )的类型。 所以归结为:

     obj = MyStruct (objPtr); 

如果你想看到错误发生,请将构造函数标记为显式:

 struct MyStruct { MyStruct(){}; explicit MyStruct(MyStruct* arg){}; } 

对于obj = objPtr; ,编译器将尝试使用参数objPtr (它是MyStruct* MyStruct::operator=()obj上调用MyStruct::operator=() 。 有一个候选人,隐式声明的复制赋值运算符MyStruct::operator=(const MyStruct&)MyStruct可以通过转换器构造函数MyStruct::MyStruct(MyStruct*)MyStruct*转换,因此可以编译。

如果explicit MyStruct::MyStruct(MyStruct*) ,则编译将失败。

 struct MyStruct { MyStruct(){}; explicit MyStruct(MyStruct* arg){}; }; 

当您将objPtr objPtrobj ,您将为objPtr分配一个类型为MyStruct*的值 – 这是无效的。 但是,由于你有一个带MyStruct*的构造函数,它被调用来转换值。 这基本上是一个隐式转换:)

 obj = objPtr; 

将会通知

 obj.MyStruct::operator =(MyStruct(objPtr)); 

explicit标记您的构造explicit以避免此类不需要的转换。