C++为什么类里面还要加构造函数?例程【逐词逐句保姆级详解】

发布时间:2026/10/15 3:44:16
C++为什么类里面还要加构造函数?例程【逐词逐句保姆级详解】
构造函数的作用对象刚被创建出来的瞬间自动给对象里面的成员变量设置初始值保证对象创建完成后数据就是合法有效的不会是随机垃圾值。如果不写构造函数创建对象后对象里面的成员变量的值是内存里残留的随机乱码垃圾值很容易程序出错。完整示例代码继续沿用 MobilePhone 手机类保持前后教程连贯#include iostream #include string using namespace std; // 定义手机类 class MobilePhone { public: // 构造函数 MobilePhone(string brand, int storage) { m_brand brand; m_storage storage; } // 成员函数打印手机信息 void showInfo() { cout 手机品牌 m_brand 存储 m_storage GB endl; } private: string m_brand; // 成员变量手机品牌 int m_storage; // 成员变量存储容量 }; int main() { // 创建对象自动调用构造函数初始化 MobilePhone phone1(华为, 256); phone1.showInfo(); MobilePhone phone2(小米, 512); phone2.showInfo(); return 0; }运行输出手机品牌华为存储256GB 手机品牌小米存储512GB第一部分对比【没有构造函数】的坏情况看懂为什么必须要有下面这段没有手动写构造函数的代码用来做对比#include iostream #include string using namespace std; class MobilePhone { public: void showInfo() { cout 手机品牌 m_brand 存储 m_storage GB endl; } private: string m_brand; int m_storage; }; int main() { MobilePhone phone1; phone1.showInfo(); return 0; }这里编译器会自动生成一个空的默认构造函数空函数里面什么都不做。m_brand、m_storage不会被赋值。m_storage里面的值是内存残留的随机数字垃圾值程序会打印乱码这就是风险 ✅ 所以我们手写构造函数就是为了杜绝这种随机垃圾值对象一诞生数据就准备好。第二部分 类内部代码逐词逐句拆解class MobilePhoneclassC 关键字告诉编译器接下来要定义一个类图纸。MobilePhone类名自定义图纸名称。{}大括号类的全部内容写在里面类定义结束末尾必须写};public:public访问修饰符。写在这里的构造函数、成员函数对外公开main 函数可以调用。MobilePhone(string brand, int storage) { m_brand brand; m_storage storage; }MobilePhone构造函数名必须和类名完全相同。编译器识别这个特殊函数的标记。没有写任何返回类型不能写 void、int这是构造函数硬性语法。(string brand, int storage)参数列表string brand形参 brand字符串类型临时局部变量。接收我们创建对象时传入的手机品牌只在这个构造函数执行期间存在。int storage形参 storage整型临时变量接收传入的存储大小。{}函数体大括号内就是对象创建时自动执行的初始化代码。m_brand brand;m_brand私有成员变量属于新建出来的这个对象身上的变量。每个对象都有独立一份。前缀m_代表 member 成员。赋值运算符把右边临时变量 brand 的值拷贝保存到对象自己的 m_brand 里面。含义把传入的品牌名字存进当前手机对象的品牌属性。m_storage storage;把传入的存储数值保存到当前对象的 m_storage 成员变量。这两行就是构造函数核心工作对象刚创建立刻给属性赋值。void showInfo() { cout 手机品牌 m_brand 存储 m_storage GB endl; }void返回值类型函数执行完毕不返回任何数据。showInfo普通成员函数名字功能是打印当前手机对象的信息。()圆括号无参数调用时不需要传入数据。cout控制台输出打印文字与变量的值。private: string m_brand; int m_storage;private私有修饰符。这两个成员变量只能在当前类内部的函数访问main 函数不能直接读写。string m_brand;成员变量用来保存手机品牌。int m_storage;成员变量保存手机存储容量。第三部分 main 函数逐词拆解重点MobilePhone phone1(华为, 256);MobilePhone phone1(华为, 256);MobilePhone类名图纸告诉编译器使用 MobilePhone 这个图纸创建对象。phone1对象名实例名。在内存开辟一块空间用来存放 phone1 这个手机对象。(华为, 256)实参传给构造函数。华为传递给构造函数形参brand256传递给构造函数形参storage写这一行代码的瞬间自动调用构造函数不需要我们手动调用。;分号C 语句结束标记。整句含义按照 MobilePhone 图纸在内存创建 phone1 对象自动执行构造函数把品牌、存储存入 phone1 对象的成员变量。phone1.showInfo();phone1对象名称代表我们操作 phone1 这个手机实体。.点号成员访问运算符读作 “的”用来访问对象里面的成员函数。showInfo成员函数名字。()函数调用标记带括号才代表执行函数内部代码。;语句结束。含义调用 phone1 对象的 showInfo 函数读取 phone1 已经初始化好的成员变量打印信息。MobilePhone phone2(小米, 512); phone2.showInfo();创建全新独立对象 phone2开辟新内存和 phone1 互不干扰。自动调用构造函数将 phone2 的 m_brand 赋值 小米m_storage 赋值 512。调用 showInfo 打印 phone2 自己的数据。return 0;main 函数执行结束栈上创建的 phone1、phone2 对象自动销毁内存释放。第四部分 完整执行流程一步一步跟着走执行MobilePhone phone1(华为, 256);① 在内存开辟一块内存空间准备存放 phone1 对象。此时对象里面 m_brand、m_storage 的值还是随机垃圾值。 ②自动调用构造函数 MobilePhone (string brand, int storage)③ 实参 华为 复制给形参 brand实参 256 复制给形参 storage ④ 执行m_brand brand;→ phone1 对象的 m_brand 华为 ⑤ 执行m_storage storage;→ phone1 对象的 m_storage 256 ⑥ 构造函数执行完毕临时变量 brand、storage 销毁。 ✅ 现在 phone1 对象初始化完成数据是有效的不再是乱码。执行phone1.showInfo();访问 phone1 对象读取已经初始化好的成员变量打印内容。执行MobilePhone phone2(小米, 512);开辟新内存创建 phone2 对象自动调用构造函数完成初始化。phone2 和 phone1 完全独立。执行phone2.showInfo();打印 phone2 的数据。return 0;main 结束phone1、phone2 销毁内存回收。第五部分 核心总结构造函数的价值回答你的问题自动初始化创建对象自动执行不用我们创建对象后再手动调用函数赋值。 不写构造的写法麻烦容易忘记MobilePhone phone1; phone1.init(华为,256); // 需要手动调用很容易漏掉这一行保证对象合法对象创建完成成员变量就有有效值避免内存垃圾值引发异常。强制初始化带参数的构造函数强制用户创建对象的时候必须传入数据不能创建一个空的、无效的手机对象。第六部分 新手易错点构造函数不能手动调用不能写phone1.MobilePhone(苹果,128);语法错误。只要手写了带参构造编译器不会再自动生成默认无参构造不能直接写MobilePhone p;编译报错。构造函数名字必须和类名完全一致不能自定义别的名字。构造函数没有返回值不能加 void。