gpt4 book ai didi

c++ - 我的函数如何连接到正确的成员函数

转载 作者:行者123 更新时间:2023-11-28 02:23:27 24 4
gpt4 key购买 nike

所以基本上我是从这本书中学习游戏编程的,我目前正在解释数据成员在哪里是指向存储在堆上的对象的指针。然后它执行几个成员函数,例如销毁/复制或分配给另一个对象。

基本上我想了解的是当我调用三个函数“testDestructor()”/“testCopyConstructor(Critter aCopy)”和“testAssignmentOp()"会自动转到正确的成员函数,这听起来可能很傻,但除非我误读了什么,否则我看不到这本书解释了每个函数如何转到正确的成员函数。

我不知道现在是晚上 11 点 30 分,也许我的大脑已经融化了,但我已经重读了整个(几页)关于程序中发生的事情的详细解释三遍,我无法弄清楚它是如何进行的在没有某种“连接”的情况下正确使用正确的成员函数?也许我缺少一些基本的东西。

P.S 我明白代码本身发生了什么,我只是不知道函数如何调用正确的成员函数

/Heap Data Member
//Demonstrates an object with a dynamically allocated data member

#include <iostream>
#include <string>

using namespace std;

class Critter
{
public:
Critter(const string& name = "", int age = 0);
~Critter(); //destructor prototype
Critter(const Critter& c); //copy constructor prototype
Critter& Critter::operator=(const Critter& c); //overloaded assignment op
void Greet() const;

private:
string* m_pName;
int m_Age;
};

Critter::Critter(const string& name, int age)
{
cout << "Constructor called\n";
m_pName = new string(name);
m_Age = age;
}

Critter::~Critter() //destructor definition
{
cout << "Destructor called\n";
delete m_pName;
}

Critter::Critter(const Critter& c) //copy constructor definition
{
cout << "Copy Constructor called\n";
m_pName = new string(*(c.m_pName));
m_Age = c.m_Age;
}

Critter& Critter::operator=(const Critter& c) //overloaded assignment op def
{
cout << "Overloaded Assignment Operator called\n";
if (this != &c)
{
delete m_pName;
m_pName = new string(*(c.m_pName));
m_Age = c.m_Age;
}
return *this;
}

void Critter::Greet() const
{
cout << "I'm " << *m_pName << " and I'm " << m_Age << " years old. ";
cout << "&m_pName: " << cout << &m_pName << endl;
}

void testDestructor();
void testCopyConstructor(Critter aCopy);
void testAssignmentOp();

int main()
{
testDestructor();
cout << endl;

Critter crit("Poochie", 5);
crit.Greet();
testCopyConstructor(crit);
crit.Greet();
cout << endl;

testAssignmentOp();

return 0;
}

void testDestructor()
{
Critter toDestroy("Rover", 3);
toDestroy.Greet();
}

void testCopyConstructor(Critter aCopy)
{
aCopy.Greet();
}

void testAssignmentOp()
{
Critter crit1("crit1", 7);
Critter crit2("crit2", 9);
crit1 = crit2;
crit1.Greet();
crit2.Greet();
cout << endl;

Critter crit3("crit", 11);
crit3 = crit3;
crit3.Greet();
}

最佳答案

我不太确定你在问什么,但是:

当您在表达式中使用 = 时,将调用赋值运算符,例如在您的代码中:

crit1 = crit2;
crit3 = crit3;

不要与在声明中使用 = 符号混淆(无论如何您都不会这样做)。

构造函数 在您尝试创建对象时被调用,例如:

Critter crit2( "crit1", 7 );    // constructor

其他行可能看起来像:

Critter crit4;             // default constructor
Critter crit5(crit3); // copy-constructor

如果构造函数采用一个参数,而该参数是同一类型的另一个对象,则称为复制构造函数。这只是一个术语问题,复制构造函数和其他构造函数之间没有更根本的区别。

在你的函数 void testCopyConstructor(Critter aCopy) 中,你可以看到它有一个参数 Critter aCopy。当您将参数 crit 传递给函数时,就像您使用函数参数创建参数一样:

Critter aCopy(crit);    // equivalent

因此调用此函数将使用其复制构造函数初始化 aCopy

析构函数 会在本地对象超出作用域时被调用,因此当 到达 testDestructor 末尾时,然后对象 toDestroy 被销毁。

关于c++ - 我的函数如何连接到正确的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31506683/

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