(28.1)默认构造函数之定义默认构造函数、隐式类型转换
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.定义默认构造函数
- 默认构造函数就是在没有显式提供初始化式时调用的构造函数, 它是一个不带参数的构造函数。
如果定义某个类的对象时没有提供初始化式就会使用默认构造函数
- 定义默认构造函数(default constructor) 的一般形式为:
类名()
{
函数体
}
- 它由不带参数的构造函数, 或者所有形参均是默认参数的构造函数定义。
与默认构造函数相对应的对象定义形式为
类
名 对象名;
- 任何一个类有且只有一个默认构造函数。
如果定义的类中没有显式定义任何构造函数, 编译器会自动为该类生成默认构造函数, 称为合成默认构造函数(synthesized default constructor) 。
- 一个类哪怕只定义了一个构造函数, 编译器也不会再生成默认构造函数。
换言之, 如果为类定义了一个带参数的构造函数, 还想要无参数的构造函数, 就必须自己定义它。
- 一般地, 任何一个类都应定义一个默认构造函数。 因为, 在很多情况下, 默认构造函数是由编译器隐式调用的。
2.隐式类型转换
- 为了实现其他类型到类类型的隐式转换, 需要定义合适的构造函数。
可以用单个实参调用的构造函数(称为转换构造函数) 定义从形参类型到该类类型的隐式转换
- eg1
#inclde<iostream>
using namespace std;
class Data
{
public:
Data(const string& str=""):s1(str){}
void print()
{
cout<<s1<<endl;
}
private:
string s1;
};
int main()
{
string i="string";
Data a("word");
a=Data(i);//隐式转换,将string的对象转换成类class对象,会产生临时对象,
该临时对象的string的内容就是放的i的值,然后将临时对象的值赋值给a这个对象,
那么对象a的string也就变成字符串“string”
a.print();//输出string
}
- 使用单个参数的构造函数来进行类类型转换的方法可以总结如下:
(1) 先声明一个类;
(2) 在这个类中定义一个只有一个参数的构造函数, 参数的类型是需要转换的数据类型,
即转换构造函数的一般形式为:
类名(const 指定数据类型& obj)
(3) 采用转换构造函数定义对象时即进行类型转换, 一般形式为:
类名(指定数据类型的数据对象)
- 可以禁止由构造函数定义的隐式转换, 方法是通过将构造函数声明为explicit, 来防止在需要隐式转换的上下文中使用构造函数。
- C++关键字explicit用来修饰类的构造函数, 指明该构造函数是显式的。 explicit关键字只能用于类内部的构造函数声明上, 在类定义外部不能重复它。
-
一般地, 除非有明显的理由想要定义隐式转换, 否则, 单形参构造函数应该为explicit。
将构造函数设置为explicit可以避免错误, 如果真需要转换, 可以显式地构造对象。