类定义与成员
更新时间:2026-08-27。本文是
languages/cpp/主题入门层第 16 篇,类与对象子族开篇。类是 C++ 和 C 分道扬镳的第一个大岔路口:C 的结构体只能装数据,C++ 的类把数据和操作它的函数绑在一起。这一篇先把"类长什么样"讲透。
本文要回答的问题
class和 C 的struct是什么关系?- 类的成员变量和成员函数怎么定义、怎么用?
- 成员函数写类里面和写类外面有什么讲究?
一、类:把数据和函数绑在一起
先看一个最简单的类:
class Circle {
double radius_ = 1.0; // 成员变量(数据)
public:
double area() const { // 成员函数(方法)
return 3.14159 * radius_ * radius_;
}
void setRadius(double r) {
if (r >= 0) radius_ = r; // 可以加校验
}
};
Circle c; // c 是 Circle 的一个对象(实例)
c.setRadius(5.0);
double a = c.area();Circle 是类,c 是对象。类相当于图纸,对象是照着图纸造出来的实体。成员变量 radius_ 存数据,成员函数 area()、setRadius() 操作这份数据——数据和方法不再散落两处。
注意 public: 这个关键字:它之前的部分默认是私有的,写上 public: 之后的成员才允许外部访问。下一篇文章专门讲访问控制,这里先记住"class 默认私有"。
二、class vs struct:其实是一家人
C++ 里 struct 和 class 几乎等价,唯一的差别是默认访问权限:
| 关键字 | 默认访问权限 | 能装数据 | 能装函数 |
|---|---|---|---|
struct | public | 能 | 能(C++) |
class | private | 能 | 能 |
也就是说,C++ 的 struct 可以带成员函数:
struct Point {
int x = 0, y = 0;
double distance() const { return sqrt(x*x + y*y); } // C++ 里合法
};约定俗成:简单数据聚合用 struct,有行为、要封装用 class。这条不是语法强制,是工程习惯——看到 struct 就默认"这是一堆公开数据",看到 class 就默认"内部有私有状态"。
三、成员函数:类内定义 vs 类外定义
小函数直接写在类里(像上面那样),类里写的成员函数默认是 inline 的,编译器可能直接展开。大函数放类外,用 :: 指出属于哪个类:
// Circle.h
class Circle {
double radius_;
public:
double area() const; // 只声明
void setRadius(double r);
};
// Circle.cpp
#include "Circle.h"
double Circle::area() const { // Circle:: 表示"这是 Circle 的成员"
return 3.14159 * radius_ * radius_;
}
void Circle::setRadius(double r) {
if (r >= 0) radius_ = r;
}Circle::area 读作"Circle 的 area"。类外定义时函数名前面必须带类名,否则编译器以为你在定义全局函数。
类外定义的成员函数不自动是 inline(除非你显式写 inline)——所以"头文件里声明、源文件里定义"的做法和 C 的多文件工程一脉相承。
四、和 C 对比
| 对比项 | C | C++ |
|---|---|---|
| 数据结构 | struct 只能装数据 | class/struct 数据+函数 |
| 操作数据的方式 | 外部函数 area(c) | 成员函数 c.area() |
| 默认访问 | 全公开 | class 默认私有 |
| 封装 | 靠约定(_ 前缀) | 语言层面强制 |
| 相似类型 | typedef struct | 直接用类名 |
C 里"结构体 + 操作它的函数"是两码事:struct Circle 只管数据,double area(struct Circle*) 在外面。C++ 把它们合成一个整体——这是面向对象思想的落点,也是后续封装、继承、多态的地基。
五、对象的内存布局预告
对象在内存里长什么样?成员变量按声明顺序排布,成员函数不占对象空间(所有对象共享同一份代码):

这块细节(对齐、虚函数表、继承后的布局)在专家层对象内存布局展开,现在知道"对象就是一堆成员变量,函数是共享的"就够了。
六、与本站主线衔接
- 下一篇文章进入访问控制:
public/private/protected怎么配合出封装; - 对象在栈上的生命周期与构造/析构,见 构造函数 与 析构函数;
- 对象大小、对齐对缓存和内存占用的影响,见 L3 内存对齐与缓存。
一句话总结
类是 C++ 把数据(成员变量)和操作(成员函数)绑成一体的封装单元,class 默认私有、struct 默认公开,其余等价;小函数写类内(自动 inline)、大函数写类外并带 Circle:: 前缀;对象在内存里就是成员变量的集合,函数是所有对象共享的代码。