C++学习(四)
一、拷貝構造函數和拷貝賦值運算符
1.拷貝構造:用一個已有的對象,構造和它同類型的副本對象——克隆。
2.形如
class X {
? X (const X& that) { ... }
};
的構造函數成為拷貝構造函數。如果一個類沒有定義拷貝構造函數,系統會提供一個缺省拷貝構造函數。缺省拷貝構造函數對于基本類型的成員變量,按字節復制,對于類類型的成員變量,調用相應類型的拷貝構造函數。
3.在某些情況就下,缺省拷貝構造函數只能實現淺拷貝,如果需要獲得深拷貝的復制效果,就需要自己定義拷貝構造函數。
4.形如
class X {
? X& operator= (const X& that) {
??? ...
? }
};
的成員函數稱為拷貝賦值運算符函數。如果一個類沒有定義拷貝賦值運算符函數,系統會提供一個缺省拷貝賦值運算符函數。缺省拷貝賦值運算符函數對于基本類型的成員變量,按字節復制,對于類類型的成員變量,調用相應類型的拷貝賦值運算符函數。
5.在某些情況就下,缺省拷貝賦值運算符函數只能實現淺拷貝,如果需要獲得深拷貝的復制效果,就需要自己定義拷貝賦值運算符函數。
練習:實現一個簡化版的字符串類String支持:
1.用字符指針形式的字符串構造
2.拷貝構造和拷貝賦值
3.獲取字符指針形式字符串的成員函數,類似string::c_str
說明:不得使用std::string!
二、靜態成員
1.靜態成員變量和靜態成員函數是屬于類的而非屬于對象。
2.靜態成員變量,為多個對象所共享,只有一份實例,可以通過對象訪問也可以通過類訪問,必須在類的外部定義并初始化。靜態成員變量本質上與全局變量并沒有區別,只是多了類作用域的約束,和訪控屬性的限制。
class Account {
private:
? string m_name;
? double m_balance;
? static double m_rate;
};
3.靜態成員函數,沒有this指針,無法訪問非靜態成員。
4.單例模式
三、成員指針
Student s;
string* p = &s.m_name; // 不是
Student s2;
(一)成員變量指針
1.定義
成員變量類型 類名::*指針變量名;
string Student::*pname;
int Student::*page;
2.初始化/賦值
指針變量名 = &類名::成員變量名
pname = &Student::m_name;
page = &Student::m_age;
3.解引用
對象.*指針變量名
對象指針->*指針變量名
Student s, *p = &s;
s.*pname = "張飛";
cout << p->*page << endl;
(二)成員函數指針
1.定義
成員函數返回類型 (類名::*指針變量名) (參數表)
void (Student::*plearn) (const string&) const;
2.初始化/賦值
指針變量名 = &類名::成員函數名;
plearn = &Stduent::learn;
3.解引用
(對象.*指針變量名) (實參表);
(對象指針->*指針變量名) (實參表);
(s.*plearn) ("C++");
(p->*plearn) ("UNIX");
第三課? 操作符重載
復數:3+4i
Complex
c1 - (c2 + c3)
c1.sub (c2.add (c3))
一、操作符標記和操作符函數
1.雙目操作符:L#R
成員函數形式:L.operator# (R)
左調右參
全局函數形式:::operator# (L, R)
左一右二
2.單目操作符:#O/O#
成員函數形式:O.operator# ()
全局函數形式:::operator# (O)
3.三目操作符:不考慮
二、雙目操作符
1.+/-/*//
操作數在計算前后不變。
表達式的值是右值。
轉載于:https://www.cnblogs.com/fanghui/p/3323194.html
總結
- 上一篇: FreeSql (三十)读写分离
- 下一篇: s3c2440移植MQTT