C++中单参数构造函数的特殊用途

什么叫单参数的构造函数呢?就是说构造函数的形参列表中只有一个形参,或者不仅有一个形参但是除了第一个外其他都有缺省参数的那种。这样的构造函数起到了把该参数类型转换成类类型的特殊作用。这种转换是隐式转换是自动的,那就意味着它会在程序员不经意间进行,所以这要求程序员具有丰富的经验。不过C++ Primer Plus一书中对这方面的描述我感觉并不恰当,最起码我理解起来有些问题。在我看来所谓的隐式转换只不过是实参的类型与形参的类型之间的关系,但是本书中却说这是实参与类类型之间的关系,这该怎么理解?这里有一个类,它里面有一个只有一个形参的构造函数。

C++中单参数构造函数的特殊用途_第1张图片
C++中单参数构造函数的特殊用途_第2张图片

我用字符R去初始化类base的对象,然后将base的成员a打印出来得到82的结果。

而在原书中作者是这样说明的。

C++中单参数构造函数的特殊用途_第3张图片

这里首先用无参构造函数构造了一个Stonewt的对象,也就是第一条语句。然后第二条语句调用有参构造函数Stonewt(double)对myCat进行初始化,等号右侧的是double类型,等号左侧的是类类型,这就形成了一种类型之间的转换关系。

与此相对的是加上explicit关键字进行修饰的构造函数,它禁止了隐式转换。

还是上面的例子,我把有参构造函数用explicit进行修饰。

C++中单参数构造函数的特殊用途_第4张图片
C++中单参数构造函数的特殊用途_第5张图片

此时可以看到类类型与其他类型之间已经无法进行隐式类型转换了。但是现在我使用强制类型转换试试。

C++中单参数构造函数的特殊用途_第6张图片

由此可见用explicit修饰的有参构造函数允许强制类型转换。

说到这里我想到了一些问题,一个类的对象可以用括号、等号进行初始化,那么上面两个例子中如果改成括号初始化会怎样。

C++中单参数构造函数的特殊用途_第7张图片
C++中单参数构造函数的特殊用途_第8张图片
C++中单参数构造函数的特殊用途_第9张图片

C++中单参数构造函数的特殊用途_第10张图片

从上面4幅图可以看出无论加不加explicit修饰使用()进行初始化都能进行隐式类型转换。这说明括号是代表一种函数的调用,它没有上升到类型的层面,而等号却不。

我看这部分的时候对上述用=初始化的行为是调用COPY构造函数还是普通构造函数还是COPY赋值操作符产生了疑问,这就代表我对这方面还不深刻。COPY构造函数是说在声明类对象的同时用一个现存的对象为该对象进行初始化,COPY赋值操作符是指一个对象,这个对象不论是什么状态,它只是一个单纯地被其他对象赋值的操作,这两个操作的右值都是对象。而应用构造函数的场景下的右值却不一定是对象。

不过在这里等号等同于下面两条语句,也就是标准语法:

C++中单参数构造函数的特殊用途_第11张图片

不同的是这两条语句可以适用于多参数的构造函数。

你可能感兴趣的:(C++中单参数构造函数的特殊用途)