说明

如下代码收拾

cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Weight {
Weight(int wh, double lbs);
Weight(double lbs);
private:
int m_wh;
double m_lbs;
};

Weight::Weight(int wh, double lbs)
{
m_wh = wh;
m_lbs = lbs;
}

Weight::Weight(double lbs)
{
m_wh = lbs / 2;
m_lbs = lbs;
}

Weight类并非真的需要声明构造函数,因为自动生成的默认构造函数就很好。但是Weight类提供了两个构造函数。一个是int,double类型的,一个是double类型的,每个构造函数都给私有成员全部赋了值。因为创建Weight对象时,将会自动设置这两种重量表示。

因为Weight对象表示一个重量,因为可以提供一种整数值或者浮点值转换为Weight对象的方法。即:

cpp
1
2
Weight wh;
wh = 19.6;

程序将使用构造函数Weight(double)来创建一个临时的Weight对象。随后采用逐成员赋值方式将该临时对象的内容复制到wh中。这一过程称为隐式转换,因为它是自动进行的,而不需要显式强制类型转换。

但情况是,只有接受一个参数的构造函数才能作为转换函数。如Weight(int,double)就不可以。

然而,如果第二个参数提供了==默认值==,它便可以用于转换int

Weight(int, double lbs = 0);

在这个时候,便会导致意外的类型转换。因此,C++新增了关键字explicit,用于关闭这种特性。也就是在声明构造函数时加上explicit关键字。

cpp
1
2
3
4
5
6
7
class Weight {
explicit Weight(int wh, double lbs);
explicit Weight(double lbs);
private:
int m_wh;
double m_lbs;
};

添加explicit关键字之后,便可以关闭上述中的隐式转换,但仍然允许显式转换,即显式强制类型转换。

cpp
1
2
3
4
Weight weight; 			// create a Stonewt object
weight = 19.6; // not valid if Stonevt(double) is declared as expliclt
weight = Weight(19.61); // ok,an explicit corversion
weight = (Weight)19.6; //ok,old form for explicit typecat