NDK13_C++基礎: 重載函數、操作符重載

NDK開發彙總

重載函數

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;

允許重載的運算符

類型 運算符
關係運算符 ==(等於),!= (不等於),< (小於),> (大於>,<=(小於等於),>=(大於等於)
邏輯運算符 ||(邏輯或),&&(邏輯與),!(邏輯非)
單目運算符 + (正),-(負),*(指針),&(取地址)
自增自減運算符 ++(自增),–(自減)
位運算符 | (按位或),& (按位與),~(按位取反),^(按位異或),,<< (左移),>>(右移)
賦值運算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空間申請與釋放 new, delete, new[ ] , delete[]
其他運算符 ()(函數調用),->(成員訪問),,(逗號),
void *operator new (size_t size)
{
	cout << "新的new:" << size << endl;
	return malloc(size);
}

void operator delete(void *p)
{
	//釋放由p指向的存儲空間
	cout << "新的delete" << endl;
	free(p);
}
... ...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章