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 次 |
| 最近记录: |