日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关键字explicit与构造函数

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关键字explicit与构造函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從Qt談到C++(一):關(guān)鍵字explicit與構(gòu)造函數(shù)
時間 2014-04-26 22:55:44 CSDN博客 原文 http://blog.csdn.net/guodongxiaren/article/details/24455653
提出疑問

當(dāng)我們新建了一個Qt的widgets應(yīng)用工程時。會自動生成一個框架,包含了幾個文件。其中有個mainwindow.h的頭文件。就是你要操縱的UI主界面了。我們看看其中的一段代碼:

class MainWindow : public QMainWindow
{
Q_OBJECT//一個宏,暫不考慮

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
};

這段代碼定義了一個新的類MainWindow,繼承自QMainWindow。我們可以看到在它的構(gòu)造函數(shù)里,前面有一個關(guān)鍵字 explicit 。相信大家都對沒有這個關(guān)鍵字的構(gòu)造函數(shù)不陌生。那么這個 explicit 是起到什么作用的呢?
explicit研究

explicit是C++中的關(guān)鍵字,不是C語言中的。英文直譯是“明確的”、“顯式的”意思。出現(xiàn)這個關(guān)鍵字的原因,是在C++中有這樣規(guī)定的基礎(chǔ)上: 當(dāng)定義了只有一個參數(shù)的構(gòu)造函數(shù)時,同時也定義了一種隱式的類型轉(zhuǎn)換。 先看類型轉(zhuǎn)換。

類型轉(zhuǎn)換

C/C++中,有很多類型轉(zhuǎn)換。比如:

double a = 12.34;
int b = (int)a;

我們都知道這時b的值是12. 在變量前面加括號包裹的類型,就能實現(xiàn)顯式的類型轉(zhuǎn)換。這種叫做強制類型轉(zhuǎn)換。順便值得一提的是,C++中還支持這種強制類型轉(zhuǎn)換的例子:

double a = 12.34;
int b = int(a);

除此之外,還有一種轉(zhuǎn)換叫做 隱式類型轉(zhuǎn)換。

double a = 12.34;
int b = a;

同樣的,b的值也是12.雖然沒有顯式的轉(zhuǎn)換類型,但是編譯器會幫你自動轉(zhuǎn)換。同樣的,不僅是基本數(shù)據(jù)類型,自己定義的類和對象之間也存在這種轉(zhuǎn)換關(guān)系。

隱式轉(zhuǎn)換的場景

等于號與構(gòu)造函數(shù)

比如你有一個類的對象A:

class A
{
public:
A(int i)
{
a = i;
}
int getValue()
{
return a;
};
private:
int a;
};

你會發(fā)現(xiàn),你在main函數(shù)中,使用下面的語句時是合法的:

A a = 10;

之所以類A的對象可以直接使用整型通過等于號來初始化,是因為這一語句調(diào)用了默認(rèn)的單參數(shù)構(gòu)造函數(shù),其效果等價于 A temp(10); a(temp);

首先編譯器執(zhí)行A temp(10);在棧中創(chuàng)建了一個臨時對象(假設(shè)叫做temp)。然后再調(diào)用對象a的拷貝初始化構(gòu)造函數(shù) a(temp) 給a初始化。然后臨時對象temp銷毀。這就是編譯器做的隱式轉(zhuǎn)換工作。你可以想到這樣的隱式操作的結(jié)果和直接顯示調(diào)用A a(10);的結(jié)果是一樣的,但是隱式轉(zhuǎn)換因為使用了拷貝構(gòu)造函數(shù)所以在開銷上會更高一些。當(dāng)然這基本數(shù)據(jù)類型,或許不明顯。如果一個復(fù)雜的對象,比如Qt的窗口。那么開銷可想而知。

又如當(dāng)你使用如下語句會不通過:

A a = “123”;

因為沒有參數(shù)為字符串的單參數(shù)構(gòu)造函數(shù)。知道了這個,你修改一下就能通過了。

class A
{
public:
A(int i)
{
a = i;
}
A(char * c)
{
a=c[0];
}
int getValue()
{
return a;
};
private:
int a;
};

函數(shù)調(diào)用

我們再定義一個函數(shù)print 用來打印A對象的值。

void print(A a)
{
cout<

include

using namespace std;
class A
{
public:
explicit A(int i);
A(char * c)
{
a=c[0];
}
int getValue()
{
return a;
};
private:
int a;
};
A::A(int i)//無需再指明explicit
{
a=i;
}
void print(A a)
{
cout<

總結(jié)

以上是生活随笔為你收集整理的关键字explicit与构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。