C Primer第五版 第七章 7 58習題

2021-10-01 15:06:32 字數 1493 閱讀 9044

因題目雖然簡短,但很有意思。有點小坑,表面看上去覺得是正確的,實際是錯誤的。所以在做題時多費了點時間,故在此記錄一下,以便以後查閱。

解題是基於第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...