最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++運(yùn)算符重載的詳細(xì)講解

 更新時(shí)間:2021年04月07日 10:00:50   作者:Thrush''''s note  
這篇文章主要給大家介紹了關(guān)于C++運(yùn)算符重載的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

加號(hào)運(yùn)算符重載

對(duì)于內(nèi)置數(shù)據(jù)類型,編譯器知道如何運(yùn)算

但是對(duì)于自己封裝的類,編譯器無(wú)法進(jìn)行運(yùn)算

這時(shí)可以通過(guò)自己定義運(yùn)算符重載進(jìn)行運(yùn)算

operator+

通過(guò)成員函數(shù)重載+號(hào)

#include<iostream>
using namespace std;
class Person
{
public:
 int m_a;
 int m_b;
 //通過(guò)成員函數(shù)實(shí)現(xiàn)重載
 Person operator+ (Person &p)
 {
 //創(chuàng)建一個(gè)臨時(shí)變量
 Person temp;
 temp.m_a = this->m_a + p.m_a;
 temp.m_b = this->m_b + p.m_b;
 return temp;
 }
};
void test01()
{
 Person p1;
 p1.m_a = 66;
 p1.m_b = 44;
 Person p2;
 p2.m_a = 6;
 p2.m_b = 4;
 Person p3;
 //通過(guò)函數(shù)原型調(diào)用
 p3 = p1.operator+(p2);
 //簡(jiǎn)便調(diào)用
 //p3 = p1 + p2;
 cout << "p3.m_a:" << p3.m_a << endl;
 cout << "p3.m_b:" << p3.m_b << endl;
}

int main()
{
 test01();
 system("pause");
 return 0;
}

注意兩種調(diào)用方式

通過(guò)函數(shù)原型調(diào)用

p3 = p1.operator+(p2);

簡(jiǎn)便調(diào)用

p3 = p1 + p2;

通過(guò)全局函數(shù)重載+號(hào)

#include<iostream>
using namespace std;
class Person
{
public:
 int m_a;
 int m_b;
};
//通過(guò)全局函數(shù)實(shí)現(xiàn)重載
Person operator+ (Person& p1, Person& p2)
{
 //創(chuàng)建一個(gè)臨時(shí)變量
 Person temp;
 temp.m_a = p1.m_a + p2.m_a;
 temp.m_b = p1.m_b + p2.m_b;
 return temp;
}
void test01()
{
 Person p1;
 p1.m_a = 66;
 p1.m_b = 44;
 Person p2;
 p2.m_a = 6;
 p2.m_b = 4;
 Person p3;
 //函數(shù)原型調(diào)用
 p3 = operator+(p1,p2);
 //簡(jiǎn)便調(diào)用
 //p3 = p1 + p2;
 cout << "p3.m_a:" << p3.m_a << endl;
 cout << "p3.m_b:" << p3.m_b << endl;
}
int main()
{
 test01();
 system("pause");
 return 0;
}

注意兩種調(diào)用方式

通過(guò)函數(shù)原型調(diào)用

p3 = operator+(p1,p2);

簡(jiǎn)便調(diào)用

p3 = p1 + p2;

運(yùn)算符重載發(fā)生函數(shù)重載

運(yùn)算符重載可以發(fā)生函數(shù)重載:Person+int等等

#include<iostream>
using namespace std;
class Person
{
public:
 int m_a;
 int m_b;
};
//通過(guò)全局函數(shù)實(shí)現(xiàn)重載
Person operator+ (Person& p1, int num)
{
 //創(chuàng)建一個(gè)臨時(shí)變量
 Person temp;
 temp.m_a = p1.m_a + num;
 temp.m_b = p1.m_b + num;
 return temp;
}
void test01()
{
 Person p1;
 p1.m_a = 66;
 p1.m_b = 44;
 Person p2;
 p2.m_a = 6;
 p2.m_b = 4;
 Person p3;
 //函數(shù)原型調(diào)用
 //p3 = operator+(p1,55);
 //簡(jiǎn)便調(diào)用
 p3 = p1 + 55;
 cout << "p3.m_a:" << p3.m_a << endl;
 cout << "p3.m_b:" << p3.m_b << endl;
}
int main()
{
 test01();
 system("pause");
 return 0;
}

調(diào)用方法和定義方法與上面相同,不再多余贅述

總結(jié)

1、系統(tǒng)內(nèi)置數(shù)據(jù)類型的表達(dá)式不可改變

2、不要濫用運(yùn)算符重載

左移運(yùn)算符

不利用成員函數(shù)重載左移運(yùn)算符

沒(méi)有具體演示,因?yàn)閳?bào)錯(cuò),我也沒(méi)寫出來(lái)

下面通過(guò)全局函數(shù)實(shí)現(xiàn)

#include<iostream>
using namespace std;
class Person
{
public:
 int m_a;
 int m_b;
 
};
ostream& operator<<(ostream& cout,Person&p)
{
 cout << "p.m_a=" <<p. m_a << " p.m_b=" <<p. m_b << endl;
 return cout;
}
void test01()
{
 Person p1;
 p1.m_a = 44;
 p1.m_b = 66;
 cout << p1 << endl;
}
int main()
{
 test01();
 system("pause");
 return 0;
}

因?yàn)橐獙?shí)現(xiàn)鏈?zhǔn)?,?shí)現(xiàn)追加,所以返回值必須是ostream

總結(jié)

配合友元實(shí)現(xiàn)自定義輸出類型

遞增運(yùn)算符重載

遞增運(yùn)算符重載

#include<iostream>
using namespace std;
class myInt
{
 friend ostream& operator<<(ostream& cout, myInt num);
public:
 myInt()
 {
 this->m_a = 0;
 }
 //前置++運(yùn)算符重載
 myInt& operator++()//返回引用是為了一直對(duì)一個(gè)數(shù)據(jù)進(jìn)行遞增,否則函數(shù)默認(rèn)返回一個(gè)新的數(shù)
 {
 //先進(jìn)行++
 m_a++;
 //然后返回自身
 return *this;
 }
 //后置++運(yùn)算符重載
 myInt operator++(int)//int表示占位參數(shù),用于區(qū)分前置后置參數(shù)
 {
 //先記錄當(dāng)前的值
 myInt temp=*this;
 //再遞增
 m_a++;
 //然后返回記錄的值
 return temp;
 }
private:
 int m_a; 
};
//左移運(yùn)算符重載
ostream& operator<<(ostream& cout, myInt num)
{
 cout << num.m_a;
 return cout;
}
void test01()
{
 myInt myint;
 cout << myint << endl;
 cout << ++myint << endl;
 cout << myint << endl;

}
int main()
{
 test01();
 system("pause");
 return 0;
}

賦值運(yùn)算符重載

#include<iostream>
using namespace std;
class Person
{
public:
 Person(int num)//將數(shù)據(jù)開辟到堆區(qū)
 {
 m_a = new int(num);
 }
 ~Person()
 {
 if (m_a != NULL)
 {
  delete m_a;
  m_a = NULL;
 }
 }
 //重載賦值運(yùn)算符
 Person& operator=(Person &p)//返回值用Person返回本身,可執(zhí)行連等
 {
 //先判斷是否有屬性在堆區(qū),如果有先釋放干凈
 if (m_a != NULL)
 {
  delete m_a;
  m_a = NULL;
 }
 m_a = new int(*p.m_a);
 return *this;
 }
 int* m_a;
 
};
void test01()
{
 Person p1(18);
 Person p2(209);
 Person p3(9);
 p2 = p1 = p3;
 cout << *p1.m_a << endl;
 cout << *p2.m_a << endl;
 cout << *p3.m_a << endl;
}
int main()
{
 test01();
 system("pause");
 return 0;
}

關(guān)系運(yùn)算符重載

#include<iostream>
using namespace std;
#include<string>
class Person
{
public:
 
 Person(string name, int age)
 {
 this->age = age;
 this->name = name;
 }
 bool operator==(Person& p)
 {
 if (this->age == p.age && this->name == p.name)
 {
  return true;
 }
 else {
  return false;
 }
 }
 bool operator!=(Person& p)
 {
 if (this->age == p.age && this->name == p.name)
 {
  return false;
 }
 else {
  return true;
 }
 }
 string name;
 int age;

 
};
void test01()
{
 Person p1("gouride", 19);
 Person p2("gouride", 19);
 if (p1 == p2) {
 cout << "p1和p2相同" << endl;
 }
 else {
 cout << "p1和p2不相同" << endl;
 }
 if (p1 != p2) {
 cout << "p1和p2不相同" << endl;
 }
 else {
 cout << "p1和p2相同" << endl;
 }
}
int main()
{
 test01();
 system("pause");
 return 0;
}

函數(shù)調(diào)用重載

仿函數(shù)

#include<iostream>
using namespace std;
#include<string>
class Myprint
{
public:
 void operator()(string name)
 {
 cout << name << endl;
 }
 int operator()(int a,int b)
 {
 return a + b;
 }
};
void test01()
{
 
 Myprint myprint;
 myprint("測(cè)試");
 //匿名對(duì)象調(diào)用
 cout << Myprint()(4,6) << endl;
}
int main()
{
 test01();
 system("pause");
 return 0;
}

總結(jié)

到此這篇關(guān)于C++運(yùn)算符重載的文章就介紹到這了,更多相關(guān)C++運(yùn)算符重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++Stack棧類模版實(shí)例詳解

    C++Stack棧類模版實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了C++Stack棧類模版實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 關(guān)于函數(shù)調(diào)用方式__stdcall和__cdecl詳解

    關(guān)于函數(shù)調(diào)用方式__stdcall和__cdecl詳解

    下面小編就為大家?guī)?lái)一篇關(guān)于函數(shù)調(diào)用方式__stdcall和__cdecl詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C語(yǔ)言 運(yùn)算符詳細(xì)介紹及示例代碼

    C語(yǔ)言 運(yùn)算符詳細(xì)介紹及示例代碼

    本文介紹C語(yǔ)言 運(yùn)算符,這里整理了運(yùn)算符的基礎(chǔ)知識(shí),并附示例代碼,希望能幫助剛剛開始學(xué)習(xí) C語(yǔ)言的同學(xué)
    2016-08-08
  • 如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1

    如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1

    本篇文章是對(duì)如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺析C/C++中被人誤解的SIZEOF

    淺析C/C++中被人誤解的SIZEOF

    以下是對(duì)C/C++中的SIZEOF進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • C++線程池實(shí)現(xiàn)代碼

    C++線程池實(shí)現(xiàn)代碼

    C++11中,線程我們可以理解為對(duì)應(yīng)一個(gè)thread對(duì)象,任務(wù)可以理解為要執(zhí)行的函數(shù),通常是耗時(shí)的函數(shù)。線程過(guò)多或者頻繁創(chuàng)建和銷毀線程會(huì)帶來(lái)調(diào)度開銷,進(jìn)而影響緩存局部性和整體性能
    2021-12-12
  • C++標(biāo)準(zhǔn)庫(kù)bitset類型的簡(jiǎn)單使用方法介紹

    C++標(biāo)準(zhǔn)庫(kù)bitset類型的簡(jiǎn)單使用方法介紹

    這篇文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)bitset類型的簡(jiǎn)單使用方法,需要的朋友可以參考下
    2017-07-07
  • Qt重寫QTreeView自繪實(shí)現(xiàn)酷炫樣式

    Qt重寫QTreeView自繪實(shí)現(xiàn)酷炫樣式

    QTreeView,顧名思義,就是一種樹形的控件,在我們需要做類似于文件列表的視圖時(shí),是一個(gè)不錯(cuò)的選擇,下面我們就來(lái)看看qt如何重寫QTreeView實(shí)現(xiàn)酷炫樣式,感興趣的可以了解一下
    2023-08-08
  • Visual Studio安裝的圖文教程

    Visual Studio安裝的圖文教程

    這篇文章主要介紹了Visual Studio安裝的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++使用BitBlt進(jìn)行窗口抓圖的方法

    C++使用BitBlt進(jìn)行窗口抓圖的方法

    這篇文章主要介紹了C++使用BitBlt進(jìn)行窗口抓圖的方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-01-01

最新評(píng)論

康平县| 临夏县| 扬州市| 静宁县| 绥中县| 民县| 神木县| 祁门县| 嘉鱼县| 龙陵县| 高雄市| 大洼县| 长春市| 屏东县| 邯郸市| 禹城市| 睢宁县| 绥棱县| 沽源县| 乐东| 耒阳市| 新乡市| 平南县| 高青县| 汤原县| 商都县| 乐东| 防城港市| 祁门县| 安康市| 晋江市| 天气| 毕节市| 寿光市| 繁峙县| 军事| 定安县| 介休市| 永寿县| 连城县| 百色市|