再次學習C++基礎感想(2)

1.運算符重載的本質是函數的重載。運算符重載在C++裏面很多見。例如我們經常使用的cout<<a<<endl;這個"<<"就是重載的運算符,它本身在C++中的含義是邏輯左移運算符。
2.函數類型 operator運算符名稱(形參列表){對運算符的重載處理}
3.非常量左值引用只能綁定到非常量左值,不能綁定到常量左值、非常量右值和常量右值。常量左值引用可以綁定到所有類型的值,包括非常量左值、常量左值、非常量右值和常量右值。
4.const修飾引用。

//const修飾引用,引用本身不可變,但引用的變量(或對象)可以改變.例如:
const int & ri = a;  //or
int const & ri = a;  //ok, ri 本身是常量,引用不區分類型
const int & ri = i; //ok,引用不區分類型
   ri++;//error, ri爲常量,不可變
i++; //ok,右邊的變量與引用無關
   ri=b;//error, ri爲常量
i=j; //ok,=右邊的變量與引用無關

5.const修飾指針
辨析兩個很煩的概念。指針常量和常量指針。
一個竅門,把 *讀作指針,把 const 讀作常量。
也就是說const在前就是常量指針,*在前就是指針常量
(1).const修飾指針本身——指針常量
就是說這是一個常量,指針類型的常量,當然它的值就是不能變的。也就是指向的東西不能變。

//這種情形下,指針本身爲常量,不可改變,任何修改指針本身的行爲都是非法的.例如:
const int a = 1;
const int b = 2;
int i = 3;
int j = 4;
int* const pi = &i; //ok, pi的類型爲int* const ,&i的類型爲int* const
    int* const pi = &a; //error, pi的類型爲int* const,&a的類型爲const int* const
    pi = &j; //error, 指針是常量,不可變
*pi = a; //ok, *pi並沒有限定是常量 ,可變
//由此看出,pi是常量,常量在初始化和賦值時,類型必須嚴格一致。也就是const修飾指針本身時,等號兩邊的變量類型必須嚴格一致,否則不能匹配。

(2).const修飾指針指向的變量(或對象)——常量指針
它是一個指針,指向常量的指針。既然指向的是常量,那麼指針指向的東西的值就不能改變。

//此種情形下,通過間接引用指針不可改變變量的值,假設指針爲p,則*p不可變,下面以例子說明:
const int *pi = &a; //or int const *pi = &a;
//ok, const並不修飾指針本身,pi對賦值類型沒要求 ,但pi是int*型指針,所以所賦的必須是個地址值。
const int *pi = &i; //ok
const int *pi1 = &a;
const int *pi = pi1; //ok
       *pi = j; //error,*pi 不可變,不能更改指針的間接引用形式
pi = &j; //ok,pi可變
pi = &b;//ok,pi可變
pi++; //ok
--pi; //ok
//由此可見,pi是變量,可以賦值常量和變量的值,正如一個整型變量可賦整型數和整型變量一樣
//const修飾的不是指針本身,而是其間接引用,=號兩邊的類型不必嚴格匹配,
//如:const int* pi = &a; 中,pi的類型爲int*,而&a的類型爲const int* const,只要其中含有int*就可以。//又如:const int *pi = &j; 中,pi的類型爲int*,而&j的類型爲int* const,它向pi賦值並無大礙。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章