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

2021-08-25 20:47:34 字數 2655 閱讀 9738

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

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

今天演算法群有網友提問

類中包含const成員變數時,如何定義 拷貝賦值函式 ? #include struct point int const x; int const y; }; int main()

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

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

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

point& operator= (const point& p)

這個cout語句被沒有執行

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

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

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

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

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

pts[0]=point(2,0);

程式確實有輸出。

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

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

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

這個題目是金山的筆試題

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

1#include

23structpoint

89intconstx;

10intconsty;

11};

1213intmain()

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

hello.cpp:inmemberfunction『point&point::operator=(constpoint&)』:

hello.cpp:3:14:

instantiatedfrom`

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

const_tp&)

[with

_tp=point,

_alloc=std::allocator

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

instantiatedfrom`voidstd::vector<_tp>::push_back(constvalue_type&)

[with

_tp=point,

_alloc=std::allocator,

value_type=point

]'hello.cpp:16:30:instantiatedfromhere

hello.cpp:3:14:error:non-staticconstmember`constintpoint::x',

can'tusedefaultassignmentoperator

hello.cpp:3:14:error:non-staticconstmember`constintpoint::y',

can'tusedefaultassignmentoperator

infileincludedfrom/usr/include/...ector:??:??,

fromhello.cpp:1:

/usr/include/...ector.tcc:inmemberfunction`

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

const_tp&)

[with

_tp=point,

_alloc=std::allocator

]':/usr/include/...ector.tcc:??:??:note:synthesizedmethod

`point&point::operator=(constpoint&)'firstrequiredhere

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

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

c primer 第四版中文267頁,9.1.2 不久前我複習的時候還標記了一下,沒想到理解得還不深刻啊。今天演算法群有提問 這個程式看起來很蛋疼啊,x,y還搞成const.好吧,姑且不說這個了,說一下程式的問題。這個程式直接編譯的話,會有錯誤 但是加了個賦值函式,裡面是空的,就通過編譯了 poin...

從一道題談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 ...