查看: 102|回复: 1

通俗易懂的聊一聊C++中的构造函数

[复制链接]

4

主题

8

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-4-8 13:41:55 | 显示全部楼层 |阅读模式
hello!老公们!
今天我们一起来探讨一下C++中的构造函数。
在C++中,当我们创建了一个自定义类对象时,编译器首先要为我们分配一块内存,用来存储这个对象。
这一点,我们都很清楚。
但事实上,每当我们创建一个自定义类对象时,编译器除了第一步给我们分配一块内存外,紧跟着就要执行该类中的一个成员函数,这个特殊的成员函数就叫做构造函数。
构造函数会伴随着自定义类对象的创建而执行,在构造函数中,我们可以执行任何想要执行的代码(当然,前提一定要正确哈)。
这时候有的老公可能有点懵了,为毛我自己写的类里面没有构造函数也能运行?不是说构造函数在对象创建的时候必须被执行吗?
嗯,问得好,今晚就你来侍寝吧。
我们构造的类不写构造函数能够运行那一定是有原因的,编译器知道我们很懒,所以如果我们没有写构造函数的话,编译器会自动帮我们补上,然后一个默认的无参构造参数,然后它在给对象分配玩内存后,就执行这个默认的无参构造函数。
一部分老公:哦哦,原来是这样(一脸崇拜~~)
可是老公们!你们想过一个问题没有?编译器的脑子可不比你们好使啊,它写出来的构造函数可是很呆的。为什么说它呆呢?因为它写出来的构造函数,只能机械化地初始化类中的成员变量。
功能如下:1.如果成员变量在类中有初始值,则用初始值来初始化成员变量;
                 2.否则,默认初始化该成员;(如果不清楚该如何默认初始化,可以看之前我写的一篇文章,链接如下:关于C++类型默认初始化的解析 - 一捧墨汁儿的文章 - 知乎 https://zhuanlan.zhihu.com/p/611060655)
作为新时代的青年,咱们理应有自己的抱负和理想!
嗯!咱们就从自己编写构造函数开始做起。
构造函数和普通成员函数的格式不同,构造函数没有返回值,函数名必须与类名一致。
代码如下:
class student{
    int age;
    int weight;
    student(int age,int weight)
    {
        this->age = age;
        this->weight = weight;
        cout<<"我是一名学生,未来我要做墨汁的老公!"<<endl;
    }
}
看看我们自己写的构造函数,是不是生动了许多,不仅仅能给成员对象自定义赋值,还能清晰表达该学生对未来的美好愿望。
不过我们必须要注意一下几点:
1.编译器只有在我们没有写构造函数时,才会给我们补上一个默认的构造函数。
所以如果我们的student类只有像上面那样的一个构造函数时,我们将无法执行无参的构造函数。
如下代码所示:
student LiHua;//错误语法,这种语法需要调用无参构造函数,我们没有
student LiHua = student();//错误语法,这种语法也需要调用无参构造函数,我们没有
student LiHua = student(18,120);//正确,使用的是我们自定义的构造函数那如何能让以上三种创建对象的方法都能够实现呢?
答案是:我们只需再添加一个无参构造函数就可以了。
代码如下:
class student{
    int age;
    int weight;
    student(int age,int weight)
    {
        this->age = age;
        this->weight = weight;
        cout<<"我是一名学生,未来我要做墨汁的老公!"<<endl;
    }
    student()
    {
        age = 16;
        weight = 120;
    }
}

student LiHua;//正确,调用无参构造函数
student LiHua = student();//正确,也调用无参构造函数
student LiHua = student(18,120);//正确,使用的是我们自定义的构造函数
这也是我要说的第二点
2.一个类中可以有多个构造函数,但对象创建时只会执行其中一个。

关于构造函数初始值列表
格式如下:
class student{
    int age;
    int weight;
    student(int ageTest,int weightTest):age(ageTest),weight(weightTest)
    {
        age = ageTest;
        weight = weightTest;
        cout<<"我是一名学生,未来我要做墨汁的老公!"<<endl;
    }
}
初始值列表写在参数列表后,以逗号分割开来。
上面初始值列表表示用ageTest初始化age,weightTest初始化weight。
只有初始化列表才是对成员变量的初始化,成员变量没有在初始化列表出现的,将使用与编译器给的默认构造函数相同的方式进行隐式初始化(但此时类中并没有编译器给的默认构造函数,只是初始化方法相同)。
至于函数体,在初始化列表执行后正常执行即可!
好了,本次探讨就到这了!
老公们,点点关注(可怜的大眼睛~~)
咱们下次再见!
回复

使用道具 举报

3

主题

14

帖子

25

积分

新手上路

Rank: 1

积分
25
发表于 2025-4-6 09:58:01 | 显示全部楼层
路过 帮顶 嘿嘿
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表