//Cube.h
class Cube{
public:
double side;
Cube(double side);
double Volume();
bool compareVolume(Cube aCube);
};
//Cube.cpp
#include "Cube.h"
Cube::Cube(double side):side(side){}
double Cube::Volume(){
return side*side*side;
}
bool Cube::compareVolume(Cube aCube){
return Volume()>aCube.Volume();
}
//main.cpp
#include <iostream>
#include "Cube.h"
using namespace std;
int main(int argc, char *argv[]) {
Cube box1(5.0);
Cube box2(3.0);
if(box1.compareVolume(box2))
cout<<"box1 is larger";
else cout<<"box1 is not larger";
system("PAUSE");
return EXIT_SUCCESS;
}
========================================================================
//main.cpp 2
#include <iostream>
#include "Cube.h"
using namespace std;
int main(int argc, char *argv[]) {
Cube box1(5.0);
Cube box2(3.0);
if(box1.compareVolume(50.0))
cout<<"box1 is larger";
else cout<<"box1 is not larger";
system("PAUSE");
return EXIT_SUCCESS;
}
//编写这段代码的人误解了 compareVolume() 函数,认为他吧当前对象的体积与50.0相比较,
其实编译器吧参数50.0转换为了一个Cube对象。编译器生成的代码如下:
if(box1.compareVolume(Cube (50.0)))
cout<<"box1 is larger";
else cout<<"box1 is not larger";
函数没有把box1对象的体积与50.0比较,而是与Cube(50.0)的体积即125000.0进行比较。结果
与期望不同。
使用explicit关键字可以有效的避免这种情况:
//Cube.h
class Cube{
public:
double side;
explicit Cube(double side);
double Volume();
bool compareVolume(Cube aCube);
};
编译器不会吧声明为 explicit 的构造函数用于隐士类型转换,现在你只能显示的创建对象。
if(box1.compareVolume(50.0)) //编译器报错
if(box1.compareVolume(Cube(50.0))) //通过