【编程语法-C++】课堂总结25-28
构造函数与析构函数
构造函数是在我们初始化一个类的时候调用,如果一个变量没被赋值,那么它就依旧保存内存里存在的值。
class Entity
{
float X, Y;
// 构造函数
// 就算不写,默认的构造函数如下,不干任何事情
// Entity() {}
// 也可以带参数,类似python的__init__()
Entity()
{
X = 0.0f;
Y = 0.0f;
}
~Entity()
{
std::cout << "Destroyed Entity" << std::endl;
}
void Print()
{
std::cout << X << Y << std::endl;
}
};
int main()
{
Entity e;
e.Print(); // 这个是可以执行的,因为没有构造函数初始化,X,Y是随机的值
std::cout << e.X << std::endl; // 这个会报错,X没有初始化
std::cin.get();
}继承
class Entity
{
public:
float X, Y;
void Move(float xa, float ya)
{
X += xa;
Y += ya;
}
};
class Player : public Entity
{
public:
const char* Name;
void PrintName()
{
std::cout << Name << std::endl;
}
};
std::cout << sizeof(Player) << std::endl; // 12 (4 byte 字符 和 8 byte float)虚函数
如果要覆盖函数,你必须在基类里将基函数标记为虚函数。
class Entity
{
public:
virtual std::string GetName() { return "Entity"; } // 添加virtual关键字
};
class Player : Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name) { m_Name = name; }
std::string GetName() override { return m_Name;} // 添加override关键字让代码更具有可读性
};
void Print(Entity* entity)
{
std::cout << entity->GetName() << std::endl;
}
int main()
{
Entity e;
Player p("zhubin");
Print(e);
Print(p); //在没有虚函数的时候,会打印同样的值,因为p虽然是Player的实例但调用的Entity的方法。
}const 关键字的作用是明确这个值在程序中是不会改变的
虚函数是有代价的:
- 需要额外的内存
- 如果在使用嵌入式平台可能需要注意