关键字explicit与构造函数
從Qt談到C++(一):關鍵字explicit與構造函數
時間 2014-04-26 22:55:44 CSDN博客 原文 http://blog.csdn.net/guodongxiaren/article/details/24455653
提出疑問
當我們新建了一個Qt的widgets應用工程時。會自動生成一個框架,包含了幾個文件。其中有個mainwindow.h的頭文件。就是你要操縱的UI主界面了。我們看看其中的一段代碼:
class MainWindow : public QMainWindow
{
Q_OBJECT//一個宏,暫不考慮
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
這段代碼定義了一個新的類MainWindow,繼承自QMainWindow。我們可以看到在它的構造函數里,前面有一個關鍵字 explicit 。相信大家都對沒有這個關鍵字的構造函數不陌生。那么這個 explicit 是起到什么作用的呢?
explicit研究
explicit是C++中的關鍵字,不是C語言中的。英文直譯是“明確的”、“顯式的”意思。出現這個關鍵字的原因,是在C++中有這樣規定的基礎上: 當定義了只有一個參數的構造函數時,同時也定義了一種隱式的類型轉換。 先看類型轉換。
類型轉換
C/C++中,有很多類型轉換。比如:
double a = 12.34;
int b = (int)a;
我們都知道這時b的值是12. 在變量前面加括號包裹的類型,就能實現顯式的類型轉換。這種叫做強制類型轉換。順便值得一提的是,C++中還支持這種強制類型轉換的例子:
double a = 12.34;
int b = int(a);
除此之外,還有一種轉換叫做 隱式類型轉換。
double a = 12.34;
int b = a;
同樣的,b的值也是12.雖然沒有顯式的轉換類型,但是編譯器會幫你自動轉換。同樣的,不僅是基本數據類型,自己定義的類和對象之間也存在這種轉換關系。
隱式轉換的場景
等于號與構造函數
比如你有一個類的對象A:
class A
{
public:
A(int i)
{
a = i;
}
int getValue()
{
return a;
};
private:
int a;
};
你會發現,你在main函數中,使用下面的語句時是合法的:
A a = 10;
之所以類A的對象可以直接使用整型通過等于號來初始化,是因為這一語句調用了默認的單參數構造函數,其效果等價于 A temp(10); a(temp);
首先編譯器執行A temp(10);在棧中創建了一個臨時對象(假設叫做temp)。然后再調用對象a的拷貝初始化構造函數 a(temp) 給a初始化。然后臨時對象temp銷毀。這就是編譯器做的隱式轉換工作。你可以想到這樣的隱式操作的結果和直接顯示調用A a(10);的結果是一樣的,但是隱式轉換因為使用了拷貝構造函數所以在開銷上會更高一些。當然這基本數據類型,或許不明顯。如果一個復雜的對象,比如Qt的窗口。那么開銷可想而知。
又如當你使用如下語句會不通過:
A a = “123”;
因為沒有參數為字符串的單參數構造函數。知道了這個,你修改一下就能通過了。
class A
{
public:
A(int i)
{
a = i;
}
A(char * c)
{
a=c[0];
}
int getValue()
{
return a;
};
private:
int a;
};
函數調用
我們再定義一個函數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<
總結
以上是生活随笔為你收集整理的关键字explicit与构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: this指针的用法详解
- 下一篇: 类的初始化(构造函数)