C++语言基础5:构造函数

C++语言基础5:构造函数
什么是构造函数构造函数Constructor是面向对象编程C/Java/C#等中一个极其特殊的成员函数。它的核心作用就是一句话用来“制造”并“初始化”一个对象。通俗地打个比方类Class相当于一张“建筑图纸”而构造函数就是“施工队”。当你写new Student()或Student s;时就是在喊“施工队开工”施工队负责把钢筋水泥内存搭建成一个可以住人的房子对象并给墙壁刷上底漆初始化数据。1. 构造函数的 3 个核心语法特征一眼辨认在 C 中构造函数必须满足以下条件否则就不是构造函数函数名必须和类名一模一样例如类叫Student构造函数就叫Student。没有返回值类型连void都不能写。在对象创建时被自动调用不需要你手动调用。2. 举个生活中的代码例子从原始到标准我们写一个管理学生成绩的类Student看看构造函数怎么用。场景一没有构造函数原始状态class Student { public: // 这里没有任何构造函数 char* name; int score; }; int main() { Student s; // 对象创建了但 name 指向垃圾地址score 是随机数比如 -858993460 // 如果此时直接输出 s.score程序可能崩溃或输出乱码 }结论没有构造函数对象里的数据是“野数据”非常危险。场景二写一个构造函数最常用写法我们把构造函数写在类里面用来给数据赋初始值。#include iostream #include cstring using namespace std; class Student { public: char name[50]; int score; // 【构造函数】 1. 名字和类名相同2. 没有返回值 Student(const char* n, int s) { cout 构造函数被调用了正在创建学生... endl; strcpy(name, n); // 把传入的名字复制进去 score s; // 把分数赋值为传入的 s } void show() { cout 姓名: name , 分数: score endl; } }; int main() { // 创建对象时直接传入参数构造函数会自动执行 Student s1(张三, 95); Student s2(李四, 88); s1.show(); // 输出姓名: 张三, 分数: 95 s2.show(); // 输出姓名: 李四, 分数: 88 return 0; }解释当你写Student s1(张三, 95);这一瞬间内存空间分配好了紧接着构造函数立刻执行把“张三”和“95”填进去。这样对象一诞生就是完好的杜绝了垃圾数据。场景三构造函数的重载多个构造函数一个类可以有好几个构造函数参数不同就像施工队可以有不同图纸。class Student { public: char name[50]; int score; // 构造函数 1有参构造传入全部信息 Student(const char* n, int s) { strcpy(name, n); score s; } // 构造函数 2无参构造默认构造不传参数 Student() { strcpy(name, 未知); score 0; cout 创建了一个默认学生 endl; } }; int main() { Student s1; // 自动调用无参构造函数输出创建了一个默认学生 Student s2(王五, 100); // 自动调用有参构造函数 }场景四使用“初始化列表”进阶对应你之前问的代码你提问中写的: QObject(parent)就是 C 特有的初始化列表。它是在进入构造函数大括号{}之前就把父类的属性给初始化好。class Student { private: int id; int age; public: // 冒号后面的就是初始化列表效率比在{}里赋值更高 Student(int student_id, int student_age) : id(student_id), // 直接将 student_id 赋给 id age(student_age) // 直接将 student_age 赋给 age { // 这里大括号里通常只写更复杂的逻辑比如连接数据库 cout 初始化列表已完成id id , age age endl; } };3. 再列举一段代码知识点串联这段THintsPlugin::THintsPlugin(QObject *parent) : QObject(parent) // -- 这是初始化列表先把父亲基类构造好 { m_initialized false; // -- 再给自己的孩子成员变量赋初值 }结合刚才的例子它的含义就是当外界创建THintsPlugin插件对象时必须带上一个parent指针。系统会先用这个指针把插件的“父亲”QObject构造好让父亲记住自己的主人是谁然后再执行大括号里的代码把插件自己的状态标记为“未初始化false”。4. 特别提醒非常重要的易错点不要手动调用构造函数s.Student(a,1);是绝对错误的语法。只有Student s(a,1);才能触发。如果不写任何构造函数编译器会自动给你生成一个空的默认构造函数什么也不做。但只要你自己写了一个带参数的构造函数编译器就不会再自动生成无参的了。这时你如果想Student s;不传参编译就会报错。