所以基本上我从这本书中学习游戏编程,我目前正在解释数据成员在哪里是指向存储在堆上的对象的指针。然后它执行一些成员函数,例如销毁/复制或分配给另一个对象。
所以基本上我想要了解的是当我打电话给三个功能时#34; testDestructor()
" /" testCopyConstructor(Critter aCopy)
"和" testAssignmentOp()
"是自动转到正确的成员函数,它可能听起来很傻但除非我误读了某些内容,否则我不会看到这本书解释每个函数如何转向正确的成员函数。
我不知道它的晚上11:30,也许我的大脑已经融化但是我已经重读了这整篇(几页)详细解释了程序中发生了三次,我无法做到头脑或者正确使用正确的成员函数如何没有某种"连接&#34 ;?的尾巴也许我错过了一些不成熟的东西。
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();
}
答案 0 :(得分:2)
我不确定你在问什么,但是:
在表达式中使用=
时会调用赋值运算符,例如在代码中:
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
所以调用此函数将使用其copy-constructor初始化aCopy
。
只要本地对象超出范围,就会调用析构函数,因此当}
结束时到达testDestructor
时,对象toDestroy
被毁了。
答案 1 :(得分:0)
我想要了解的是当我调用三个函数“testDestructor()”/“testCopyConstructor(Critter aCopy)”和“testAssignmentOp()”它是如何自动转到正确的成员函数时,它可能会发出声音愚蠢但除非我误读某些内容,否则我不会看到这本书解释每个功能如何成为正确的成员函数。
实例(非static
)成员函数总是传递一个隐藏指针作为它们的第一个参数 - 在名为this
的类中明确可用 - 它引用目标对象。这意味着当在类(对象)的任何实例上/上调用成员函数时,对成员变量的任何范围内引用都将通过指针指向this
实例。
(这个记录很好,并不需要一个新的问题。希望你的书在其他地方提到它!)