C++类定义以class关键字开头、花括号包围类体、末尾必须加分号;默认访问权限为private;成员变量不初始化则值未定义;构造函数若未显式定义,编译器提供默认版本,但一旦自定义则默认构造函数被禁用。

类定义的基本语法长什么样
C++里定义一个类,核心就是用 class 关键字加一对花括号。类体里默认是 private,这点和 struct 不同(struct 默认是 public),容易漏写访问控制符导致成员不可见。
- 类名首字母大写是常见约定,但编译器不强制
- 类定义末尾的分号
;不能省——少了会报类似expected ';' before '{'的错误 - 成员变量不初始化时是未定义值,尤其在栈上创建对象时,别假设它为 0
class Person {
public:
std::string name;
int age;
Person(std::string n, int a) : name(n), age(a) {}
};
构造函数不写会怎样,怎么写才安全
不写任何构造函数,编译器会自动生成默认构造函数(无参、空实现)。但只要写了任意一个构造函数,这个默认构造函数就自动消失——这时候如果还用 Person p; 就会编译失败。
- 建议显式写一个默认构造函数,哪怕只是设初值:
Person() : age(0) {} - 初始化列表(
: name(n), age(a))比在函数体内赋值更高效,尤其对自定义类型成员 - 如果成员是
const或引用类型,必须在初始化列表中赋值,否则编译不过
public/private/protected 到底影响谁
访问控制符只限制「类外部代码」能否直接访问成员,不影响类内部或友元函数。新手常误以为 private 能防住所有访问,其实:
- 同一个类的不同对象之间可以互相访问对方的
private成员(比如operator==实现) - 继承时
protected对子类可见,但对外不可见;private继承后子类也访问不到 - 头文件里暴露太多
public成员,等于把实现细节钉在接口上,后续改起来很疼
头文件里定义类要注意什么
类定义通常放在 .h 或 .hpp 文件里,必须加头文件保护,否则多处包含会触发重定义错误:
立即学习“C++免费学习笔记(深入)”;
- 用
#pragma once最简单,但不是所有编译器都完全支持(不过主流都 OK) - 更通用的是传统宏卫士:
#ifndef PERSON_H/#define PERSON_H/#endif - 类内定义的函数(比如上面构造函数)会被隐式当作
inline,适合短小逻辑;复杂实现建议放到.cpp中,避免头文件膨胀和重复实例化
类不是模板,也不是宏,它的内存布局和调用规则从定义那一刻就基本固定了。真正麻烦的往往不是“怎么写”,而是“什么时候该拆成多个类”“哪些数据真该放进类里”——这些得靠具体问题推着走,没法靠语法解决。











