构造函数
构造函数的定义
在类中,有一种特殊的成员函数,它的名字和类名相同,我们在创建类的对象的时候,这个特殊的成员函数就会被系统自动调用,这个成员函数,就叫“构造函数”。因为构造函数会被系统自动调用,所以我们可以简单的理解成 构造函数的目的就是初始化类对象的数据成员;
构造函数
- 构造函数没有返回值,构造函数的特殊之处
- 不可以手工调用构造函数,否则编译就会出错
- 正常情况下,构造函数应该被声明为public, 因为我们创建一个对象的时候,系统要替我们调用构造函数,这就说明构造函数是一个public。因为类缺省的成员是私有成员,所以我们必须说明构造函数是一个public函数,否则就无法直接创建该类的对象
- 构造函数中如果有多个参数,则我们创建对象的时候也要带上这些参数
多个构造函数
一个类中可以有多个构造函数,更多函数,可以为类对象创建提供多个初始化方法,但是多个构造函数之间总要有点不同的地方,比如,参数数量或参数类型;
函数默认参数
- 默认值只能放在函数声明中,除非该函数没有声明;
- 在具有多个参数的构造函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,他右边的所有参数必须指定默认值;
隐式转换和explicit
定义一个对象的时候,当初始化值和对象类型不匹配时候,会存在临时对象和隐式类型转换的问题,编译器内部会进行隐式类型转换;这种写法比较模糊,不能明确编译器到底调用哪个构造函数;因此可以通过声明构造函数的时候,加上explicit关键字,禁止隐式类型转化,该函数只能用于初始化和显示类型转换;
建议
- 对于单参数的构造函数,一般都声明成explicit,除非有特殊原因;
- 无参的也可以用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大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/366913
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!