小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Qt5 中對(duì) C++11 一些新特性的封裝

 quasiceo 2013-05-09

 

C++11 是現(xiàn)在的 C++ 標(biāo)準(zhǔn)的名稱(chēng),C++11 為 C++ 語(yǔ)言帶來(lái)很多新特性。

而 Qt 4.8 是 Qt 首個(gè)在其 API 中開(kāi)始使用一些新的 C++11 特性的版本,我之前寫(xiě)過(guò)一篇博文:C++11 in Qt 4.8 描述了這個(gè)問(wèn)題,這里不再羅嗦。

在 Qt5 中,提供更多 C++11 的特性支持,接下來(lái)我們將進(jìn)行詳細(xì)的說(shuō)明。

slots (槽) 的 Lambda 表達(dá)式

Lambda 表達(dá)式 是 C++11 中的一個(gè)新語(yǔ)法,允許定義匿名函數(shù)。匿名函數(shù)可用于使用小函數(shù)作為參數(shù),而無(wú)需顯式的進(jìn)行聲明。之前可以通過(guò)編寫(xiě)函數(shù)指針來(lái)達(dá)到同樣的目的。

在 Qt 4.8 中已經(jīng)可在一些 QtConcurrent 函數(shù)中使用 Lambda 表達(dá)式了。但在 Qt5 中甚至可以通過(guò) new connect syntax 來(lái)將 Lambda 表達(dá)式作為 slots 來(lái)使用。

當(dāng)你需要為你的 slot 編寫(xiě)一個(gè)單行函數(shù)時(shí),你可以直接在當(dāng)前代碼位置編寫(xiě),這更具備可讀性:

connect (sender, &Sender::valueChanged, [=]( const QString &newValue) {
        receiver->updateValue( "senderValue" , newValue);
    });

Lambda 在 MSVC 2010, GCC 4.5, 和 clang 3.1 下也是支持的.

Unicode 文字

在 C++11 中,你可通過(guò) u"開(kāi)源中國(guó)" 來(lái)生成 UTF-16 字符串:

QString someString = QStringLiteral ( "oschina" );

請(qǐng)閱讀我之前發(fā)表的博文 about QStringLiteral.

常量表達(dá)式: constexpr

C++11 中全新的關(guān)鍵字 constexpr 用于注解一些 inline 函數(shù),用于指定它們可以在編譯時(shí)進(jìn)行計(jì)算。在 Qt5 中,我們引入 Q_DECL_CONSTEXPR 用來(lái)定義為 constexpr 以便讓編譯器支持。

我們同時(shí)還注解了一些 Qt 函數(shù)(例如 QFlags)允許他們直接在常量表達(dá)式中使用:

enum SomeEnum { Value1, Value2, Value3 };
Q_DECLARE_OPERATORS_FOR_FLAGS( QFlags <SomeEnum>)
// The previous line declares
// Q_DECL_CONSTEXPR QFlags<SomeValue> operator|(SomeValue,SomeValue) {...}
 
int someFunction( QFlags <SomeEnum> value) {
     switch (value) {
         case SomeEnum::Value1:
             return 1 ;
         case SomeEnum::Value2:
             return 2 ;
         case SomeEnum::Value1 | SomeEnum::Value3:
         // Only possible with C++11 and because QFlags operators are constexpr
         // Previously this line would call
         //        QFlags<SomeValue> operator|(SomeValue,SomeValue)
         // that would have thrown an error because only compiler constants
         // are allowed as case satement
 
             return 3 ;
         default :
             return 0 ;
     }
}

(在這里我還在值之前使用了 SomeEnum:: ,這在 C++11 中也是允許的,但之前是不允許的)

static_assert

