c++类定义末尾必须加分号,否则编译报错;成员默认private;构造函数一旦自定义则隐式默认构造函数消失;const/引用成员须在初始化列表中赋值;类外定义成员函数需用::作用域解析符;头文件中只声明不实现非模板函数。

类定义必须写在 class 关键字后面,不能漏掉花括号和分号
很多人一上来就写 class MyClass { int x; },编译直接报错——C++ 要求类定义末尾必须有分号。漏掉它,编译器会把后续代码当成类体的一部分,错误信息常是 expected ';' before '{' 或更混乱的语法错误。
-
class后面紧接类名,然后是{ ... };,结尾分号不可省 - 类内成员默认是
private,想外部访问得显式加public: - 类定义本身不分配内存,只是描述结构;实例化(如
MyClass obj;)才触发构造和内存分配
构造函数没写时,编译器只提供隐式默认构造函数,但一旦写了任意构造函数,它就消失
这是最容易踩的坑:你加了个带参数的构造函数,比如 MyClass(int x),结果 MyClass obj; 突然编译不过了。因为编译器不会“保留”默认构造函数——它只在你完全没写任何构造函数时才生成一个空的 MyClass()。
- 需要无参构造又写了其他构造,就得手动补上
MyClass() = default;或空实现 - 用
= default生成的默认构造函数是public且noexcept的,比手写更安全 - 如果类里有
const成员或引用成员,必须在构造函数初始化列表里赋值,不能在函数体内用=
成员函数定义在类外时,必须用作用域解析符 :: 显式指定所属类
把函数声明放在类里、定义挪到外面,能提升可读性,但新手常忘写 MyClass::。比如类里声明了 void print();,类外写成 void print() { ... },编译器会认为这是全局函数,链接时报 undefined reference to 'MyClass::print()'。
享有盛誉的PHP高级教程,Zend Framework核心开发人员力作,深入设计模式、PHP标准库和JSON 。 今天,PHP已经是无可争议的Web开发主流语言。PHP 5以后,它的面向对象特性也足以与Java和C#相抗衡。然而,讲述PHP高级特性的资料一直缺乏,大大影响了PHP语言的深入应用。 本书填补了这一空白。它专门针对有一定经验的PHP程序员,详细讲解了对他们最为重要的主题
- 类外定义必须写全:返回类型 + 类名 +
::+ 函数名 + 参数列表 - 若函数是
const成员函数,类外定义也得带上const修饰符,位置要一致 - 内联行为不受影响:类内定义自动 inline;类外定义加
inline关键字才 inline
头文件里定义类,但别在头文件里实现非模板的成员函数
否则多个源文件包含该头文件时,链接阶段会报重复定义错误(multiple definition of 'MyClass::xxx()')。模板类例外,因为其实例化发生在编译期,且依赖具体类型。
立即学习“C++免费学习笔记(深入)”;
- 头文件(.h 或 .hpp)只放类声明、成员函数声明、内联函数(
inline或类内定义) - 普通成员函数实现在 .cpp 文件里,对应头文件需
#include - 用
#pragma once或传统卫哨宏防止头文件重复包含,否则类重复定义也会报错
类定义看着简单,但初始化顺序、访问控制、链接规则、头文件组织这些点,任何一个没对齐都会卡住编译或运行。尤其初始化列表和 const 成员的绑定时机,不是“赋值”而是“构造时绑定”,这点容易想当然。









