運算子過載

2021-08-08 12:45:01 字數 2784 閱讀 4833

運算子過載:operator關鍵字用來過載運算子

1、概念

1)本質是乙個函式,函式名的組成方式是:operator + 要過載的運算子

運算子的過載函式可以寫到類的內部,但內外只能有乙個(盡量寫內部,內外的實現方式由於傳參方式不同實現**不同在一些複雜的運算時會有不同)

2)有部分運算子不能過載   .   ::    .*    ?:   sizeof

3)過載步驟:首先寫出函式名,再根據運算需要寫出函式的引數列表以及函式的返回值型別

2、友元函式實現操作符過載

1)當我們無法修改左運算元的類時,需要使用全域性函式進行過載;

2)部分操作符只能通過成員函式進行過載     =     ()   ->

3)<< 操作符由於拿不到 cout 這個類的原始碼,使用類成員函式無法實現過載,只能使用友元函式

4)友元函式過載運算子常用於運算子的左右運算元型別不同的情況,像+運算子,就不能實現整數+類的寫法,整數.operator+(z)是不存在的。

3、部分運算子的過載實現

1)賦值運算子   =  用於物件資料的複製

如果沒有定義賦值運算子的過載,編譯器會有自己預設的賦值運算子,但預設的賦值運算子做的淺拷貝,所以和拷貝構造類似,賦值運算子的過載也需要自己寫。賦值的實現過程基本可以分為這幾步:釋放舊空間,開闢新空間,複製。當然,在這之前需要加上乙個是不是自己對自己賦值的判斷

2)括號運算子   ()

t(10)  ===> t.opertaor()(int num)

這樣的過載方式可以實現偽函式

3)下標運算子    用來訪問資料物件的元素

x[y]  ===> t.operator(y)

4)與操作和或操作  &&  ||

&& 和|| 的內部實現了短路規則,但操作符過載是靠函式過載來實現的,運算元作為函式引數傳遞,而c++中函式的引數會被求值,無法實現短路規則。

4、陣列與字串的封裝:利用上述的規則可以實現陣列與字串的封裝,需要注意的點有:

1)傳參時要注意引數型別,像字串的型別為 const char *。

2)用new開闢空間時,要注意長度為(strlen(str)+1),要算上'\0'。

下面貼上部分實現**:

標頭檔案:mystring.h

#ifndef __mystring_h__

#define __mystring_h__

#include class mystring

char *c_str2()

private:

char *m_p;

};#endif // __mystring_h__

函式實現:mystring.cpp

#include "mystring.h"

#include std::ostream &operator<<(std::ostream &out, const mystring &obj)

std::istream &operator>>(std::istream &in, mystring &obj)

// ""

mystring::mystring()

mystring::mystring(const char *str)

else }

mystring::mystring(int len, char ch)

mystring::mystring(const mystring &str)

else }

mystring::~mystring()

}mystring & mystring::operator=(const char *str)

m_p = new char[strlen(str)+1];

char *tmp = m_p;

strcpy (m_p,tmp);

delete tmp;

return *this;

}mystring &mystring::operator=(const mystring &obj)

char & mystring::operator(int index)

mystring & mystring::operator+(const char *str)

mystring &mystring::operator+(const mystring &obj)

mystring & mystring::operator+=(const char *str)

mystring &mystring::operator+=(const mystring &obj)

bool mystring::operator==(const char *str) const

return true;

}bool mystring::operator==(const mystring &obj) const

return true;

}bool mystring::operator>(const char *str) const

return false;

}bool mystring::operator>(const mystring &obj) const

return false;

}bool mystring::operator<(const char *str) const

return false;

}bool mystring::operator<(const mystring &obj) const

return false;

}

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...

運算子過載 賦值運算子的過載

有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...

運算子過載

c 中的運算子 1。大多數系統預定義運算子都能過載 不值得過載 不能被過載 2過載不能改變優先順序 不能改變結合性 不能改變運算子所需運算元的個數 過載後,可按這些運算子的表達方式使用 運算子過載的語法 一 通過運算子過載函式進行過載 1。運算子過載函式是成員函式 語法形式 type x opera...