微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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); 我认为这是一个构造函数采取指针参数。

将.lib文件添加到Visual Studio 2015中的项目

MS Visual Studio Professional 2013 – C ++为32位和64位操作系统编译单个可执行文件

为什么Visual Studio 2015只允许我使用1核心的50%?

错误C2327:不是types名称,静态或枚举器

随机无法parsing的外部符号,不应该在那里

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

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

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

使用printf将em-dash打印到控制台窗口?

没有configuration存储复制的ucma端点

为VS命令行编译器设置正确的path

一般C ++ Linux到Windows的移植问题

Windows窗体devise器重命名复制/粘贴控件

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

MyStruct& MyStruct::operator=(MyStruct const&) = default;

当它看到这个任务时,找到一个操作员的候选人(这是它创建的人)。 然后它看到它可以使用您的构造函数进行转换,以允许赋值( 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 objPtr为obj ,您将为objPtr分配一个类型为MyStruct*的值 – 这是无效的。 但是,由于你有一个带MyStruct*的构造函数,它被调用来转换值。 这基本上是一个隐式转换:)

obj = objPtr;

将会通知

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