【编程语法-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 关键字的作用是明确这个值在程序中是不会改变的

虚函数是有代价的:

  • 需要额外的内存
  • 如果在使用嵌入式平台可能需要注意
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务