码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-07-16 21:54:09      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:类成员   初始   必须   lan   ISE   多个   出现   构造   变量   

构造函数

构造函数的定义

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

构造函数

  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;

}

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

标签:类成员   初始   必须   lan   ISE   多个   出现   构造   变量   

原文地址:https://www.cnblogs.com/Trevo/p/13324447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!