程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> C++中利用構造函數與無名對象簡化運算符重載函數

C++中利用構造函數與無名對象簡化運算符重載函數

編輯:vc教程

在完整描述思想之前,我們先看一下如下的例子,這個例子中的加運算符重載是以非成員函數的方式出現的:

//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;

class Test
{
public:
Test(int a)
{
Test::a = a;
}
friend Test operator + (Test&,int);
public:
int a;
};

Test operator + (Test &temp1,int temp2)
{
Test result(temp1.a + temp2);
return result;
}
int main()
{
Test a(100);
a = a + 10;//正確
a = 10 + a;//錯誤
cout<<a.a<<endl;
system("pause");
}

上面的代碼是一個自定義類對象與內置整型對象相加的例子,但錯誤行讓我們猛然感覺很詫異,但仔細看看的確也在情理中,參數順序改變後c++無法識別可供使用的運算符重載函數了。

我們為了適應順序問題不得不多加一個幾乎一樣的運算符重載函數。

代碼如下:

//程序作者:管寧
//站點:www.cndev-lab.com
//所有稿件均有版權,如要轉載,請務必著名出處和作者

#include <iostream>
using namespace std;

class Test
{
public:
Test(int a)
{
Test::a = a;
}
friend Test operator + (Test&,int);
friend inline Test operator + (Test&,int);
public:
int a;
};
Test operator + (Test &temp1,int temp2)
{
Test result(temp1.a + temp2);
return result;
}
inline Test operator + (int temp1,Test &temp2)//利用內聯函數的定義提高效率
{
return temp2+temp1;
}
int main()
{
Test a(100);
a = a + 10;//正確
a = 10 + a;//正確
cout<<a.a<<endl;
system("pause");
}

代碼中我們使用內聯函數的目的是為了縮減開銷,但事實上我們仍然覺得是比較麻煩的,例子中的情況都還是非成員函數的情況,如果運算符重載函數是作為類成員函數,那麼問題就來了,重載函數的第一個參數始終被隱藏,我們無發讓int形參排列在隱藏參數的前面,從而導致a = 10 + a;無法獲取正確的運算符重載函數。

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