MOOC易錯題彙總-C++

派生類構造函數的成員初始化列表中,不能包含的初始化項是()。

這裏所說的“基類的子對象”即基類的數據成員

在C++中,構造函數不能被繼承,因此,派生類的構造函數必須通過調用基類的構造函數來初始化基類子對象。
在派生類初始化列表直接初始化基類的成員,被稱爲“越級初始化”,是會報錯的。

舉個栗子:
我們先創建一個基類,裏面有一個int型子對象

class A{
	protected:
		int n;//基類的子對象
	public:
		A();
		A(int temp):n(temp){}
}; 

然後創建一個派生類,並用派生類構造函數的初始化列表來進行“越級初始化”

class B:public A{
	public:
		B(int temp):n(temp){}//對基類子對象n進行初始化
};

在主函數中調用

int main()
{
	B(1);
	return 0;
}

結果報錯:[Error] class ‘B’ does not have any field named ‘n’

所以越級初始化是不可以的,但是可以“越級賦值”(自造名詞哈哈)

class B:public A{
	public:
		///B(int temp):n(temp){}
		///改爲
		B(int temp){n=temp};
};

這樣就可以完美運行了。

因此,派生類的構造函數必須通過調用基類的構造函數初始化基類成員,不能夠在派生類初始化列表直接初始化基類的成員

類模板與模板類的區別

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CSZGgNyv-1579091773306)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219095637.png)]

回顧一下基本概念

——類模板是指:

template <class T>
class A{
...........
};

——類模板實例化:從通用的類模板定義中生成類的過程稱爲模板實例化,如:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vZ1Gh7ow-1579091773307)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219100943.png)]
所以說題目中D選項就是錯誤的,類模板實例化出來的是類的實例,而不是對象。

——模板類是啥?? 參考一下《C++ Primer Plus》解釋:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9jq1wTxW-1579091773307)(https://cdn.jsdelivr.net/gh/cnatom/images/images/asdasdasx.png)]

也就是說:

Stack<int> obj;
//Stack<int>是模板類
//而obj是由這個模板類所聲明的一個對象

所以說A.C選項是錯誤的,產生的模板類應該是tanytemp<int>

我認爲此答案可能錯誤,歡迎在評論區批評指正!

關於this指針的描述

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4e6Eg1b0-1579091773308)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219101637.png)]
這個題看走眼了啊啊啊啊啊啊啊

——C選項:形參(obj)到實參(this)的拷貝過程中才創建this指針(實參),由系統自動生成

——D選項:this指針的顯示使用:

class A{
    private:
        int num;
    public:
        A(int num=0){
            this->num = num;//顯示使用了this指針
        }
}

剛剛在敲上述代碼的時候發現了一個問題,如果構造函數這樣寫:

A(int num=0):this->num(num){}

就會爆出兩個錯誤:

[Error] expected '{' before 'this'
[Error] expected identifier before 'this'

產生了一個新的問題,“能不能在構造函數的初始化列表使用this指針?”

帶着疑問,搜了一下網上的解釋

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-a1Ipb2Dt-1579091773308)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219103633.png)]
但是通過剛剛的例子,可以明顯的看出,在構造函數的初始化列表中是不能用this指針的。具體原因,等以後重新翻看文檔尋找答案(貌似涉及到底層的東西?)

類在什麼時候產生對象?

產生對象的幾種情況:

example x(5);//類名 對象名;
example arr[2] = {1,2};//數組的方式,產生兩個
x=example(15);//用example(15)生成一個臨時對象,再將對象賦給同類對象x

不禁讓我想起了另一個題

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mXHgq5yq-1579091773309)(https://cdn.jsdelivr.net/gh/cnatom/images/images/20191219105035.png)]

這裏只是定義了三個PAT型的指針,並沒有產生任何對象,調用構造函數也就無從談起了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章