//cube.h
class cube
double cube::volume(){
return side*side*side;
bool cube::comparevolume(cube acube){
return volume()>acube.volume();
//main.cpp
#include
#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
#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))) //通過
關於explicit關鍵字
今天在看乙個源程式的時候用到了explicit關鍵字。在網上查詢了一下該關鍵字的作用。沒有進行試驗,只是整理了下 1.explicit主要和建構函式一起使用.2.當explicit修飾建構函式的時候,對於呼叫該建構函式進行進行 隱式 轉換的 將不會通過 3.解除explicit的方式,就是使用強制轉...
explicit(顯示)關鍵字
explicit 使用 struct a operator bool const struct b explicit operator bool const void doa a a void dob b b intmain ok 直接列表初始化 a a4 ok 複製列表初始化 a a5 a 1 o...
C 的explicit關鍵字
c 的explicit關鍵字 c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面...