为什么在分配该类的两个对象时会调用我的构造函数?

Zeb*_*ish 1 c++ windows constructor visual-studio

我很困惑,如果这很明显,我很抱歉.我错了以下内容:

 struct MyStruct
    {
       MyStruct(){};
       MyStruct(MyStruct* arg){};
    }
Run Code Online (Sandbox Code Playgroud)

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

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

int main()
{
   MyStruct obj;
   MyStruct* objPtr;
   obj = objPtr;

   return 0;
} 
Run Code Online (Sandbox Code Playgroud)

将obj分配给objPtr时我希望编译器抱怨,但它不会,而是调用MyStruct(MyStruct*arg); 我认为这是一个采用指针参数的构造函数.

任何帮助,将不胜感激.此外,如果我在课程中添加了一个复制赋值运算符,它仍会发生.

编辑:谢谢你的回答.看起来我已经有了一些关于这个的阅读,主题似乎是(对于任何想知道的人)在C++中转换构造函数.我也猜测显式关键字.这是一个解释它的SO问题的链接:

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

Sto*_*ica 6

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

    MyStruct& MyStruct::operator=(MyStruct const&) = default;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当它看到赋值时,它会找到运算符的候选者(它是它创建的候选者).然后它看到它可以使用你的构造函数进行转换,转换为允许赋值(MyStruct)的类型.所以归结为:

    obj = MyStruct (objPtr);
    
    Run Code Online (Sandbox Code Playgroud)

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

struct MyStruct
{
   MyStruct(){};
   explicit MyStruct(MyStruct* arg){};
}
Run Code Online (Sandbox Code Playgroud)