下面具體探讨下C++中不能重載的運算符: “ ?: ”、 “ . ”、“ :: ” 、 “ sizeof ”和“.*”,原因如下: 在具體講解各個運算符不能重載之前,先來說明下【重載】: 重載的本意是讓操作符可以有新的語義,而不是更改文法——否則會引起混亂。 【注】重載的部分規則: 運算符函數的參數至少有一個必須是類的對象或者類的對象的引用。 (1). “ ?: ”運算符,假如能夠重載,那麼問題來了,看下面的語句:
1 | |
該運算符的本意是執行exp2和exp3中的一個,可是重載後,你能保證隻執行了一個嗎?還是說兩個都能執行?亦或兩條都不能執行? “ ?: ”運算符的跳轉性質就不複存在了, 這就是 “ ?: ” 運算符不能夠被重載的最主要原因。 (2). “ . ”運算符,假如能夠重載,那麼,問題來了,看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
" ."運算符的本意是引用對象成員的,然而被重載後就不能保證本意,進而帶來運算符意義的混淆,如果每個人都這麼重載,那更不容易學習C++語言了。
(3). “ :: ”運算符,M::a,該運算符隻是在編譯的時候域解析,而沒有運算的參與進來,由前面【注】重規則可知,如果重載之後,::運算符有了新的語義,那是不是會引起混淆呢? (4). “ sizeof ”運算符,該運算符不能被重載的主要原因是内部許多指針都依賴它,舉例說明重載的後果:
1 2 3 4 5 6 | |
(5) ".*"引用成員指針運算符,具體原因後面查明白了補充~ https://www.nowcoder.com/test/question/done?tid=10034430&qid=25530#summary