欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼

 更新時(shí)間:2017年02月27日 08:50:57   投稿:lqh  
這篇文章主要介紹了C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下

C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼

一般來說,關(guān)于C++類靜態(tài)成員的初始化,并不會讓人感到難以理解,但是提到C++ 靜態(tài)成員的"類內(nèi)初始化"那就容易迷糊了。

我們來看如下代碼:

//example.h
#include<iostream>
#include<vector>
using namespace std;

class Example{
public:
  static double rate = 6.5;
  static const int vecSize = 20;
  static vector<double> vec(vecSize);
};

//example.cpp
#include "example.h"
double Example::rate;
vector<double> Example::vec;

我們需要判斷上面的靜態(tài)數(shù)據(jù)成員的聲明和定義有沒有錯(cuò)誤,并解釋原因。

首先,要謹(jǐn)記:通常情況下,不應(yīng)該在類內(nèi)部初始化成員,無論是否為靜態(tài)成員。

其次,若一定要在類內(nèi)初始化靜態(tài)成員,那么就必須滿足如下條件才行:

1) 靜態(tài)成員必須為字面值常量類型的constexpr。

      所謂的字面值類型就是通常遇到的:算術(shù)類型,引用,指針等。字面值常量類型就是const型的算術(shù)類型,引用,指針等。

      所謂的constexpr,就是常量表達(dá)式,指值不會改變且在編譯過程中就能得到計(jì)算結(jié)果的表達(dá)式。比如字面值,或者用常量表達(dá)式初始化的const對象也是常量表達(dá)式。為了幫助用戶檢查自己聲明/定義的變量的值是否為一個(gè)常量表達(dá)式,C++11新規(guī)定,允許將變量聲明為constexpr類型,以便由編譯器來進(jìn)行驗(yàn)證變量是否為常量表達(dá)式。

2)給靜態(tài)成員提供的初始值,必須為常量表達(dá)式

注意:在C++ primer 第五版中說:只能給靜態(tài)成員提供const 整數(shù)類型的類內(nèi)初始值,且該const整數(shù)類型的初始值必須是常量表達(dá)式。我覺得是有誤的!詳情見后面分析。

有了這兩條原則,我們就可以對上面的代碼進(jìn)行驗(yàn)證了。

1)static double rate = 6.5;

顯然不滿足第一條:因?yàn)閞ate不是常量類型。改成constexprt static const double rate = 6.5即可

從這里也可以看出初始值不一定必須為const 整數(shù)類型。

ps: 如果我們不再這里加入constexprt修飾符的話,編譯器會提示錯(cuò)誤:error: ‘constexpr' needed for in-class initialization of static data member ‘const double Example::rate' of non-integral type [-fpermissive]

大體意思就是,對于非const整數(shù)類型的初始值,如果它是常量表達(dá)式的話,我們需要手工在前面添加修飾符constexprt。

至于Example.cpp文件中的定義部分,由于我們已經(jīng)在類內(nèi)部進(jìn)行了初始化,就不需要再在類外部進(jìn)行定義了。如果非要定義的話,必須采用如下格式:

//example.cpp


constexpr const double Example::rate; //其中的const是可以刪除的,因?yàn)閏onstexprt本身就包含了const

2)static const int vecSize = 20;

vecSize是const int類型的,且為常量表達(dá)式——滿足第一條;提供的初始值為20,是一個(gè)常量表達(dá)式——滿足第二條!且由于是const int型的,前面可以不用修飾符constexpr。

3)static vector<double> vec(vecSize);

錯(cuò)誤!vector是模板不是字面值常量類型,所以不滿足第一條。應(yīng)該改為 static vector<double> vec; //僅僅且只能進(jìn)行聲明,不能定義

然后在Example.cpp中進(jìn)行定義:

static vector<double> vec(Example::vecSize);

現(xiàn)在我們可以在Example.cpp中添加測試代碼進(jìn)行測試了:

#include "example.h"
vector<double> Example::vec(Example::vecSize);
constexpr const double Example::rate;

int main(){

  Example::vec.push_back(10.5);
  cout << Example::vec.back() << endl;
  cout << Example::rate << endl;
  cout << Example::vecSize << endl;
}

執(zhí)行結(jié)果:

wanchouchou@wanchouchou-virtual-machine:~/c++/7.5$ ./Example 
10.5
6.5
20

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 使用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實(shí)現(xiàn)步驟

    使用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實(shí)現(xiàn)步驟

    這篇文章主要介紹了用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實(shí)現(xiàn)步驟,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • C++?11新特性之右值引用使用案例與應(yīng)用場景

    C++?11新特性之右值引用使用案例與應(yīng)用場景

    右值引用和move語義是C++ 11中重要的特性之一,可以提高程序的效率和性能,右值引用是一種新的引用類型,下面這篇文章主要給大家介紹了關(guān)于C++?11新特性之右值引用使用案例與應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • C++使用opencv調(diào)用級聯(lián)分類器來識別目標(biāo)物體的詳細(xì)流程

    C++使用opencv調(diào)用級聯(lián)分類器來識別目標(biāo)物體的詳細(xì)流程

    所謂級聯(lián)分類器其實(shí)就是把分類器按照一定的順序聯(lián)合到一起,下面這篇文章主要給大家介紹了關(guān)于C++使用opencv調(diào)用級聯(lián)分類器來識別目標(biāo)物體的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 嵌入式QT移植的實(shí)現(xiàn)

    嵌入式QT移植的實(shí)現(xiàn)

    本文主要介紹了嵌入式QT移植的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++如何去除cpp文件的注釋詳解

    C++如何去除cpp文件的注釋詳解

    在日常工作中,我們會給c/c++代碼寫上一些注釋,但是往往為了保持最終的代碼盡可能小,我們需要?jiǎng)h除注釋,手動刪除太緩慢了,下面這篇文章主要給大家介紹了關(guān)于C++如何去除cpp文件注釋的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 詳解C++中StringBuilder類的實(shí)現(xiàn)及其性能優(yōu)化

    詳解C++中StringBuilder類的實(shí)現(xiàn)及其性能優(yōu)化

    在Java和C#中,StringBuilder可以創(chuàng)造可變字符序列來動態(tài)地?cái)U(kuò)充字符串,那么在C++中我們同樣也可以實(shí)現(xiàn)一個(gè)StringBuilder并且用來提升性能,下面就來詳解C++中StringBuilder類的實(shí)現(xiàn)及其性能優(yōu)化
    2016-05-05
  • 解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法

    解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法

    本篇文章是對Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 基于c++中的默認(rèn)拷貝函數(shù)的使用詳解

    基于c++中的默認(rèn)拷貝函數(shù)的使用詳解

    本篇文章對c++中默認(rèn)拷貝函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • C++教程之變量的作用域與生命周期詳解

    C++教程之變量的作用域與生命周期詳解

    在C++編程中,變量的作用域和生命周期是非常重要的概念。了解這些概念可以幫助開發(fā)人員編寫更好的代碼并避免錯(cuò)誤。在本文中,我們將探討C++中變量的作用域和生命周期,以及如何正確地使用它們
    2023-04-04
  • VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲

    VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲

    本文主要介紹了VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲,實(shí)現(xiàn)了視頻,拍照,保存這三個(gè)功能。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論