chapter12 使類物件像乙個數值一樣工作

2021-09-29 15:35:15 字數 1355 閱讀 2955

一般來說,類的「三位一體」原則:建構函式、複製建構函式、析構函式、賦值運算子函式。

如果乙個類不需要顯式定義析構函式(析構函式什麼都不需要幹),那麼它往往也不需要顯式定義賦值建構函式和賦值運算子函式。

輸入輸出運算子過載

目標希望實現自定義類和基本型別一樣,可以被 cin >> 和 cout <<

對於二元運算子,左運算元必然為函式的第乙個引數,右運算元必然為函式的第二個引數,而 cin 和 cout 的第乙個引數為 istream 和 ostream,所以肯定不能是自定義類的成員函式,要把它們實現在外部

class str;

std::istream& operator>>(std::istream& is, str& str);

std::ostream& operator<<(std::ostream& os, const str& str);

class str

輸出運算子過載

std::ostream &operator<<(std::ostream &os, const str &str) 

return os;

}

輸入運算子過載

std::istream &operator>>(std::istream &is, str &str)  while (is.get(c) && !std::isspace(c));

}return is;

}

但是,輸入運算子過載函式要讀寫 str 類的private成員data,所以要使用友元函式

友元函式

友元函式不屬於類的成員函式,放在外部,但是它擁有和成員函式一樣的訪問權利

友元函式隨便放,一般放在類宣告和public之間

class str

每次寫運算子過載函式之前,都要想這樣幾個問題

這個運算子過載函式是否應該是乙個類的成員函式

它有幾個運算元?它的運算元是什麼型別

應該返回什麼型別的結果?

std::string 到字元常量陣列的轉換

s.c_str()

生成乙個指向乙個』\0』結尾的字元陣列的const char*的值。

s.data()

和 s.c_str() 的唯一區別是,生成的陣列不以 『\0』 結尾

s.copy(p, n)

從 s 中拷貝 n 個字元到 p 所指向的記憶體塊中,使用者來保證p指標的記憶體足夠容納 n 個字元

關於移除乙個數值演算法問題

給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度。不要使用額外的陣列空間,你必須僅使用 o 1 額外空間並 原地 修改輸入陣列。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。示例 1 給定 nums 3,2,2,3 va...

乙個類如何只建立乙個物件?

思路 由於只有全域性與靜態可以被類中所有成員使用,而類中存在靜態的成員變數 成員函式,由此考慮用靜態來解決。具體方法 建構函式只呼叫一次 將成員函式 構造 析構 定義為私有,定義靜態成員變數char s 所有變數所共有 再編寫 靜態 2個函式 建立與釋放函式 函式1功能 當s null new開闢空...

1 2 每個物件都有乙個介面

1 提出了用class 關鍵字來表示 型別 2 class由來 2.1 關鍵字class到由來 在程式執行期間具有不同的狀態而其他方面都相似的物件會被分組到物件的類中 2.2 建立抽象資料型別是物件導向設計的基本概念之一 2.3 建立某一型別的變數 在物件導向中稱該變數為 物件或者例項 2.4 每個...