一.用c來實現類的操作
1、類的普通成員變數內部隱藏了乙個指向當前物件的指標
2、靜態成員變數必須在外部對其進行賦初值
int test::m_sa = 10;
3、sizeof 運算子, 計算棧裡面變數型別所佔空間大小
strlen 函式 ,計算字串長度
4、靜態成員變數存在資料段,在程式編譯的時候呼叫
用c語言來實現類的操作需要注意的幾點總結:
1、普通成員變數 ===> 結構體的成員
2、靜態的成員變數 ===> 全域性變數
3、類的普通成員函式 ===> 會為其新增乙個指向當前物件的指標
4、類的靜態成員函式 ===> 沒有為其新增指標,原來的樣子
===> 沒有指向當前物件的指標,所以不能使用物件內部的成員
===> 可以使用靜態成員變數,因為靜態變數實現為全域性變數,可見 所以可用
注意:
const:
1.修飾變數:c++中修飾的是常量
2.修飾指標
3.修飾函式的形參
4.修飾函式的返回值
5.修飾函式本身
void show() const//show (const test *const this)
實際上也是修飾的函式形參(this 指標),使得在函式內部不能修改普通成員變數,但是這時是可以改變靜態變數的 ,因為靜態變數實現的時候與this這個指標沒有關係
二、友元
可以訪問類的私有成員
(1).友元函式
如果有乙個函式是類 a 的友元函式,則該函式可以使用(通過物件) a 中的所有成員
友元宣告方式:在類中寫上 函式宣告,在函式宣告前 加friend
使用時注意事項:
1、友元的宣告不受訪問控制符限制, 可以放在類的任意位置
2、友元函式是 「友」 不是類的成員函式,是外部的函式, 沒有 this 指標
3、友元破壞了類的封裝性 ----> 慎用(盡量不要用)
(2)友元類
如果類a是類b的友元類,則類a中所有函式都是類b的友元函式。a可以通過物件來使用b中的所有成員。
三.封裝乙個簡單的陣列
四、封裝乙個複數:a + bi(+ 與 - 運算子過載)
對於一些自定義型別,編譯不知道運算規則
1、判斷運算方式: ===> 做加法運算
函式:
1、函式名 :operator+ 運算子
例如:
做加法運算: operator+
做減法運算: operator-
2、函式引數 :參與運算的運算元
從左到右寫 : operator+(c1, c2)
3、函式的返回值:
根據需要確定 ===> complex operator+(complex &c1, complex &c2)
函式找到 —> 直接呼叫
找不到(出錯) ----> 自己寫
運算子過載:
1、外部實現
2、內部實現:外部到內部 ----> 去掉左運算元,由this指標代替
注意:
1、不能改變運算子的優先順序
2、不能改變運算子的運算元個數
3、不能自創運算子
4、同一種運算,內部和外部實現只能存在乙個
五、++ 與 – 運算子過載
(1)、不能過載的運算子:
1、作用域解析運算子 ( ::)
2、條件運算子 ( ?:)
3、直接成員訪問運算子 ( . )
4、類成員指標引用的運算子 ( .* )
5、sizeof運算子 ( sizeof )
(2)前置 ++ 與後置 ++運算子過載
前置 ++ 運算子的過載與+ 運算子的過載格式類似
例如:
c3 = ++c1 + c2; // operator+( ++c1, c2); ==> operator+( operator ++(c1), c2)
後置++運算子的過載多了乙個 int 的佔位引數,和前置++進行區分
例如:
c3 = c1++ + c2; // operator+( c1++, c2); ==> operator+( operator ++(c1, 0), c2)
前置++ 的效率比後置++高。
六、<< 與 >> 運算子的過載
int i = 10;
cout << i << endl;
此時可以列印出來結果是因為:cout對左移運算子進行了過載(基本資料型別)
t 為類時:
cout << t << endl;
需要對<< 左移運算子進行過載,才能夠使用。
注意:左移(<<) 右移( >>) 運算子必須過載為外部函式,因為:ostream 和istream 這兩個類我們是無法改變的。
例如:
<< 左移運算子過載
ostream &operator <<(ostream &out, complex &c)
(>>)右移運算子過載
istream &operator >>(istream &in, complex& c)
運算子盡量放到類的內部過載,左運算元無法改變的情況下只能用全域性函式的方式過載
c++ 中不能用全域性函式(友元函式)進行過載的運算子:= , (),[ ] ,->
七、賦值運算子過載
如果類中沒有寫賦值運算子過載函式,則編譯器會自動新增乙個,做的是淺拷貝。
淺拷貝:當類中沒有拷貝構造的時候,系統會自動新增乙個拷貝建構函式,進行「值」 的複製
(1)實現陣列下標給陣列元素賦值
a1[i] = i; // operator [ ](a1, i) = i;
int &array::operator (int index)
(2)實現陣列給陣列賦值
1、建立乙個臨時物件 == 拷貝建構函式
2、當前物件和 tmp 交換指標空間
3、複製其他變數
例如:
a2 = a1; // 賦值 operator =(a2, a1);
array &operator =(const array &obj)
return *this;
}
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...