Ein*_*rDS 4 c++ class copy-constructor
我无法理解我用来学习C++的书中的代码实际发生了什么.这是代码:
class Base
{
public:
Base() {};
virtual ~Base() {};
virtual Base* Clone() {return new Base(*this);}
};
class Derived
{
public:
Derived() {};
virtual ~Derived() {};
virtual Base* Clone() {return new Derived(*this);}
};
Run Code Online (Sandbox Code Playgroud)
所以在这个Clone()
函数中我理解该函数返回一个指向Base类对象的指针.我不明白的是该功能正在发生什么.当我以前使用new
过时int *pInt = new int
,我的印象是new
基本上在免费存储上为整数分配足够的内存,然后返回该地址,将地址应用于指针pInt
.使用相同的逻辑,我试图理解new Derived(*this)
代码的一部分.所以,我认为它是在Derived类对象的免费存储上分配足够的内存,并返回该函数返回的地址Clone()
.
但是,为什么它会*this
通过构造函数,如果它是构造函数?我理解*this
它意味着它传递任何被克隆对象的地址,但我不理解函数class_name(address_of_an_object)
上下文中的语法new
.
有人可以解释一下这部分发生了什么吗?
提前致谢.
jog*_*pan 10
误解在这里:
*this
表示它传递正在克隆的任何对象的地址
实际上,this
是正在克隆的对象的地址,但*this
(注意星号)是解除引用该地址的结果.所以*this
是类型Derived &
,它是对被克隆对象的引用,而不是它的地址.
因此,调用new Derived(*this)
意味着在动态分配空间之后(这是什么new
),新空间由复制构造函数初始化Derived(const Derived &)
,在这种情况下实际上并没有用户定义,因此(编译器生成的)默认版本的使用了复制构造函数.
澄清语义new
:如果C
是一个类,那么
new C;
Run Code Online (Sandbox Code Playgroud)
为类型的对象分配足够的空间C
,然后调用构造函数C
初始化该空间.这是语义的一部分new
:它总是调用构造函数来初始化新分配的空间.
你打电话的时候
new C(a,b,c);
Run Code Online (Sandbox Code Playgroud)
有一些参数a
,b
并且c
,然后new
将调用构造函数C
是需要这三个参数.如果没有定义这样的构造函数,则会出现编译器错误.
现在在你打电话的特殊情况下
new C(a);
Run Code Online (Sandbox Code Playgroud)
如果一个参数a
本身就是类型C&
,new
将一如既往地调用适当的构造函数.适当的构造函数C(C &)
(如果已定义)或C(const C&)
(由编译器自动定义的复制构造函数).
归档时间: |
|
查看次数: |
3927 次 |
最近记录: |