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. 类的成员函数与访问修饰符
- 成员函数:类的成员函数是与类相关联的函数,可以访问类的成员变量和其他成员函数。
- 可以通过
public、private、protected来指定成员的访问权限。
- 可以通过
- 访问修饰符:
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 << "Box length: " << getLength(box) << 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 << "Count: " << Counter::getCount() << endl; // 调用静态成员函数
return 0;
}
通过这一部分内容,你可以更深入地理解C++中的类和对象,掌握构造函数、析构函数、拷贝构造函数、赋值操作符以及静态成员等更复杂的概念。如果你对某些部分有不明白的地方,随时告诉我!
发表回复