最稳妥做法是将类定义、实现和main()全放在一个.cpp文件中,用g++一行编译运行;常见错误如“undefined reference”多因声明与定义分离后未同时编译或遗漏构造函数定义。

怎么写一个能直接编译运行的 C++ 类示例
最稳妥的做法是:把类定义、类实现(如果分离)、以及 main() 全部放在一个 .cpp 文件里,用 g++ 一行命令就能跑通。别一上来就拆头文件、源文件、CMake,那不是写示例,是搭工程。
常见错误现象:undefined reference to 'MyClass::MyClass()'——多半是因为声明和定义分开了但没一起编译,或者忘了定义构造函数。
- 类定义尽量放文件顶部(或单独
myclass.h,但示例阶段建议 inline) - 所有成员函数,哪怕只有声明,只要被调用了,就必须有定义(哪怕是空实现)
-
main()函数必须存在,且返回int - 别用
using namespace std;在头文件里;示例中可放main前,不伤大雅
#include <iostream>
<p>class Calculator {
public:
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
};</p><p>int main() {
Calculator calc;
std::cout << calc.add(3, 4) << "\n"; // 输出 7
std::cout << calc.multiply(3, 4) << "\n"; // 输出 12
return 0;
}什么时候该把类拆成 .h 和 .cpp
当示例开始体现“接口与实现分离”意图时才拆,比如想模拟真实项目结构、或展示 #include 依赖关系。但注意:拆了就必须确保编译器能同时看到声明和定义。
使用场景:教别人理解头文件作用、演示链接过程、或为后续扩展留接口。
立即学习“C++免费学习笔记(深入)”;
-
myclass.h只放类声明、#pragma once或卫士宏,不写函数体 -
myclass.cpp包含myclass.h,实现所有非内联函数 - 编译命令得同时指定两个文件:
g++ main.cpp myclass.cpp -o demo - 如果在
myclass.h里写了函数体(比如inline或短函数),它就自动变成内联,此时.cpp文件可省略
为什么加 const 成员函数和 const 对象容易出错
初学者常忽略 const 修饰对示例可信度的影响——真实类往往要支持只读访问,而漏写 const 会导致 const 对象无法调用该函数,编译直接报错:error: passing 'const MyClass' as 'this' argument discards qualifiers。
- 如果函数不修改成员变量,就加上
const后缀,比如int get_value() const; - 示例里创建
const对象(如const Calculator c;),再调用带const的函数,能立刻验证是否正确定义 - 构造函数、析构函数、
operator=等默认不是const,不用加;只有普通访问器函数才需要
避免示例失效的三个隐蔽细节
看似简单的示例,常因环境或标准差异崩在别人机器上。关键不是“能不能跑”,而是“换台机器、换个编译器还能不能跑”。
- 别用 C++20 特性(如
std::format)写基础示例;加-std=c++17编译参数更稳妥 - 路径里别含中文或空格,尤其 Windows 下用 MinGW 或 WSL 时,
#include "我的类.h"会静默失败 - 如果类里用了
std::vector或std::string,记得#include对应头文件——示例里漏掉#include <string>是高频翻车点
真正难的不是写出语法正确的类,而是让别人复制粘贴后不改一行就能 g++ demo.cpp && ./demo 跑出结果。路径、标准、头文件、const 正确性,四者缺一不可。


















