C 學習筆記之 14 過載運算與型別轉換

2021-08-19 17:27:50 字數 3460 閱讀 1623

在c++ 學習筆記之(4)-表示式、運算子與型別轉換中記錄了c++語言中定義的大量運算子和內建型別的自動轉換規則,並且當運算子作用於類型別時,可以通過運算子過載重新定義該運算子的含義。同時,也能自定義類型別之間的轉換規則,即和內建型別的轉換一樣,類型別轉換隱式的將一種型別的無錫愛那個轉換成另一種型別物件

io標準庫分別使用>><<執行輸入和輸出操作。io庫定義了用其讀寫內建型別的版本,而類型別的版本需要自定義。

ostream *operator<

istream &operator>>(istream &is, sales_data &item)

通常,算數和關係運算子被定義成非成員函式以允許對左側和右側的運算物件進行轉換,且這些運算子一般不需要改變運算物件,故形參都為常量引用

class a

// 顯示呼叫

a pa;

pa.operator++(0); // 呼叫後置版本的 operator++

pa.operator++(); // 呼叫前置版本的 operator++

struct absint

}int i = -42;

absint absobj; // 含有函式呼叫運算子的物件

int ui = absobj(i); // 將 i 傳遞給 absobj.operator()

// 獲得第乙個指向滿足條件元素的迭代器,該元素滿足 size() is >= sz

auto wc = find_if(words.begin(), words.end(), [sz](const

string &a) );

// 該 lambda 表示式產生的類形如

class sizecomp // 該形參對應捕獲的變數

// 該呼叫運算子的返回型別、形參和函式體都與 lambda 一致

bool

operator()(const

string &s) const

private:

size_t sz; // 該資料成員對應通過值捕獲的變數

}auto wc = find_if(words.begin(), words.end(), sizecomp(sz)); // 等價於上述使用 lambda語句

標準庫定義了一組表示算術運算子、關係運算子和邏輯運算子的類,每個類分別定義了乙個執行命名操作的呼叫運算子

plus intadd;  // 可執行 int 加法的函式對

int sum = intadd(10, 20); // 等價於 sum = 10 + 20

// 比較指標的記憶體位址來 sort 指標的 vector

vector

nametable; // 指標的 vector

// 錯誤:nametable 中的指標彼此之間沒有關係,所以 < 將產生未定義的行為

sort(nametable.begin(), nametable.end(), (string *a, string *b) );

sort(nametable.begin(), nametable.end(), less()); // 正確:標準庫規定指標的 less 定義良好

c++語言中有集中可呼叫的物件:函式、函式指標、lambda表示式、bind建立的物件以及過載了函式呼叫運算子的類。

// 呼叫形式  int(int, int), 考慮不同型別的呼叫物件

int add(int i, int j) // 普通函式

auto mod = (int i, int j) ; // lambda, 其產生乙個未命名的函式物件類

struct divide

};// 可通過 function 模板表示某種呼叫形式的可呼叫物件

function

f1 = add; // 函式指標

function

f2 = mod; // lambda

function

f3 = divide(); // 函式物件類的物件

cout << f1(4, 2) << endl << f2(4, 2) << endl << f3(4, 2) << endl; // 6, 0, 2

在c++ 學習筆記之(7)-類中可看到由實參呼叫的非顯示建構函式能夠通過隱式型別轉換將實參型別的物件轉換成類型別。對於類型別的轉換,可以通過定義轉換建構函式和型別轉換運算子共同定義

類的一種特殊成員函式,可將乙個類型別轉換為其他型別

class smallint

// 型別轉換運算子將 smallint 物件轉換為 int

operator

int() const

private:

std::size_t val;

}smallint si;

// 算數型別轉換為類型別

si = 4; // 首先將 4 隱式轉換成 smallint, 然後呼叫 smallint::operator=

// 類型別轉換為算數型別

si + 3; // 首先將 si 隱式轉換成 int, 然後執行整數的加法

// 類型別轉換和標準內建型別轉換共同使用

smallint si2 = 3.14; // 內建型別轉換將 double 實參轉換成 int, 然後呼叫smallint(int)建構函式

若類中包含乙個或多個型別轉換,則必須確保在類型別和目標型別之間只存在唯一一種轉換方式,否則,可能會有二義性

乙個過載的運算子必須是類的成員或者至少擁有乙個類型別的運算物件。過載運算子的運算物件數量、結合律、優先順序與對應的用於內建型別的運算子完全一致

若類過載了函式呼叫運算子operator(),則該類的物件被稱作函式物件, 且lambda表示式是一種簡便的定義函式物件類的方式

在類中可以定義轉換源或轉換目標是該型別本身的型別轉換,這樣的轉換是自動執行。只接受單獨乙個實參的非顯示建構函式定義了從實參型別到類型別的型別轉換;而非顯示的型別轉換運算子則定義了從類型別到其他型別的轉換

C 之過載運算與型別轉換

賦值運算子 算術和關係運算子 下標運算子 遞增和遞減運算子 過載 型別轉換與運算子 過載的運算子是具有特殊名字的函式 它們的名字由關鍵字operator和其後要定義的運算符號共同組成。和其他函式一樣,過載的運算子也包含返回型別 引數列表以及函式體。對於乙個運算子函式來說,它或者是類的成員,或者至少含...

14 過載運算子和型別轉換

過載運算和型別轉換 輸入輸出運算子過載 當流讀取資料時發生錯誤,輸入運算子應該負責從錯誤裡面恢復 算數運算子和關係運算子 下標運算子 可以通過位置訪問元素的一種方法,通常需要定義下表運算子operator,下標運算子必須是成員函式.下標運算子應該包含兩個版本,乙個返回普通引用,另乙個是類的常量成員,...

c 過載運算與型別轉換

1.基礎概念 過載的運算子是具有特殊名字的函式 過載運算子函式,運算子函式。過載運算子 依次包含返回型別,函式名 operator 引數列表,函式體。只有過載的函式呼叫運算子operator 才能有預設實參。關於引數的數量,一般來說,一元運算子有乙個引數,二元有兩個,三元有三個 但是如果該運算子函式...