我很困惑,如果这是显而易见的,我很抱歉。 我错了,在下面:
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%?
随机无法parsing的外部符号,不应该在那里
任何帮助,将不胜感激。 此外,如果我添加一个复制赋值运算符到类,它仍然发生。
编辑:谢谢你的答案。 它看起来像我有一些阅读要做到这一点,这个话题似乎(任何人想知道)在C ++中转换构造函数。 另外我猜的明确的关键字。 下面是一个解释它的SO问题的链接:
什么是C ++中的转换构造函数? 这是为了什么?
使用printf将em-dash打印到控制台窗口?
为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] 举报,一经查实,本站将立刻删除。