1. 程式人生 > >關鍵字explicit與建構函式

關鍵字explicit與建構函式

當我們新建了一個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建構函式

當我們新建了一個Qt的widgets應用工程時。會自動生成一個框架,包含了幾個檔案。其中有個mainwindow.h的標頭檔案。就是你要操縱的UI主介面了。我們看看其中的一段程式碼: class MainWindow : public QMainWindo

java 筆記 this關鍵字建構函式

public String toString() { return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", sal=" + sal + "]"; } public Em

C++ explicit關鍵字應用於建構函式

C++ explicit關鍵字主要是用來對建構函式進行修飾,來表明這一建構函式是顯示的。那麼在這裡大家就一起來看看其正確的使用方法吧。 C++ 程式語言可以被看做是C語言的一個升級版本,其中有很多應用方式與C語言相似,但同時又比C語言功能更加強大,應用方式更加靈活。在這

【C++初學】類和物件定義建構函式

一.類和物件定義 class 型別名 { public: 公有成員(外部介面) private: 私有成員(只允許類內函式訪問,有後續操作) protected: 保護成員 二.建構函式 def:給物件進行初始化的函式。 gra: 函式名與類名相同; 無返回值(return); 1.委託

C++匿名物件建構函式

前言: 不得不承認,我是一個內心比較躁動的人。如果沒有一個純粹的學習環境,大部分時間我很難靜下心來,但是我還要說,學習使我感到快樂。對我而言,大部分埋頭啃書的時間都是枯燥乏味的,但是總有那麼一些恍然大悟的瞬間,一些雲開月明的瞬間,讓我興奮不已,那種無比充實而快

Go語言建構函式

Golang中沒有設計建構函式. 取而代之的, 設計Golang的大師希望你用普通函式去實現構造的任務. 一直只是覺得這只是體現Golang這門新語言的精簡設計之道, 直到自己實現編譯器後才發現建構函式的設計本身是值得商榷的我們先看下建構函式的規則建構函式呼叫規則構造引數量: 0表示沒有建構函式, 1

C++繼承建構函式、複製控制

        每個派生類物件由派生類中定義的(非static)成員加上一個或多個基類子物件構成,因此,當構造、複製、賦值和撤銷派生型別物件時,也會構造、複製、賦值和撤銷這些基類子物件。 建構函式和複製控制成員不能繼承,每個類定義自己的建構函式和複製控制成員。像任何類一樣,

C++中類的組合建構函式

首先看看建構函式的概念。在程式執行過程中,當遇到物件宣告語句時,程式會想作業系統申請一定的記憶體空間用於存放新建的物件。而編譯器不知道如何產生程式碼來實現初始化。所以C++做了一套物件初始化的機制,就是建構函式。 然後是類的組合中,當建立類的物件時,如果這個類

繼承建構函式

問題描述:設計一個學生類Student,其屬性有:姓名(name)、年齡(age)、學歷(education),由Student類派生出本科生類Undergraduate和研究生類Graduate,本科生類增加屬性:專業(specialty),研究生類增加屬性:研究方向(direction)。每

工廠模式建構函式模式

簡單工廠模式 以Object建構函式或字面量的方式建立物件有著重複性,會產生大量重複程式碼的缺陷,由此,便出現了工廠模式。 function createObj (name,age) { var obj = new Object(); obj.name = name; obj.a

C++建構函式初始化列表建構函式中的賦值的區別

C++類中成員變數的初始化有兩種方式:          建構函式初始化列表和建構函式體內賦值。下面看看兩種方式有何不同。          成員變數初始化的順序是按照在那種定義的順序。 1、內部資料型別(char,int……指標等) class Animal { publ

關於類中new物件建構函式執行順序的問題

     如下有3個類,其中COM是表示元件類別。Root類包含一個COM物件引用,Root中派生出Stem類(即Stem類繼承Root類)。每個類都有一個無引數的建構函式,列印當前的類名。其中Root類中擁有一個靜態程式碼塊。 package com.practise;

解構函式建構函式

何時呼叫建構函式和解構函式 建構函式的作用是保證每個物件的資料成員都有何時的初始值。 解構函式的作用是回收記憶體和資源,通常用於釋放在建構函式或物件生命期內獲取的資源。 一般我們都知道構造和析構的次序:     構造從類層次的最根處開始,在每一層中,首先呼叫基類的建構函式,然後呼叫成員物件的建構函式。析構

類和物件的六個預設成員函式之this指標建構函式

類和物件的六個預設成員函式之建構函式 this指標: 在C++中的成員函式也是按照C類似的方式處理的,即:成員函式實際上也有一個指標時隱藏的,指向了呼叫函式的物件本身,這個指標就是this指標 t

C++初始化列表建構函式異同

內建型別成員 int,float,double,long,陣列,指標等。 C++類建構函式初始化列表 以一個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟一個放在括號中的初始化式。例如: class CExample { pub

php函式過載建構函式過載

php中的call_user_func_array的作用 一、直接呼叫方法function test($a, $b) {echo '測試一:'.$a.$b;}//呼叫test方法,array("asp", 'php')對應相應的引數call_user_func_array('test', array("

從Qt談到C++(一):關鍵字explicit隱式型別轉換

提出疑問 當我們新建了一個Qt的widgets應用工程時。會自動生成一個框架,包含了幾個檔案。其中有個mainwindow.h的標頭檔案。就是你要操縱的UI主介面了。我們看看其中的一段程式碼: class MainWindow : public QMainWindow {

c++中用malloc分配用new分配以及建構函式建構函式的執行

#include <stdio.h> #include <string.h> #include <malloc.h> class USER { public: USER() { printf("construct user\n"

繼承建構函式分析

--- class Person { private String name; private String location; Person(String name) { this.name = name; location = "beijing"; }

C++關鍵字explicit隱式類型別轉換

最近在翻閱EffectiveC++一書,就邊學邊做筆記了,之前很多東西沒能及時整理上來,當時的想法是害怕自己在閱讀過程中很多東西不能夠理解的很深刻,之後就是不斷的遺忘再遺忘或者隨著時間的推移就不想去碼字了,時間真是個可怕的東西,年齡大了就開始害怕了。C++術語(Termino