**C++ 类和对象**
在 C++ 中,类(Class)是创建对象的蓝图,它定义了一组特性和行为,这些特性和行为是通过数据成员(fields)和成员函数(methods)来实现的。对象是类的实例,它们拥有类定义的属性和功能。
1. **作用域区分符 `::`**
作用域区分符 `::` 用于明确标识成员函数或数据成员属于哪个类。例如,在类外部定义成员函数时,我们需要使用 `User::` 前缀来表明 `getUserId()` 是 `User` 类的成员:
```cpp
double User::getUserId(void) { return userId; }
```
在对象上调用成员函数通常使用点运算符 `.`,如 `user.getUserId()`。
2. **构造函数**
构造函数是特殊类型的成员函数,用于初始化新创建的对象。在类定义中,我们可以声明构造函数,例如:
```cpp
User::User(int length) {
cout << "length=" << length << endl;
length = length;
}
```
在主函数中,我们可以通过传递参数来调用构造函数,如 `User user(18);`。初始化列表用于按声明顺序初始化成员变量,例如:
```cpp
User::User(int length, int age) : length(length), age(age) {}
```
3. **析构函数**
析构函数以波浪号 `~` 开头,其名称与类名相同,但不返回任何值且不接受参数。析构函数主要用于在对象生命周期结束时释放资源。例如:
```cpp
User::~User() {
cout << "析构函数调用" << endl;
}
```
每个类只有一个析构函数,而可以有多个构造函数。
4. **拷贝构造函数**
拷贝构造函数是一个特殊的构造函数,用于通过已存在的对象来创建新对象。它的形式如下:
```cpp
classname(const classname& obj) {
}
```
拷贝构造函数常在以下情况被调用:
- 对象以值传递进入函数体
- 对象以值传递从函数返回
- 对象需要通过另一个对象进行初始化
如果类中包含指针变量并进行了动态内存分配,必须自定义拷贝构造函数以实现深拷贝,防止因浅拷贝导致的指针悬挂问题。浅拷贝只会复制指针,而深拷贝则会复制指针所指向的数据。如果未定义显式拷贝构造函数,系统会使用默认的浅拷贝构造函数。
**总结:**
- 类是对象的模板,包含数据成员和成员函数。
- `::` 运算符用于标识成员属于哪个类。
- 构造函数用于初始化对象,析构函数用于清理对象。
- 拷贝构造函数处理对象的复制,确保数据的正确复制,特别是在有指针成员时需注意深拷贝和浅拷贝的区别。