假设我必须进行类型转换(从一个类的对象到另一个类的对象) 然后我知道它可以通过两种方式完成
1-通过在目的地侧制作构造函数
2-通过使用转换函数(运算符)
所以,我想知道构造函数如何作为构造函数被调用,只有在创建对象时才调用,而在我们的情况下,由于我的对象已经创建,因此没有对象的创建...
例: 假设有两个类测试和基础, 然后
void main
test ob1
base ob2
(ob1=ob2) how this statement calls constructor?
我将链接附加到我的程序代码.. http://codepad.org/1IK4R3Q8
答案 0 :(得分:0)
如果该语句调用构造函数,那么它也将调用析构函数。您显示的主要操作是operator=
,ob1
分配了某些内容。
某些可能是test
类型的临时属性,可能是以您描述的两种方式之一创建的,在这种情况下,在调用析构函数operator=
之后。但是您描述的转换可能性可能会返回test&
或test const&
而operator=
可能会采用该转换,因此不需要构造函数或析构函数。
您可能还需要进行任何转换。可能是test::operator=
有一个超载来直接获取提供的base&
而没有先转换它。
答案 1 :(得分:0)
您所看到的是隐式转换构造。编译器正在调用类con
的复制构造函数,它将类型为test
的对象作为参数。
编译器找不到兼容的赋值运算符,因此它会看到它是否可以通过其他方式转换ob1
对象。
它发现con
类具有兼容的复制构造函数,因此它会隐式调用 以允许进行赋值。
参见参考here:
隐式声明和用户定义的非显式复制构造函数 并且移动构造函数正在转换构造函数。
您可以在explicit
中的复制构造函数声明之前使用关键字con
来避免此行为。这将阻止编译器隐含地调用它。