【C/C++】【类和对象】构造函数

构造函数

构造函数的定义

在类中,有一种特殊的成员函数,它的名字和类名相同,我们在创建类的对象的时候,这个特殊的成员函数就会被系统自动调用,这个成员函数,就叫“构造函数”。因为构造函数会被系统自动调用,所以我们可以简单的理解成 构造函数的目的就是初始化类对象的数据成员;

构造函数

  1. 构造函数没有返回值,构造函数的特殊之处
  2. 不可以手工调用构造函数,否则编译就会出错
  3. 正常情况下,构造函数应该被声明为public, 因为我们创建一个对象的时候,系统要替我们调用构造函数,这就说明构造函数是一个public。因为类缺省的成员是私有成员,所以我们必须说明构造函数是一个public函数,否则就无法直接创建该类的对象
  4. 构造函数中如果有多个参数,则我们创建对象的时候也要带上这些参数

多个构造函数

一个类中可以有多个构造函数,更多函数,可以为类对象创建提供多个初始化方法,但是多个构造函数之间总要有点不同的地方,比如,参数数量或参数类型;

函数默认参数

  1. 默认值只能放在函数声明中,除非该函数没有声明;
  2. 在具有多个参数的构造函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,他右边的所有参数必须指定默认值;

隐式转换和explicit

定义一个对象的时候,当初始化值和对象类型不匹配时候,会存在临时对象和隐式类型转换的问题,编译器内部会进行隐式类型转换;这种写法比较模糊,不能明确编译器到底调用哪个构造函数;因此可以通过声明构造函数的时候,加上explicit关键字,禁止隐式类型转化,该函数只能用于初始化和显示类型转换;

建议

  1. 对于单参数的构造函数,一般都声明成explicit,除非有特殊原因;
  2. 无参的也可以用explicit,不能进行隐式类型转换了;
//头文件
#ifndef __MYTIME__
#define __MYTIME__

class Time
{
private:
    int MilliSecond; //毫秒
private:
    void initMilliSecond(int mls);
public:
    int Hour; //小时
    int Minue; //分钟
    int Second; //秒钟

public:
    //构造函数
    explicit Time(int tmphour, int tmpmin, int tmpsec);
    Time(int tmphour, int tmpmin); //有冲突 与上面的函数
    explicit Time(int tmphour);
    Time();
    //...

private:
    //...
};

#endif
//源文件
#include "time.h"


void Time::initMilliSecond(int mls)
{
    MilliSecond = mls;
}

Time::Time(int tmphour, int tmpmin, int tmpsec)
    //Hour(tmphour), Minue(tmpmin), Second(tmpsec), MilliSecond(0) //构造函数初始化列表
    :Hour(tmphour), Minue(Hour) //不要用成员变量去进行初始化,构造函数中先有值还是Minue先有值取决于time.h头文件中定义的顺序
{
    // Hour = tmphour; // 成员函数中,可以直接使用成员变量名
    //                 // 哪个对象调用的该成员函数,这些成员变量就属于哪个对象,可以理解成类成员函数知道哪个对象调用自己
    // Minue = tmpmin;
    // Second = tmpsec;
    // initMilliSecond(0);

    std::cout<<"调用了构造函数"<<std::endl;

}
Time::Time()
{
    Hour = 12;
    Second = 13;
    initMilliSecond(0);

    std::cout<<"调用了无参构造函数"<<std::endl;

}

Time::Time(int tmphour, int tmpmin)
{
    Hour = 12;
    Second = 59;
}

Time::Time(int tmphour)
{
    Hour = tmphour;
}

参数初始化列表

使用参数初始化列表初始化成员变量,成员变量的初始化顺序与初始化列表无关,与成员变量在类中的定义顺序有关;

Time::Time(int tmphour, int tmpmin, int tmpsec)
    //Hour(tmphour), Minue(tmpmin), Second(tmpsec), MilliSecond(0) //构造函数初始化列表
    :Hour(tmphour), Minue(Hour) //不要用成员函数去进行初始化,构造函数中先有值还是Minue先有值取决于time.h头文件中定义的顺序
{
    // Hour = tmphour; // 成员函数中,可以直接使用成员变量名
    //                 // 哪个对象调用的该成员函数,这些成员变量就属于哪个对象,可以理解成类成员函数知道哪个对象调用自己
    // Minue = tmpmin;
    // Second = tmpsec;
    // initMilliSecond(0);

    std::cout<<"调用了构造函数"<<std::endl;

}

原文链接: https://www.cnblogs.com/NaughtyCoder/p/13324447.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    【C/C++】【类和对象】构造函数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/366913

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午5:05
下一篇 2023年3月2日 下午5:07

相关推荐