C++ 类和对象(下)

在上一部分我们讲解了类的基本概念和成员变量、成员函数的定义。接下来,我们会深入一些概念和更复杂的内容,帮助你更好地理解类和对象的使用。

1. 构造函数与析构函数

  • 构造函数:构造函数是一种特殊的成员函数,当你创建类的对象时,它会自动被调用。构造函数主要用于初始化对象的状态。
    • 构造函数的名称与类名相同。
    • 构造函数没有返回类型。
    • 如果没有显式定义构造函数,编译器会提供一个默认构造函数。
    示例class Car { public: string brand; int year; // 构造函数 Car(string b, int y) { brand = b; year = y; } }; int main() { Car myCar("Toyota", 2020); // 创建对象时自动调用构造函数 cout << myCar.brand << " " << myCar.year << endl; return 0; }
  • 析构函数:析构函数是在对象生命周期结束时自动调用的函数。它用于释放资源(例如动态分配的内存)。析构函数没有返回类型,且没有参数。 示例class Car { public: string brand; int year; Car(string b, int y) { brand = b; year = y; } // 析构函数 ~Car() { cout << "The car " << brand << " has been destroyed." << endl; } }; int main() { Car myCar("Honda", 2018); // 析构函数将在程序结束时自动调用 return 0; }

2. 拷贝构造函数与赋值操作符

  • 拷贝构造函数:拷贝构造函数用于创建一个对象的副本,或者将一个对象赋值给另一个对象。
    • 默认的拷贝构造函数只是逐个成员赋值,如果类中有动态分配的资源(例如指针),则可能需要自定义拷贝构造函数。
    示例class Person { public: string name; int age; Person(string n, int a) { name = n; age = a; } // 自定义拷贝构造函数 Person(const Person& p) { name = p.name; age = p.age; } }; int main() { Person p1("Alice", 25); Person p2 = p1; // 拷贝构造函数被调用 cout << p2.name << " " << p2.age << endl; return 0; }
  • 赋值操作符:如果你想显式地定义对象赋值的行为,你需要重载赋值操作符operator=。默认的赋值操作符会进行成员逐个赋值,但在类包含指针成员时可能需要自定义。 示例class Person { public: string name; int age; Person(string n, int a) { name = n; age = a; } // 自定义赋值操作符 Person& operator=(const Person& p) { if (this == &p) // 防止自赋值 return *this; name = p.name; age = p.age; return *this; } }; int main() { Person p1("Bob", 30); Person p2("John", 40); p2 = p1; // 赋值操作符被调用 cout << p2.name << " " << p2.age << endl; return 0; }

3. 类的成员函数与访问修饰符

  • 成员函数:类的成员函数是与类相关联的函数,可以访问类的成员变量和其他成员函数。
    • 可以通过publicprivateprotected来指定成员的访问权限。
  • 访问修饰符
    • public:公有成员,可以被任何函数访问。
    • private:私有成员,只能被该类的成员函数访问,外部不能直接访问。
    • protected:保护成员,可以在派生类中访问。
    示例class Rectangle { private: int width, height; // 私有成员 public: void setDimensions(int w, int h) { // 公有成员函数 width = w; height = h; } int area() { return width * height; } }; int main() { Rectangle rect; rect.setDimensions(5, 10); cout << "Area: " << rect.area() << endl; return 0; }

4. 友元函数(Friend Function)

友元函数是一个在类外部但能够访问类的私有成员的函数。它不是类的成员,但可以访问类中的私有和保护成员。

示例

class Box {
private:
    int length;
public:
    Box(int l) : length(l) {}
    friend int getLength(Box b);  // 声明友元函数
};

int getLength(Box b) {
    return b.length;  // 友元函数可以访问私有成员
}

int main() {
    Box box(10);
    cout &lt;&lt; "Box length: " &lt;&lt; getLength(box) &lt;&lt; endl;
    return 0;
}

5. 静态成员(Static Members)

静态成员变量和静态成员函数是类的成员,但它们不属于某个特定的对象,而是属于整个类。静态成员变量通常用于存储类级别的数据,静态成员函数则只能访问静态成员变量。

  • 静态成员变量:所有对象共享一个静态变量,静态变量会被所有实例所共享。
  • 静态成员函数:静态函数只能访问静态成员变量,不能访问普通的成员变量。

示例

class Counter {
private:
    static int count;  // 静态成员变量
public:
    Counter() {
        count++;
    }
    static int getCount() {  // 静态成员函数
        return count;
    }
};

int Counter::count = 0;  // 初始化静态成员变量

int main() {
    Counter c1, c2;
    cout &lt;&lt; "Count: " &lt;&lt; Counter::getCount() &lt;&lt; endl;  // 调用静态成员函数
    return 0;
}


通过这一部分内容,你可以更深入地理解C++中的类和对象,掌握构造函数、析构函数、拷贝构造函数、赋值操作符以及静态成员等更复杂的概念。如果你对某些部分有不明白的地方,随时告诉我!