C++类与对象

类和对象是C++面向对象编程的核心,可以将数据与操作封装为对象。

一、类的定义

使用class关键字可以定义一个类:

class Person {
  // 字段
  string name;
  int age;

  // 方法  
  void printInfo() {
    //...
  }
};

类包含数据字段和方法。

二、对象的创建

类定义后可以创建对象:

Person p1; 
p1.name = "John";
p1.age = 20;

对象包含类定义的数据和方法。

三、访问控制

public为公开访问,private为私有只能类内部访问:

class Person {
public:
  string name;

private:
  int age;
};

四、构造和析构

构造函数在创建对象时调用,析构函数在删除对象时调用。

在 C++中,构造函数和析构函数是用于对象的创建和销毁的特殊函数。

  • 构造函数:构造函数是类的一个特殊成员函数,用于在创建对象时初始化对象的成员变量。构造函数的名称与类名相同,并且没有返回类型。在创建对象时,会自动调用构造函数。

下面是一个简单的构造函数示例:

class MyClass {
public:
    MyClass(int x) {
        // 初始化成员变量
        m_x = x;
    }

private:
    int m_x;
};

在上面的代码中,MyClass类有一个构造函数MyClass(int x),它接受一个整数参数x,并将其赋值给成员变量m_x。当创建MyClass对象时,可以指定整数参数来初始化成员变量。

例如,可以这样创建一个MyClass对象:

MyClass obj(10); // 创建一个 m_x 为 10 的 MyClass 对象
  • 析构函数:析构函数是类的另一个特殊成员函数,用于在对象被销毁时释放对象占用的资源。析构函数的名称与类名相同,但前面加上了波浪号~,并且没有返回类型。在对象被销毁时,会自动调用析构函数。

下面是一个简单的析构函数示例:

class MyClass {
public:
    ~MyClass() {
        // 释放资源
    }

private:
    int* m_pData;
};

在上面的代码中,MyClass类有一个析构函数~MyClass(),它没有参数。在析构函数中,可以释放对象占用的资源,例如释放动态分配的内存。

例如,如果m_pData是一个动态分配的内存指针,可以这样释放它:

~MyClass() {
    delete m_pData;
}

需要注意的是,构造函数和析构函数是非常重要的,它们确保了对象的正确创建和销毁,避免了资源泄漏等问题。在编写类时,应该根据需要定义适当的构造函数和析构函数。

五、继承

类可以通过继承重用基类数据和方法:

class Student : public Person {
  // 继承Person
};

六、多态

多态是 C++面向对象编程的一个重要特性,它允许不同的对象以不同的方式响应相同的消息或操作。多态的实现依赖于虚函数和继承。

下面是一个简单的多态示例代码,演示了多态的概念:

class Shape {
public:
    virtual void draw() {
        // 抽象方法,需要子类实现
    }
};

class Circle : public Shape {
public:
    void draw() override {
        // 具体实现
        std::cout << "绘制圆形\n";
    }
};

class Square : public Shape {
public:
    void draw() override {
        // 具体实现
        std::cout << "绘制正方形\n";
    }
};

int main() {
    Circle circle;
    Square square;

    circle.draw(); // 绘制圆形
    square.draw(); // 绘制正方形

    return 0;
}

在上面的代码中,Shape类是一个抽象类,它有一个虚函数draw()CircleSquare类都是Shape类的子类,它们分别实现了draw()函数的具体行为。

main()函数中,创建了CircleSquare对象,并分别调用它们的draw()函数。由于draw()函数是虚函数,所以在运行时会根据对象的实际类型来调用相应的实现。因此,当调用circle.draw()时,会输出”绘制圆形”,而调用square.draw()时,会输出”绘制正方形”。

多态的优点是可以提高代码的灵活性和可扩展性。通过将公共的行为抽象到基类中,并让子类实现具体的行为,可以使代码更加模块化和可复用。同时,多态也使得代码更加易于维护和扩展,因为可以在不修改现有代码的情况下添加新的子类和行为。

类和对象是C++面向对象编程的基石,必须完全掌握。