构造函数初探
在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++中用于初始化对象的特殊成员函数。通过构造函数,我们可以提供不同的初始化方式,并且可以控制对象的拷贝和隐式类型转换行为。构造函数初始化列表是一种高效的初始化方式,可以避免先默认初始化再赋值的过程。
希望本篇博客对你理解构造函数有所帮助。如果有任何问题或疑问,请随时留言。谢谢阅读!
以上是关于构造函数的博客内容,希望对你有所帮助。如果还有其他问题或需要进一步解释,请随时提问。谢谢!