C++ 学习7

148 阅读2分钟

1.1 析构函数(destructor)

  1. 析构函数是在销毁对象时自动调用,作用是完成对象的清理工作,例如释放动态分配的内存、关闭文件等。清理内存等。同样适用于栈和堆分配的对象。
  2. 当你用new分配一个对象,调用delete,析构函数会调用。
  3. 在C++中,析构函数的名称与类名相同,前面加上波浪线(~)。它没有参数和返回值,并且只能有一个析构函数。

需要注意的是,当对象被显式地删除(delete)时会先调用析构函数,然后再释放对象占用的内存。同样地,当对象是通过new运算符动态创建的,需要手动使用delete来释放对象的内存,确保析构函数能够被调用。

因为是栈分配(对象在栈上创建,超出作用域,自动销毁),只有当主函数退出时,析构函数才会被调用。作用:避免人清理不足,出现内存泄漏。

如果是在堆上分配对象,需要手动清理。

1.2 C++的继承(inheritance)

定义:C++中的继承是一种面向对象编程的重要概念,允许一个类(称为_派生类_或子类)             从另一个类(称为基类或父类)继承属性和行为。通过继承,子类可以使用父类               已定义的成员变量和成员函数,并且可以扩展或修改它们。

补充词汇:   Inheritance - 继承    Base class - 基类         Derived class - 派生类                          Superclass - 超类       Subclass - 子类       Public inheritance - 公有继承                       Protected inheritance - 保护继承            Private inheritance - 私有继承                      Member variable - 成员变量                        Member function - 成员函数                      Override - 覆盖                            Access level - 访问级别                                                Code reuse - 代码重用                    Polymorphism - 多态性                                           Modular - 模块化的                            Extensible - 可扩展的                                         Constructor - 构造函数                            Destructor - 析构函数

#include <iostream>
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;
   }
};

int main()
{
   std::cout << sizeof(Entity) << std::endl;
   std::cout << sizeof(Player) << std::endl;
   Player player;
   player.Move(5,5);
   player.X = 2;
   player.Y = 3;


   std::cin.get();
}

结果:

1.3 虚函数(Virtual function)

       虚函数是面向对象编程中的一个重要概念,它用于实现运行时多态性(runtime polymorphism)。在基类中声明为虚函数的成员函数,可以在派生类中进行重写,并且在运行时根据对象的实际类型来调用相应的函数
在C++中,通过在基类中将需要实现多态性的成员函数声明为virtual,可以使其成为虚函数。派生类可以对虚函数进行重写,而且可以根据需要进行动态绑定。

#include <iostream>
#include <string>

class Entity
{
public:
   virtual std::string GetName() { return "Entity";}
   //虚函数player类也可用了
};

class Player : public Entity
{
private:
   std::string m_Name;
public:
   Player(const std::string& name)
      : m_Name(name) {}

   std::string GetName(){return m_Name;}
};

void PrintName(Entity* entity)
{
   std::cout << entity->GetName() << std::endl;
}

int main()
{
   Entity* e = new Entity();
   PrintName(e);
   //std::cout << e->GetName() << std::endl;

   Player* p = new Player("yameng");
   PrintName(p);//函数在类内部起作用

   delete e;
   delete p;
   std::cin.get();
}

结果:

 #include <iostream>

class Animal
{
public:
   virtual void MakeSound()
   {
      std::cout << "Animal makes a sound!" << std::endl;
   }
};

class Dog:public Animal
{
public:
   void MakeSound() override
   {
      std::cout << "dog barks" << std::endl;
   }
};

class Cat:public Animal
{
public:
   void MakeSound() override
   {
      std::cout << "cat memos" << std::endl;
   }
};

int main()
{
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->MakeSound(); // Dog barks!
    animal2->MakeSound(); // Cat meows!

    delete animal1;
    delete animal2;

    return 0;
}

结果: