gpt4 book ai didi

c++ - 了解虚拟拷贝构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:00 25 4
gpt4 key购买 nike

我无法理解我用来学习 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);}
};

所以在这个Clone()函数我知道函数返回一个指向基类对象的指针。我不明白的是该功能中发生了什么。当我以前使用过 newint *pInt = new int ,我的印象是 new本质上是在空闲存储上为一个整数分配足够的内存,然后返回该地址,将该地址应用于指针 pInt .使用相同的逻辑,我试图理解 new Derived(*this)部分代码。所以,我认为它在空闲存储区为派生类对象分配足够的内存,并返回地址,然后由函数 Clone() 返回该地址。 .

但是,为什么它会通过 *this通过构造函数,如果那是构造函数?我明白*this意味着它传递了正在克隆的任何对象的地址,但我不明白 class_name(address_of_an_object) 的语法在 new 的上下文中功能。

有人可以解释一下那部分发生了什么吗?

提前致谢。

最佳答案

误区在这里:

*this means its passing the address of whatever object is being cloned

实际上,this是被克隆对象的地址,但是 *this (注意星号)是取消引用该地址的结果。所以*this类型为 Derived & ,它是对被克隆对象的引用,而不是它的地址。

因此,调用 new Derived(*this)意味着在动态分配空间后(这是 new 所做的),新空间由复制构造函数 Derived(const Derived &) 初始化,在这种情况下实际上并没有被用户定义,因此使用了(编译器生成的)默认版本的复制构造函数。


阐明 new 的语义:如果C是一个类,那么

new C;

C 类型的对象分配足够的空间然后调用 C 的构造函数初始化那个空间。这是 new 语义的一部分: 它总是调用构造函数来初始化新分配的空间。

当你打电话时

new C(a,b,c);

带有一些参数 a , bc , 然后 new将调用 C 的构造函数这需要这三个参数。如果没有定义这样的构造函数,您将收到编译器错误。

现在在你打电话的特殊情况下

new C(a);

带有一个参数a这本身就是 C& 类型, new将一如既往地调用适当的构造函数。适当的构造函数是 C(C &) (如果已定义),或 C(const C&) (由编译器自动定义的复制构造函数)。

关于c++ - 了解虚拟拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com