为什么需要类
写小程序时用几个变量就够了,但项目一大,"数据"和"操作数据的函数"散落在各处会很难维护。类(class)就是把数据和函数打包在一起的结构,是 C++ 面向对象的地基。
定义第一个类
#include <iostream>
#include <string>
using namespace std;
class Student {
public:
string name;
int score;
void introduce() {
cout << "我是" << name << ",考了" << score << "分" << endl;
}
};
int main() {
Student s;
s.name = "小明";
s.score = 92;
s.introduce(); // 输出:我是小明,考了92分
return 0;
}
public: 之后的成员可以在类外访问;如果不写访问修饰符,class 的成员默认是私有的。
构造函数:对象出生时自动执行
每次都手动给成员赋值太麻烦。构造函数与类同名、没有返回类型,创建对象时自动调用:
class Student {
public:
string name;
int score;
Student(string n, int s) {
name = n;
score = s;
}
void introduce() {
cout << "我是" << name << ",考了" << score << "分" << endl;
}
};
int main() {
Student s("小红", 88);
s.introduce(); // 输出:我是小红,考了88分
return 0;
}
现在创建对象时必须提供名字和分数,忘了传参直接编译报错,比事后排查安全得多。
初始化列表:推荐的写法
构造函数还有更地道的写法——初始化列表,跟在参数列表的冒号后面:
Student(string n, int s) : name(n), score(s) {}
效果与函数体赋值相同,但对成员是"直接初始化"而不是"先默认构造再赋值",效率更高,也是团队代码里的主流风格。
成员默认值
C++11 之后,可以直接在类里给成员写默认值,漏掉初始化也不怕:
class Student {
public:
string name = "无名氏";
int score = 0;
};
析构函数:对象销毁前自动执行
析构函数是类名前加 ~,对象离开作用域时自动调用,常用来释放资源:
class Logger {
public:
Logger() { cout << "打开日志" << endl; }
~Logger() { cout << "关闭日志" << endl; }
};
int main() {
{
Logger log; // 输出:打开日志
} // 离开作用域,输出:关闭日志
cout << "程序继续" << endl;
return 0;
}
小结
- 类把数据和函数打包,
class成员默认私有,public:之后可在外部访问 - 构造函数与类同名、无返回类型,创建对象时自动调用
- 优先用初始化列表
: name(n)的写法,C++11 起也可直接给成员写默认值 - 析构函数
~类名()在对象销毁时自动执行,负责清理资源
🔒 当前域名不开放评论功能