最简可用c++类需满足:class 名字 { public: 成员; 函数(); }; 且可实例化调用。例如 class person { public: int age; void say_hello() {} }; 编译通过、可声明对象、可访问公有成员。

怎么写一个最简可用的 C++ 类
类不是模板,也不是文档,它得能实例化、能调用、能编译通过。最简结构就是 class 关键字 + 名字 + 一对花括号,里面至少有一个可访问的成员函数或变量。
-
class后面的名字必须符合标识符规则,不能是int、class这类关键字 - 类体末尾的
;不能省——漏了会报错expected ';' after class definition - 默认访问权限是
private,所以光写int x;不加public:,外部根本读不到
示例:
class Person {
public:
int age;
void say_hello() { }
};对象怎么创建:栈上、堆上、别名的区别
对象不是“new”出来的才叫对象,Person p; 这种才是最常用、最安全的写法;new Person 是动态分配,不配 delete 就泄漏;Person& ref = p; 是引用,不是新对象。
- 栈对象(
Person p;):自动析构,生命周期由作用域决定,性能好 - 堆对象(
Person* p = new Person;):需要手动delete p;,C++11 后更推荐用std::unique_ptr<person></person> - 引用(
Person& r = p;):不构造新对象,只是别名,不能绑定到临时对象(除非是 const 引用)
常见错误:Person& r = Person(); 编译可能过,但 r 绑定的是临时对象,函数返回后就悬空。
立即学习“C++免费学习笔记(深入)”;
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
构造函数没写时,编译器到底干了什么
没写任何构造函数,编译器会隐式生成一个无参、空体、public 的默认构造函数;但只要写了任意一个构造函数(哪怕带参数),这个隐式默认构造函数就没了。
- 如果类里有
const成员或引用成员,必须在构造函数初始化列表里赋值,不能在函数体内赋值 - 初始化列表(
: name("xxx"), id(0))比函数体内赋值更高效,尤其对自定义类型成员 - 初始化顺序只跟成员在类中声明的顺序有关,和初始化列表里的书写顺序无关
示例:
class Book {
std::string title;
const int id;
public:
Book(std::string t) : title(t), id(42) { } // ✅ 必须用初始化列表处理 const 成员
};类内定义 vs 类外定义成员函数
在类内部直接写函数体(比如 void f() { }),会被编译器当作 inline 候选;写在类外(void Person::say_hello() { }),更适合逻辑稍长或需要分离声明/实现的场景。
- 类内定义的函数,即使没加
inline,也默认具有内联属性,头文件被多处包含时不会链接冲突 - 类外定义必须带作用域解析符
::,且函数声明必须已在类中出现过 - 如果函数体里用到了尚未定义的其他类(比如参数类型是未完全定义的
class X),只能在类外定义,否则编译失败
容易踩的坑:class A { void f() { B b; } }; 如果 B 在此时还没定义,这段代码非法;得把 f() 搬到类外,在 B 定义之后再实现。
类和对象看着简单,但访问控制、构造时机、内存位置这三块一碰就容易出静默问题——尤其是跨文件使用时,头文件里类定义是否完整、构造函数是否可访问、对象生命周期是否匹配,这些地方不盯紧,调试起来比逻辑错误还难定位。










