天天看點

C++中不能重載的運算符原因

下面具體探讨下C++中不能重載的運算符: “  ?:  ”、  “  .  ”、“  ::  ” 、 “ sizeof  ”和“.*”,原因如下:         在具體講解各個運算符不能重載之前,先來說明下【重載】:  重載的本意是讓操作符可以有新的語義,而不是更改文法——否則會引起混亂。         【注】重載的部分規則:  運算符函數的參數至少有一個必須是類的對象或者類的對象的引用。         (1).  “  ?:  ”運算符,假如能夠重載,那麼問題來了,看下面的語句:

1

exp1?exp2:exp3

        該運算符的本意是執行exp2和exp3中的一個,可是重載後,你能保證隻執行了一個嗎?還是說兩個都能執行?亦或兩條都不能執行?    “  ?:  ”運算符的跳轉性質就不複存在了,  這就是  “  ?:  ”  運算符不能夠被重載的最主要原因。              (2).  “  .  ”運算符,假如能夠重載,那麼,問題來了,看下面的例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

class

Y {

public

:

void

fun();

// ...

};

class

X { 

// 假設可以重載"."運算符

public

:

Y* p;

Y& operator.()

{

return

*p;

}

void

fun();

// ...

};

void

g(X& x){

x.fun(); 

//請告訴我,這裡的函數fun()到底是X的,還是Y的?

}

        " ."運算符的本意是引用對象成員的,然而被重載後就不能保證本意,進而帶來運算符意義的混淆,如果每個人都這麼重載,那更不容易學習C++語言了。

        (3). “  ::  ”運算符,M::a,該運算符隻是在編譯的時候域解析,而沒有運算的參與進來,由前面【注】重規則可知,如果重載之後,::運算符有了新的語義,那是不是會引起混淆呢?         (4).  “  sizeof  ”運算符,該運算符不能被重載的主要原因是内部許多指針都依賴它,舉例說明重載的後果:

1 2 3 4 5 6

A b[10];

//A是類

A* p = &a[3];

A* q = &a[3];

p++;

//執行後,p指向a[4],記住是指向a[4]!根據C++規定,該操作等同于p+sizeof(A),此時

//p應該比q大A類所占位元組的大小,事實上,p并不一定會比q大這麼多,因為你把sizeof()運算

//符重載了啊!這時的sizeof(A)并不一定是該類占用的位元組大小!

(5)  ".*"引用成員指針運算符,具體原因後面查明白了補充~ https://www.nowcoder.com/test/question/done?tid=10034430&qid=25530#summary

繼續閱讀