《c++ primer》第四版中文267頁,9.1.2
不久前我複習的時候還標記了一下,沒想到理解得還不深刻啊。。
今天演算法群有網友提問
類中包含const成員變數時,如何定義 拷貝賦值函式 ? #include struct point int const x; int const y; }; int main()
這個程式看起來很蛋疼啊, x,y還搞成const...好吧,姑且不說這個了,說一下程式的問題。
這個程式直接編譯的話,會有錯誤
但是加了個賦值函式,裡面是空的,就通過編譯了首先,回到開頭我提到的《c++ primer》裡面所說的約束條件,放入vector的類一定要支援賦值和複製操作! 但對於一般自己定義的類,我們如果不定義的話,使用系統預設提供的複製和賦值函式就行了,不會有什麼問題。但這道題由於使用了const成員變數,又有了其他問題。point& operator= (const point& p)
這個cout語句被沒有執行
「對包含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 ...