构造函数初探

本文详细介绍了C++中的构造函数,包括其特点(无返回值、不可手动调用等)、多种形式(无参、带参、拷贝构造、默认参数)、对象拷贝、函数默认参数、隐式类型转换与explicit关键字的应用,以及构造函数初始化列表的使用。
摘要由CSDN通过智能技术生成

构造函数初探

在C++中,构造函数是一种特殊的成员函数,其名称与类名相同。当我们创建类的对象时,构造函数会被自动调用,用于初始化对象的数据成员。在本篇博客中,我们将介绍构造函数的基本特点、多个形式以及一些相关的概念。

构造函数的特点

1. 构造函数没有返回值,包括void类型。
2. 构造函数不可手动调用,否则会导致编译错误。
3. 构造函数必须声明为public,以便外部可以调用。
4. 构造函数可以有多个参数,用于提供不同的初始化方式。

构造函数的多个形式

一个类可以有多个构造函数,以提供不同的初始化方法。这些构造函数之间通常有一些差异,如函数类型或参数。

class Time { public:
    // 构造函数1:无参数
    Time();

    // 构造函数2:带参数的构造函数
    Time(int hour, int minute, int second);

    // 构造函数3:拷贝构造函数
    Time(const Time& other);

    // 构造函数4:默认参数构造函数
    Time(int hour = 0, int minute = 0, int second = 0);
};

对象的拷贝

在C++中,对象的拷贝可以通过拷贝构造函数来实现。以下是一些对象拷贝的示例:

Time myTime1;//调用构造函数
Time myTime2 = myTime1; // 调用拷贝构造函数
Time myTime3(myTime1); // 调用拷贝构造函数
Time myTime4 = { myTime1 }; // 调用拷贝构造函数

函数的默认参数

在C++中,函数可以有默认参数。默认参数只能在函数声明中指定,除非函数没有函数声明。在具有多个参数的函数中,所有默认参数都必须出现在非默认参数的右边

void func(int a, int b = 0) {
    //函数体
}

在函数调用时,如果没有提供默认参数的值,将使用默认参数的初始值。以下是一些函数调用的示例:

func(10); // b的值将为0
func(10, 20); // b的值将为20

隐式类型转换与explicit关键字

在C++中,存在隐式类型转换的情况,即可以自动将一种类型转换另一种类型。这种隐式类型转换可能会导致意想不到的结果或错误。

为了避免隐式类型转换,可以在构造函数前加上explicit关键字。这样,该构造函数只能用于初始化和显式类型转换

void func1(Time myt)
{
  //函数体
}
Time mytime40 = 14;//编译系统肯定有行为,把14这个数字 转换成了一个Time类的类型,调用了单参数的构造函数
Time myTime41 = (12, 13, 15, 15, 16);//调用了单参数的构造函数
func1(16);//16被转换成了一个临时的Time对象 导致func1的调用能够成功。调用了单参数的构造函数
Time myTime100 = { 16 };//这个写法咱们认为正常,带一个参数16,可以让系统明确的知道调用哪个构造函数
Time myTime101 = 16;//函数不清的写法,就存在临时对象的隐式转换。
func1(16);//也是含糊不清的写法,存在临时对象/隐式转换的问题。
class Time {
public:
    explicit Time(int hour, int minute, int second);
};

Time myTime = Time(12, 13, 52); // 创建类对象
Time myTime2(12, 13, 52);
Time myTime3{ 12,13,52 };
Time myTime4 = Time{ 12,13,53 };
Time myTime5 = { 12,13,52 }; // 这个会报错,隐式类型转换
Time myTime100 = { 16 }; // 正常,明确调用构造函数
Time myTime101 = 16; // 错误,存在隐式类型转换
func1(16);//也是隐式类型转换,一加explicit就会报错。
改造:Time myTime100 = Time{ 16 };
	 Time myTime101 = Time(16);
	 func1(Time(16));

注意:对于单参数的构造函数,一般都声明explicit,除非你有特别原因。

构造函数初始化列表

构造函数初始化列表是一种用于初始化对象成员的方式,可以在构造函数的定义中使用。它的优点是可以提高效率,避免了先默认初始化再赋值的过程。

class Time//定义一个时间类  或类声明
{
public:
	int m_hour;//小时
	int m_minute;//分钟
	int m_second = 0;//类内初始化
};
Time::Time(int hour, int minute, int second) : m_hour(hour), m_minute(minute), m_second(second) {
    // 构造函数的其他操作
}
Time myTime = Time(12, 13, 52);

使用构造函数初始化列表时,需要注意成员的初始化顺序应与声明顺序一致,以避免出现未定义的行为。

总结

构造函数是C++中用于初始化对象的特殊成员函数。通过构造函数,我们可以提供不同的初始化方式,并且可以控制对象的拷贝和隐式类型转换行为构造函数初始化列表是一种高效的初始化方式,可以避免先默认初始化再赋值的过程。

希望本篇博客对你理解构造函数有所帮助。如果有任何问题或疑问,请随时留言。谢谢阅读!

以上是关于构造函数的博客内容,希望对你有所帮助。如果还有其他问题或需要进一步解释,请随时提问。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值