運算子過載為成員函式
運算子過載實質上就是通過函式過載,過載為成員函式,它就可以自由的訪問本類的資料成員,實際使用時,總是通過該類的某個物件來訪問過載的運算子。如果是雙目運算子,左運算元是物件本身的資料,由this指標指出,就不再需要任何引數。下面分別介紹這兩種情況。
對於雙目運算子B,如果要過載為類的成員函式,使之能夠實現表示式oprd1 B oprd2,其中oprd1為A類的物件,則應當把B過載為A類的成員函式,該函式只有一個形參,形參的型別是oprd2所屬的型別。經過過載之後,表示式就相當於函式呼叫orpd.operator B(oprd2).
對於前置單目運算子U,如“-”(負號)等,如果要過載為類的成員函式,用來實現表示式U oprd,其中oprd為A類的物件,則U應當過載為A類的成員函式,函式沒有形參,經過過載之後,表示式U oprd相當於函式呼叫oprd.operator U().
再來看看後置運算子“++”和“–”,如果要過載為類的成員函式,用來實現表示式oprd++或oprd–,其中oprd為A類的物件,那麼運算子就應當過載為A類的成員函式,這時函式要帶有一個整型(int)形參。過載之後,表示式oprd就相當於呼叫oprd.oprator++(0)和oprd.oprator–(0)。這裡的int型別引數在運算中不起任何作用,只是區別於前置後置。
複數類加減法運算過載為成員函式形式
#include<iostream>
#include<cassert>
using namespace std;
class complex
{
public:
complex(double r=0.0,double i=0.0):real(r),imag(i){}
complex operator+(const complex &c2) const;//運算子+過載成員函式
complex operator-(const complex &c2) const;//運算子-過載成員函式
void display() const ;
private:
double real;
double imag;
};
complex complex::operator+(const complex &c2) const
{
return complex(real+c2.real,imag+c2.imag);//建立一個臨時無名物件作為返回值
}
complex complex::operator-(const complex &c2) const
{
return complex(real-c2.real,imag-c2.imag);
}
void complex::display() const
{
cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
complex c1(5,4),c2(2,10),c3;
cout<<"c1="; c1.display();
cout<<"c2="; c2.display();
c3=c1-c2;//使用過載運算子完成複數減法
cout<<"c3=c1-c2="; c3.display();
c3=c1+c2;
cout<<"c3=c1+c2="; c3.display();
return 0;
}
將單目運算子“++”過載為成員函式形式。
#include<iostream>
#include<cassert>
using namespace std;
class clock
{
public:
clock(int hour=0,int minute=0,int second=0);
void showtime() const;
clock& operator++();
clock operator++(int);
private:
int hour,minute,second;
};
clock::clock(int hour,int minute,int second)
{
if(0<=hour&&hour<24&&0<=minute&&minute<60&&0<=second&&second<60)
{
this->hour=hour;
this->minute=minute;
this->second=second;
}
else
{
cout<<"time error!"<<endl;
}
}
void clock::showtime() const
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
clock &clock::operator++()//前置單目運算子過載函式
{
second++;
if(second>=60)
{
second-=60;
minute++;
if(minute>=60)
{
minute-=60;
hour=(hour+1)%24;
}
}
return *this;
}
clock clock::operator++(int)//後置單目運算子過載
{
clock old=*this;
++(*this);//呼叫前置“++”運算子
return old;
}
int main()
{
clock myclock(23,59,59);
cout<<"first time output: ";
myclock.showtime();
cout<<"show myclock++ ";
(myclock++).showtime();
cout<<"show ++myclock ";
(++myclock).showtime();
return 0;
}
相關推薦
運算子過載為成員函式
運算子過載實質上就是通過函式過載,過載為成員函式,它就可以自由的訪問本類的資料成員,實際使用時,總是通過該類的某個物件來訪問過載的運算子。如果是雙目運算子,左運算元是物件本身的資料,由this指標指出,就不再需要任何引數。下面分別介紹這兩種情況。
c++運算子定義為成員函式還是非成員函式
=,[],->,()運算子必須是成員,賦值,下標,箭頭訪問,呼叫; 複合賦值運算子一般應該是成員; 改變物件狀態的運算子或與給定型別密切相關的運算子例如遞增減,解引用應該是成員; 具有對稱性的運算子可能轉換任意一端的運算物件,例如==,算術相等性關係,位運算等等 **當把運算子定義為成員函式時,左側必須
C++運算子過載(成員函式方式)
一、運算子過載 C++中預定義的運算子的操作物件只能是基本資料型別,實際上,對於很多使用者自定義型別,也需要有類似的運算操作。如果將C++中這些現存的運算子直接作用於使用者自定義的型別資料上,會得到什麼樣的結果呢?編譯器無法給出正常的結果,因為我們需要運算子過載,給運算子賦
過載++運算子為成員函式(日期類函式設計也可以看一下 )
//這篇程式碼比較長建議貼上下來到dev裡面用左邊的+-把部分函式收起來一條條的開啟看 不容易亂 #include <iostream> using namespace std; class Date{ private: int year,month,day;//年月日 b
C++基礎知識複習--運算子過載(非成員函式過載和成員函式過載)
#include<iostream> using namespace std; class Complex { private: float Vector_x; float Vector
C++——運算子的過載---以成員函式方式過載---以友元函式方式過載
一、運算子的過載 1、運算子的過載 允許把標準運算子(如+ - * /等運算子)應用於自定義資料型別的物件,可以提高程式的可讀性,運算子的過載本質上還是函式過載。運算子僅僅是語法上的方便,它是另一種函式呼叫的方式,只有在設計涉及的程式碼更容易寫,尤其是更容易讀的時候才有必要過載。 2、實現運
單目運算子過載為友元函式
#include<iostream> using namespace std; class point { private: int x,y; public: point(int xx=0,int yy=0) {x=xx;y=yy;}
C++知識積累:運算子過載時建構函式與解構函式呼叫次數不一致的問題
在學習運算子過載的時候自己寫了這樣一段程式: class Stu { public: Stu() { std::cout<<"Stu No parameter constructor called!"<<
C++:面試時應該實現的string類(建構函式、拷貝建構函式、賦值運算子過載和解構函式)
一、string類的4個基本函式是什麼? 建構函式 拷貝建構函式 賦值運算子過載 解構函式 二、函式實現 1.建構函式 String(char* pStr = " ")
運算子過載的非成員函式形式
運算子過載為非成員函式的規則:函式的形參代表依自左至右次序排列的各運算元過載為非成員函式時引數個數 = 原運算元個數(後置++、--除外,它們仍然為了區分前置++、--要強行加個int)至少應該有一個自
運算子前置++和後置++過載為時鐘類的成員函式
源程式: #include<iostream.h> class Clock //時鐘類宣告 { public: //外部介面 Clock(int NewH=0, int NewM
(轉)為什麼operator運算子過載一定要為友元函式呢
如果是過載雙目操作符(即為類的成員函式),就只要設定一個引數作為右側運算量,而左側運算量就是物件本身 而 >> 或<< 左側運算量是 cin或cout 而不是物件本身,所以不滿足後面一點,就只能申明為友元函數了 如果一定要宣告為成員函式,只能成為如下的形式:
C++類和物件.四個預設成員函式(賦值運算子過載)
1.(1)類的定義 類就是具有相同資料和相同操作的一組物件的集合。 學生類定義: class student {//成員變數char* name;int age;int sex;//成員函式void speak(){cout<<name<<"年
定義一個複數類Complex,過載運算子“+”,“-”,“*”,“/”,使之能用於複數的加、減、乘、除。運算子過載函式作為Complex類的成員函式。編寫程式,分別求兩個複數之和、差、積和商。
#include <iostream> #include <iomanip> using namespace std; class Complex { public: Complex(); Complex(double r
請編寫程式,處理一個複數與一個double數相加的運算,結果存放在一個double型的變數d1中,輸出d1的值,再以複數形式輸出此值。定義Complex(複數)類,在成員函式中包含過載型別轉換運算子:
#include <iostream> #include <iomanip> using namespace std; class Complex { public: Complex(); Complex(double r
c++成員運算子過載和友元運算子過載的比較(以++,--運算子為例)
1、對雙目運算子而言,成員運算子過載函式引數列表中含有一個引數,而友元運算子過載函式引數列表含有兩個引數;對單目運算子而言,成員運算子過載函式引數列表中沒有引數,而友元運算子過載函式引數列表含有一個引數。 2、雙目運算子一班可以被過載為友元運算子和成員函式運算
C++ 過載運算子 運算子過載函式作為類成員函式 過載運算子+
用運算子過載函式作為類成員函式的方法過載運算子+ 下面的例子來自於課本: #include <iostream> using namespace std; class Complex {
C++定義一個複數類Complex,過載運算子“+”,使之能用於複數的加法運算。將運算子函式過載為非成員、非友元的普通函式。編寫程式,求兩個複數之和。
#include <iostream> #include <iomanip> using namespace std; class Complex { public: Complex(); Complex(double r,do
成員函式和友元函式完成二元運算子過載
傳智掃地僧課程學習筆記。 運算子過載實現方法, 1,用成員函式 2,用友元函式 區別是,傳參是否內部使用this指標, 全域性函式、類成員函式方法實現運算子過載步驟 1)要承認操作符過載是一個函式,寫出函式名稱operator+ ()
為什麼operator運算子過載一定要為友元函式呢?
格拉德韋爾在《異數》:並非天資超人一等,而是付出了持續不斷的努力。只要經過1萬小時的錘鍊,任何人都能從平凡變成超凡”。要成為某個領域的專家,需要10000小時:如果每天工作八個小時,一週工作五天,那麼成為一個領域的專家至少需要五年。 linux原始碼線上閱讀 各種線編譯工具