程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++ 重載運算與類型轉換

c++ 重載運算與類型轉換

編輯:C++入門知識

c++ 重載運算與類型轉換


 

1 基本概念

1.1 基本點

 

隱式的this指針運算符函數至少有一個類類型參數重載運算符的優先級應與內置運算符一致::, .*, ., ? : 不可重載

 

 

1.2 重載的運算符函數的調用方式

1) 非成員函數的調用 operator+為對象data1, data2的非成員函數

 

data1 + data2; ==> operator+(data1 , data2);

 

2) 成員函數的調用 operator+為對象data1的成員函數

 

data1 + data2 ==> data1.operator+(data2);

 

1.3 不應該重載的運算符

重載的運算符本質上就是函數調用.

 

1) 運算符的求值順序無法保留 如: && , || , & , | 等

 

2) 無法保留運算符的短路求值屬性

 

1.4 使用與內置類型一致的含義

 

1.5 成員與非成員選擇

 

=, [], (), -> 必須為成員復合賦值一般為成員改變對象狀態或與給定對象密切相關的,通常為成員. 如, ++, -- , * 解引用具有對稱性的運算符, 如算術, 相等性, 關系和位, 通常為非成員.
1) 含對象的混合類型表達式,則運算符必須定義成非成員. 2) 當定義為成員函數時, 左側運算對象必須是運算符所屬類的一個對象.

2 輸入與輸出

 

輸入輸出運算符必須是非成員函數,一般為友元.

 

2.1 <<

 

ostream & operator<<(ostream &os, const Object &item ){
	os<< item.data1<<  << item.data2;
	return os;
}

 

 

 

第一個參數為非常量ostream引用第二個參數常量引用返回ostream型參進來減少格式化操作,如換行.

 

2.2 >>

 

istream &  operator>>(isteam &is, Object &item){
	double p;
	is >> item.data1>>item.data2>>p;
	if(is){
		item.data2 = item.data2 * p;
	}else{
		item = Object();//輸入失敗:對象被賦予默認狀態
	}
	return is;
}
第一個參數非常量istream第二個參數非常量對象引用錯誤檢測返回給定流對象引用

 

3 算術與關系

 

常量引用返回一個新對象一般定義對應的復合運算,用它來實現該運算.==和!=一般成對出現

 

4 賦值

拷貝賦值, 移動賦值,列表賦值,復合賦值

 

賦值運算符必須為類成員,復合賦值通常也為成員.這兩類都返回左側對象的引用.

 

5 下標

 

必須為成員提供非常量版和常量版

 

6 遞增與遞減

 

前置和後置成對出現返回對象引用後置版本先記錄對象的狀態,再操作,返回記錄的對象

 

7 成員訪問

 

常量this* 和 ->成對出現*返回& , ->返回指針*先檢測是否在作用范圍箭頭運算符必須返回指針或定義了箭頭運算符的某個對象
class StrPtr {
public:
	std::string& operator*() const {
		auto p = check(curr, dereference past end);
		return (*p)[curr];
	
	}


	std::string* operator->() const{
		return &this->operator*();
	}
//其他內容
}



 

8 函數調用

 

定義了調用運算符的對象,稱為函數對象可以含有狀態數據

8.1 lambda是函數對象


8.2 標准庫函數對象


8.3 可調用對象和function

 

 

c++中的可調用對象: 函數, 函數指針, lambda表達式, bind創建的對象,重載了函數調用運算符的類.可調用對象也有自己的類型,不同類型可能具有相同的調用形式標准庫function類型--->相同調用形式類型重載函數的名字不能直接存入function類型的對象.解決方法1, 通過函數指針; 2, lambda

 

 

9 類型轉換運算符

 

必須為成員函數無返回值,無參數通常是const this轉換後的類型與函數返回類型要求相同,即不能是數組或函數類型,但可以是它們的指針是隱式轉換,一般不提供 加explicit變成顯示轉換,注意在以下條件顯示轉換將自動變成隱式轉換 if, while, do的條件部分for的條件部分邏輯非, 或, 與(!, || , &&)條件運算符的條件表達式 例子:IO類istream, ostream

9.1 避免有二義性的類型轉換

實參匹配和相同的類型轉換轉換目標為內置類型的多重類型轉換重載函數與轉換構造函數重載函數與用戶定義的類型轉換

 

9.2 函數匹配與重載運算符

如果我們對同一個類即提供轉換目標是算術類型的類型轉換,也提供了重載的運算符,則將會遇到重載運算符與內置運算符的二義性問題.

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved