类是模板,对象是按模板分配内存的具体实例;仅非静态成员变量和虚函数表指针影响对象大小,静态成员、成员函数等不占对象空间;构造函数在已分配内存上初始化,析构函数按特定顺序自动调用;值传递导致对象切片,需引用或指针保持多态。

类是模板,对象是按这个模板造出来的具体东西——不是抽象比喻,而是编译器层面的真实行为:定义 class 不占内存,而 MyClass obj; 这一行才会分配实际空间。
类定义里写什么,才真正影响对象的大小和行为
只有非静态成员变量和虚函数表指针(如果含虚函数)参与对象内存布局;静态成员、普通成员函数、typedef、注释全不占对象空间。
-
int x;和char c;会按对齐规则占用实际字节(比如可能共占 8 字节,而非 5 字节) - 加
virtual void func();会让每个对象隐式多一个指针(通常是 8 字节,64 位系统) -
static int count;属于类,所有对象共享,不计入任一对象大小 - 成员函数体写在哪不影响对象大小,哪怕函数内部有 1000 行代码
构造函数不是“初始化对象”,而是“定义对象诞生那一刻该做什么”
它不负责分配内存(那是 operator new 或栈分配干的事),只负责在已分配好的内存上设置初始值。没写构造函数?编译器自动生成默认版本——但一旦你写了任意构造函数,编译器就不再生成默认无参版。
- 用
MyClass a{1, "hello"};触发的是你写的带参构造,不是赋值 -
MyClass b = MyClass(2);在 C++17 后是直接构造,不调用拷贝构造(NRVO 保证) - 成员初始化列表比构造函数体内赋值更高效:
MyClass(int x) : m_x(x) {}避免先调默认构造再赋值
对象生命周期结束时,析构函数执行顺序固定且不可跳过
栈对象在作用域结束时自动调用析构;堆对象需显式 delete(或智能指针管理)。析构函数不能被继承,但基类析构必须是 virtual,否则 delete base_ptr; 只调基类析构,派生部分内存泄漏。
10分钟内自己学会PHP其中,第1篇为入门篇,主要包括了解PHP、PHP开发环境搭建、PHP开发基础、PHP流程控制语句、函数、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、日期和时间等内容;第2篇为提高篇,主要包括MySQL数据库设计、PHP操作MySQL数据库、Cookie和Session、图形图像处理技术、文件和目录处理技术、面向对象、PDO数据库抽象层、程序调试与错误处理、A
立即学习“C++免费学习笔记(深入)”;
- 局部对象:先构造的后析构(栈 LIFO)
- 成员对象:按声明顺序构造,逆序析构(哪怕初始化列表顺序不同)
- 基类与派生类:基类先构造、后析构;派生类后构造、先析构
- 没写析构函数?编译器生成默认版——它什么也不做,不会自动
delete成员指针
最容易被忽略的其实是对象切片(object slicing):把派生类对象传给接受基类值参的函数时,派生部分直接被截断丢弃,连析构都不会调——这不是 bug,是值传递的必然结果。要用引用或指针才能保留多态性。










