目录
[3.1 构造函数(Constructor)](#3.1 构造函数(Constructor))
[3.2 析构函数(Destructor)](#3.2 析构函数(Destructor))
[五、this 指针](#五、this 指针)
[6.1 学生成绩管理类](#6.1 学生成绩管理类)
在 C++ 中,类与对象是面向对象编程(OOP)的核心概念。掌握类与对象不仅能让你写出结构清晰、易扩展的代码,也为后续学习继承、多态和模板打下基础。
本文从概念、语法、构造函数/析构函数、访问控制、this 指针、工程实践等角度讲解 C++ 的类与对象。
一、类与对象的基本概念
-
类(Class):是对具有相同属性和行为的对象的抽象。
-
对象(Object):类的实例,拥有类定义的属性和行为。
类是模板,对象是具体实例。
二、基本语法
cpp
#include <iostream>
using namespace std;
// 定义一个类
class Student {
public: // 公有成员
string name;
int age;
void display() { // 成员函数
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
Student s1; // 创建对象
s1.name = "Alice";
s1.age = 20;
s1.display();
Student s2;
s2.name = "Bob";
s2.age = 22;
s2.display();
return 0;
}
输出:
cpp
Name: Alice, Age: 20
Name: Bob, Age: 22
三、构造函数与析构函数
3.1 构造函数(Constructor)
-
作用:对象创建时初始化成员变量
-
特点:
-
名称与类名相同
-
无返回值
-
可以重载
-
cpp
class Student {
public:
string name;
int age;
// 构造函数
Student(string n, int a) {
name = n;
age = a;
cout << "Student " << name << " created." << endl;
}
};
int main() {
Student s("Charlie", 18);
cout << s.name << " " << s.age << endl;
}
3.2 析构函数(Destructor)
-
作用:对象生命周期结束时释放资源
-
特点:
-
名称与类名相同,前加
~ -
无参数,无返回值
-
每个对象只调用一次
-
cpp
class Student {
public:
string name;
Student(string n) { name = n; }
~Student() { cout << name << " destroyed." << endl; }
};
int main() {
Student s("Daisy");
}
输出:
cpp
Daisy destroyed.
析构函数对于管理动态内存和文件资源至关重要。
四、访问控制
C++ 类有三种访问控制:
| 关键字 | 作用域 |
|---|---|
public |
公有成员,类外可访问 |
private |
私有成员,只能在类内访问 |
protected |
受保护成员,可在类内及子类访问 |
cpp
class Student {
private:
int id; // 私有成员
public:
string name;
void setId(int i) { id = i; }
int getId() { return id; }
};
int main() {
Student s;
s.name = "Emma"; // 可以访问 public
s.setId(1001); // 通过公有函数访问 private
cout << s.getId() << endl;
}
五、this 指针
-
概念 :每个对象的成员函数内部都有一个隐含指针
this,指向调用该函数的对象本身。 -
用途:
-
区分成员变量与参数名冲突
-
返回对象自身(链式调用)
-
cpp
class Student {
private:
string name;
public:
Student(string name) { this->name = name; } // 区分参数和成员
Student& setName(string name) { this->name = name; return *this; }
void display() { cout << name << endl; }
};
int main() {
Student s("Frank");
s.setName("Grace").display(); // 链式调用
}
六、工程实践案例
6.1 学生成绩管理类
cpp
#include <iostream>
#include <vector>
using namespace std;
class Student {
private:
string name;
int age;
vector<int> scores;
public:
Student(string n, int a) : name(n), age(a) {}
void addScore(int score) { scores.push_back(score); }
double average() {
int sum = 0;
for(int s : scores) sum += s;
return scores.empty() ? 0 : (double)sum / scores.size();
}
void display() {
cout << "Name: " << name << ", Age: " << age
<< ", Avg: " << average() << endl;
}
};
int main() {
Student s1("Alice", 20);
s1.addScore(80);
s1.addScore(90);
s1.display();
Student s2("Bob", 22);
s2.addScore(70);
s2.addScore(60);
s2.display();
}
输出:
cpp
Name: Alice, Age: 20, Avg: 85
Name: Bob, Age: 22, Avg: 65
这个案例展示了类封装属性和行为、动态存储(vector)、构造函数初始化和成员函数调用的完整流程。
七、小结
-
类与对象是面向对象编程的核心,能够封装数据和行为,提高代码可读性和复用性。
-
构造函数与析构函数管理对象生命周期,是资源管理的基础。
-
访问控制保护类内部状态,提供接口封装。
-
this 指针帮助成员函数识别调用对象,同时支持链式操作。
-
工程实践中,类与对象结合 STL 和成员函数能构建灵活、可扩展的模块化代码。