從一道題談C 容器內元素的型別約束

2021-05-25 11:51:00 字數 2635 閱讀 1509

《c++ primer》第四版中文267頁,9.1.2

不久前我複習的時候還標記了一下,沒想到理解得還不深刻啊。。

今天演算法群有網友提問

這個程式看起來很蛋疼啊, x,y還搞成const...好吧,姑且不說這個了,說一下程式的問題。

這個程式直接編譯的話,會有錯誤

但是加了個賦值函式,裡面是空的,就通過編譯了

point& operator= (const point& p)

這個cout語句被沒有執行

首先,回到開頭我提到的《c++ primer》裡面所說的約束條件,放入vector的類一定要支援賦值和複製操作! 但對於一般自己定義的類,我們如果不定義的話,使用系統預設提供的複製和賦值函式就行了,不會有什麼問題。但這道題由於使用了const成員變數,又有了其他問題。

「對包含const成員變數的類而言,編譯器不提供預設 賦值拷貝 ( = ) 函式的需要自己定義」

這就解釋了為什麼我們不定義賦值函式,編譯器會報錯!

但在賦值函式裡面加了cout列印資訊,為什麼又沒有輸出呢?

vector.tcc裡面的**不是一般的不好懂, 我還沒看stl的原始碼剖析,所以不敢亂吹。暫時的話,也沒有什麼興趣研究(還有另外乙個問題,stl怎麼實現提供預設的複製賦值函式?)。姑且認為vector會檢查複製和賦值函式兩個條件吧(注意到出錯的提示是在push_back函式。直覺上像是因為呼叫引起錯誤的...),因為實際上的的確確沒有列印出東西,我們可以肯定程式沒有執行進去。我們顯式呼叫賦值函式後,即

程式確實有輸出。

最後的結論:」對包含const成員變數的類而言,一定記得自己定義賦值函式哦親」

這道題我之前沒能想出來,實在慚愧。我自己平時玩acm,所以還是寫c比較多,c++當然也有學。不過,學校的課不要指望能有多深,水得不行。我自己覺得把,程式設計的話還是得自己多寫,在實踐中學習那是最好的。模擬乙個例子,就像背單詞一樣,拿著單詞本揹我覺得很不好,很多時候即使看到那個單詞,你依然不能斷定到底這裡面是用了單詞的哪個解釋;又或者想用乙個詞的時候,想不起那個詞來。一些人原本英語很爛,但出國多年後英語照樣槓槓的,我覺得在實際的語境中學語言是最好的,程式設計也一樣!

在群友的追問下,得知這道題的**..

這個題目是金山的筆試題

編譯下面的** (左側的數字是行號, 並非**的一部分, 檔名為 hello.cpp)

1 #include 

23 struct point 

89     int const x;

10     int const y;

11 };

1213 int main()

14 會產生類似下面的編譯錯誤

hello.cpp: in member function 『point& point::operator=(const point&)』:

hello.cpp:3:14:

instantiated from `

void std::vector<_tp>::insert(std::vector<_tp>::iterator,

const _tp&)

[with

_tp = point,

_alloc = std::allocator

]'/usr/include/.../stl_vector.h:??:??:

instantiated from `void std::vector<_tp>::push_back(const value_type&)

[with

_tp = point,

_alloc = std::allocator,

value_type = point

]'hello.cpp:16:30:   instantiated from here

hello.cpp:3:14: error: non-static const member `const int point::x',

can't use default assignment operator

hello.cpp:3:14: error: non-static const member `const int point::y',

can't use default assignment operator

in file included from /usr/include/...ector:??:??,

from hello.cpp:1:

/usr/include/...ector.tcc: in member function `

void std::vector<_tp>::insert(std::vector<_tp>::iterator,

const _tp&)

[with

_tp = point,

_alloc = std::allocator

]':/usr/include/...ector.tcc:??:??: note: synthesized method

`point& point::operator=(const point&)' first required here

請問, 編譯錯誤要表達什麼資訊? 你會如何修改上述**以編譯通過, 同時保持相近的**意義?

從一道題談C 容器內元素的型別約束

c primer 第四版中文267頁,9.1.2 不久前我複習的時候還標記了一下,沒想到理解得還不深刻啊。今天演算法群有提問 類中包含const成員變數時,如何定義 拷貝賦值函式 include struct point int const x int const y int main 這個程式看起...

從一道題談C 中構造函式呼叫建構函式

題目如下 問下列 的列印結果為0嗎?include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,...

從一道題簡談單調佇列(乙個蒟蒻的理解)

首先引入乙個問題,原 本人翻譯如下 題目描述 給乙個大小為n 的陣列 n 10 6 有乙個大小為k的滑動窗,從陣列的最左邊移動到最右邊。你只能在窗中看到k個數字。每次滑動窗向右移動乙個位置。以下為示例 窗的位置 最小值最大值 1 3 1 3 5 3 6 7 13 1 3 1 3 5 3 6 7 3 ...