重載函數
C++ 允許在同一作用域中的某個函數和運算符指定多個定義,分爲函數重載和運算符重載。
函數重載
void print(int i) {
cout << "整數爲: " << i << endl;
}
void print(double f) {
cout << "浮點數爲: " << f << endl;
}
操作符重載
C++允許重定義或重載大部分 C++ 內置的運算符
函數名是由關鍵字 operator 和其後要重載的運算符符號構成的
重載運算符可被定義爲普通的非成員函數或者被定義爲類成員函數
成員函數
class Test1 {
public:
Test1(){}
//定義成員函數進行重載
//返回對象 調用拷貝構造函數 釋放函數內 t 對象
//引用類型(Test1&) 沒有複製對象 返回的是 t 對象本身 t會被釋放 所以會出現問題(數據釋放不徹底就不一定)
// 可以輸出 t 與 t3 地址查看
Test1 operator+(const Test1& t1) {
Test1 t;
t.i = this->i + t1.i;
return t;
}
//拷貝構造函數 (有默認的)
Test1(const Test1& t){
//淺拷貝
this->i = t.i;
cout << "拷貝" << endl;
//如果動態申請內存 需要深拷貝
};
int i;
};
Test1 t1;
Test1 t2;
t1.i = 100;
t2.i = 200;
//發生兩次拷貝
// C++真正的臨時對象是不可見的匿名對象
//1、拷貝構造一個無名的臨時對象,並返回這個臨時對象
//2、由臨時對象拷貝構造對象 t3
//語句結束析構臨時對象
Test1 t3 = t1 + t2;
cout << t3.i << endl;
Xcode上玩,使用的g++編譯器會進行 返回值優化(RVO、NRVO) 從而看不到拷貝構造函數的調用。
可以加入 “-fno-elide-constructors” 取消GNU g++優化
對windows vs編譯器cl.exe無效,VS Debug執行RVO,Release執行NRVO
RVO(Return Value Optimization):消除函數返回時創建的臨時對象
NRVO(Named Return Value Optimization):屬於 RVO 的一種技術, 直接將要初始化的對象替代掉返回的局部對象進行操作。
非成員函數
class Test2 {
public:
int i;
};
//定義非成員函數進行 + 重載
Test2 operator+(const Test2& t21, const Test2& t22) {
Test2 t;
t.i = t21.i + t22.i;
return t;
}
Test2 t21;
Test2 t22;
t21.i = 100;
t22.i = 200;
Test2 t23 = t21 + t22;
cout << t23.i << endl;
允許重載的運算符
void *operator new (size_t size)
{
cout << "新的new:" << size << endl;
return malloc(size);
}
void operator delete(void *p)
{
//釋放由p指向的存儲空間
cout << "新的delete" << endl;
free(p);
}
... ...