C++11 可通過(guò)編譯時(shí)使用 static_assert 來(lái)幫助生成更詳細(xì)的錯(cuò)誤信息,在 Qt5 中對(duì)應(yīng)引入了宏 Q_STATIC_ASSERT 和 Q_STATIC_ASSERT_X ,它們可自動(dòng)判斷是否可用 static_assert ,如果不支持則使用其他模板來(lái)代替。

Qt 大量的使用了一些宏定義,來(lái)避免因?yàn)榫幾g器不支持某些 API 時(shí)采取的相應(yīng)措施。

Override 和 final

你在編碼的時(shí)候是否有過(guò)寫(xiě)了錯(cuò)誤的虛函數(shù)名稱(chēng),然后做了錯(cuò)誤實(shí)現(xiàn)的情況?或者忘記了某個(gè)該死的常量?

現(xiàn)在你可以使用 Q_DECL_OVERRIDE 宏來(lái)聲明這是一個(gè)對(duì)虛函數(shù)進(jìn)行定義的方法,來(lái)避免上述錯(cuò)誤(這個(gè)類(lèi)似 Java 里的 @Override 注解)。

如果編譯器支持的話,這個(gè)宏將被新的 override 屬性所替代,否則就不做任何處理。如果你使用支持 C++11 的編譯器來(lái)編譯代碼時(shí),當(dāng)你輸入錯(cuò)誤的名稱(chēng)時(shí)就會(huì)報(bào)編譯錯(cuò)誤的信息。

class MyModel : public QStringListModel {
     //...
protected :
      Qt::ItemFlags flags ( const QModelIndex & index)  Q_DECL_OVERRIDE;
};

同樣,如果我們忘記常量名也會(huì)報(bào)錯(cuò):

mymodel.h:15: error: `Qt::ItemFlags MyModel::flags(const QModelIndex&)`
 marked override, but does not override

還有另外一個(gè)宏 Q_DECL_FINAL 用來(lái)替換新的 final 屬性,這個(gè)用來(lái)指定某個(gè)虛函數(shù)不允許被重寫(xiě)。

Deleted 成員函數(shù)

新的 Q_DECL_DELETE 宏用來(lái)對(duì) delete 屬性進(jìn)行擴(kuò)展,如果編譯器支持 deleted 函數(shù)的話。這個(gè)用來(lái)獲取更清楚的編譯器錯(cuò)誤以避免常見(jiàn)的一些錯(cuò)誤。

Deleted 函數(shù)用來(lái)顯式的指定不讓編譯器自動(dòng)生成某些函數(shù),例如默認(rèn)的構(gòu)造器或者拷貝賦值操作符等。如果使用了 Deleted 函數(shù),那么當(dāng)你在代碼中使用了相應(yīng)操作就會(huì)報(bào)錯(cuò)。

我們?cè)?Q_DISABLE_COPY 宏的示例中使用過(guò) Q_DECL_DELETE,之前是讓這些成員函數(shù)變成 private,但錯(cuò)誤信息就不那么明確了。

Rvalue 引用和移動(dòng)構(gòu)造器

在我的文章 the Qt 4.8 article 中已經(jīng)解釋過(guò) rvalue 引用了。

因?yàn)?Qt5 中的共享類(lèi)的引用計(jì)算器內(nèi)部做了改變,因此現(xiàn)在可以 add a move constructor for many of them.

結(jié)論

MSVC 默認(rèn)的支持 C++11 無(wú)需設(shè)置任何參數(shù),但 GCC 和 Clang 需要使用 require-std=c++0x 來(lái)啟用 C++11 的支持。

默認(rèn)情況下,Qt5 自身是要求用 C++11 的參數(shù)進(jìn)行編譯的。

如果你使用 qmake 你可以在 .pro 項(xiàng)目文件中添加如下參數(shù):

CONFIG += c++11

(在 Qt4, 這個(gè)參數(shù)寫(xiě)法變成 gcc:CXXFLAGS += -std=c++0x)

現(xiàn)在你可以開(kāi)始體驗(yàn)各種 C++11 的新特性了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多