因題目雖然簡短,但很有意思。有點小坑,表面看上去覺得是正確的,實際是錯誤的。所以在做題時多費了點時間,故在此記錄一下,以便以後查閱。
解題是基於第7章 類的靜態成員 的知識點、vs2017環境。
題目:下面的靜態資料成員的宣告和定義有錯誤嗎?請解釋原因。
class example{
public:
static double rate = 6.5;
static const int vecsize = 20;
static vectorvec(vecsize);
#include"example.h"
double example::rate;
vectorexample::vec;
解:1、static double rate = 6.5; //錯誤,帶類內初始化的表示式的靜態資料成員 必須具有不可變的 常量整型型別。
知識點1:一般來說,不能在類的內部初始化靜態成員。相反,必須在類的外部定義和初始化每個靜態成員。
知識點2:然而,可以為靜態成員提供const 整數型別的類內初始值,不過要求靜態成員必須是字面值常量型別的constexpr。(以上兩點摘至c++primer第五版 第七章 270頁)
故: 應該類內宣告,類外定義和初始化靜態成員 。static double rate = 6.5修改為 static double rate;
double example::rate; 修改為 double example::rate = 6.5;
如果想定義為常量,兩個語句都加上const即可。
2、static const int vecsize = 20; //正確
知識點3:如果某個靜態成員的應用場景僅限於編譯器可以替換他的值得情況,則乙個初始化的const或 constexpr不需要分別定義。
知識點4:即使乙個常量靜態資料成員在類內部部初始化了,通常情況下也應該在類的外部定義一下該成員。
(以上兩點摘至c++primer第五版 第七章 271頁)
故:可以在example.c 檔案 加上vecsize 的定義。
3、static vectorvec(vecsize); //錯誤,編譯器報 vecsize 型別錯誤。
在類內,編譯會將此語句認為是成員函式的宣告。
故:此語句必須類內宣告,類外定義和初始化。static vectorvec(vecsize); 修改為 static vectorvec;
vectorexample::vec; 修改為 vectorexample::vec(vecsize);
知識點5:從類名開始,這條語句的剩餘部分就都位於類的作用之內了。(摘至c++primer第五版 第七章 270頁)
所以vectorexample::vec(vecsize); 語句可以直接使用 類的資料成員 vecsize,如果 vecsize 是私有成員也是一樣的。
C Prime 中文版第五版 第七章 類 筆記
1.類的基本思想是資料抽象和封裝。資料抽象是一種依賴於介面和實現分離的程式設計。2.定義在類內部的函式是隱式inline函式。3.this的目的總是指向 這個 物件,所以this是乙個常量指標。4.c 語言的做法是允許把const關鍵字放在成員函式的引數列表之後,此時,緊跟在引數列表後面的const...
c primer 第五版課後習題 第五章
第五章主要講了函式 include include include include using namespace std void test 5 9 std cout 母音字母個數為 t cnt endl void test 5 10 std cout 母音字母a的個數為 t cnt a endl...
C Primer第五版 第五章 程式設計題
5.9 編寫一段程式,使用一系列if語句統計從cin讀入的文字中有多少母音字母。include void main std cout a acnt std endl std cout e ecnt std endl std cout i icnt std endl std cout o ocnt s...