当我分配该类的两个对象时,为什么调用我的构造函数
Why is my constructor being called when I assign two objects of that class?
我很困惑,如果这很明显,我很抱歉。我在以下方面错了吗:
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++中的转换构造函数是什么?它是干什么的?
-
编译器为您合成一个赋值运算符:
MyStruct& MyStruct::operator=(MyStruct const&) = default;
-
当它看到赋值时,它会为操作符找到一个候选者(即它创建的操作符(。然后它看到它可以使用您的构造函数进行转换,转换为允许赋值的类型(
MyStruct
(。所以它可以归结为:obj = MyStruct (objPtr);
如果您希望看到错误发生,请将您的构造函数标记为显式:
struct MyStruct
{
MyStruct(){};
explicit MyStruct(MyStruct* arg){};
}
对于obj = objPtr;
,编译器将尝试使用参数objPtr
(即MyStruct*
(在obj
上调用MyStruct::operator=()
。有一个候选者,即隐式声明的复制赋值运算符MyStruct::operator=(const MyStruct&)
。MyStruct
可以通过转换器构造函数MyStruct::MyStruct(MyStruct*)
从MyStruct*
转换而来,因此它进行编译。
如果将MyStruct::MyStruct(MyStruct*)
设置为explicit
,则编译将失败。
struct MyStruct
{
MyStruct(){};
explicit MyStruct(MyStruct* arg){};
};
当您将objPtr
分配给obj
时,您将为MyStruct
分配类型为MyStruct*
的值,这是无效的。但是,由于您有一个采用MyStruct*
的构造函数,因此会调用它来转换值。它基本上是一个隐式转换:(
obj = objPtr;
将调用
obj.MyStruct::operator =(MyStruct(objPtr));
将构造函数标记为explicit
,以避免这种不需要的转换。
- 如何返回一个类的两个对象相加的结果
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何在Qt中连接来自不同窗口的两个对象?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- C++两个对象,其中包含指向同一数组不同部分的指针
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值
- C++控制台应用,其中有两个冲突的对象不工作
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 当两个 std::map 对象相同时
- C++:在另外两个对象之间共享一个对象
- 为什么这两个卡片对象不等同?