explicit 關鍵字的使用

2021-04-18 08:33:17 字數 1487 閱讀 5312

//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 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面...