1. 程式人生 > >運算子過載的非成員函式形式

運算子過載的非成員函式形式

運算子過載為非成員函式的規則:

  • 函式的形參代表依自左至右次序排列的各運算元
  • 過載為非成員函式時
  • 引數個數 = 原運算元個數(後置++、--除外,它們仍然為了區分前置++、--要強行加個int)
  • 至少應該有一個自定義型別的引數(例如"Typ1 operator + (int, double)"非法)
  • 如果在運算子的過載函式中需要操作某類物件的私有成員,可以將此函式宣告為該類的友元

運算子過載為非成員函式的使用方法:

  • 過載雙目運算子U:oprd1 U oprd2 = operator U (oprd1, oprd2)
  • 前置單目運算子U:U oprd = operator U(oprd)
  • 後置單目運算子U:oprd U = operator U(oprd, 0)

例子:過載負數的加減法以及"<<"運算子:

  • 將+、-過載為非成員函式,並將其宣告為複數類的友元,兩個運算元都是複數類的常引用
  • 將<<(雙目運算子)過載為非成員函式,並將其宣告為複數類的友元,它的左運算元是std::ostream引用,右運算元為複數類的常引用,返回std::ostream引用
#include<iostream>
using namespace std;
class Complex
{
	public:
		Complex(double r = 0.0, double i = 0.0):  r(r),  i(i)  {}  
		friend Complex operator + (const Complex &c1, const Complex &c2);
		friend Complex operator - (const Complex &c1, const Complex &c2);
		friend ostream &operator << (ostream &out, const Complex &c);
	private:    
		double r;
		double i;
};

Complex operator + (const Complex &c1, const Complex &c2)
{
	return Complex(c1.r+c2.r, c1.i+c2.i);
}
Complex operator - (const Complex &c1, const Complex &c2)
{
	return Complex(c1.r-c2.r, c1.i-c2.i);
}
ostream &operator << (ostream &out, const Complex &c)
{
	out<<"("<<c.r<<", "<<c.i<<")";
	return out;
}

int main(void)
{    
	Complex c1(5, 4), c2(2, 10), c3;
	c3 = c1 - c2;
	cout<<"c3 = c1 - c2 = "<<c3<< endl;
	c3 = c1 + c2;
	cout<<"c3 = c1 + c2 = "<<c3<< endl;
	return 0;
}

相關推薦

C++基礎知識複習--運算子過載(非成員函式過載和成員函式過載)

#include<iostream> using namespace std; class Complex { private: float Vector_x; float Vector

運算子過載非成員函式形式

運算子過載為非成員函式的規則:函式的形參代表依自左至右次序排列的各運算元過載為非成員函式時引數個數 = 原運算元個數(後置++、--除外,它們仍然為了區分前置++、--要強行加個int)至少應該有一個自

Python3底層函式重寫和運算子過載

底層函式重寫                   Python是支援重寫底層函式的,在列印物件時,               &n

(轉)為什麼operator運算子過載一定要為友元函式

如果是過載雙目操作符(即為類的成員函式),就只要設定一個引數作為右側運算量,而左側運算量就是物件本身 而 >> 或<< 左側運算量是 cin或cout 而不是物件本身,所以不滿足後面一點,就只能申明為友元函數了 如果一定要宣告為成員函式,只能成為如下的形式:

C++類和物件.四個預設成員函式(賦值運算子過載

1.(1)類的定義   類就是具有相同資料和相同操作的一組物件的集合。 學生類定義: class student {//成員變數char* name;int age;int sex;//成員函式void speak(){cout<<name<<"年

運算子過載和友元函式

運算子過載的意義是:將常見的運算子重載出其他的含義:比如將*重載出指標的含義,將<<與cout聯合使用重載出輸出的含義,但需要認識到的問題是:運算子的過載:本質仍然是成員函式,即你可以認為:發生運算子過載時,實際上,是呼叫了成員函式,只不過重新換了個名字,叫運算子過載。 友元函式的意義:使得我們

過載++運算子為成員函式(日期類函式設計也可以看一下 )

//這篇程式碼比較長建議貼上下來到dev裡面用左邊的+-把部分函式收起來一條條的開啟看 不容易亂 #include <iostream> using namespace std; class Date{ private: int year,month,day;//年月日 b

C++拷貝建構函式運算子過載(VC實現)

String.h檔案: #ifndef STRING_H #define STRING_H #include <ostream> using namespace std; class String { public: String(){ m_pStr = nullptr

過載操作符 友元 成員函式 非成員函式

平時都不怎麼用得上。 過載操作符:operator+() 友元:類的友元函式是非成員函式,其訪問許可權與成員函式相同。 //mytime3.h #include<iostream> class Time { private: int hours;

C++ 複製建構函式運算子過載示例

string1.h // // Created by lance on 10/16/18. // #ifndef CPP_PRIMER_STRING1_H #define CPP_PRIMER_STRING1_H #include <iostream> u

C++知識積累:運算子過載時建構函式與解構函式呼叫次數不一致的問題

在學習運算子過載的時候自己寫了這樣一段程式: class Stu { public: Stu() { std::cout<<"Stu No parameter constructor called!"<<

C++筆記(十九)——運算子過載函式

一、作用: 使複雜函式的理解更直觀,程式更加簡單易懂 二、運算子過載函式的形式是: 返回型別 operator 運算子符號(引數說明) {   //函式體的內部實現 } void operator +(Test&, Text&) { //函

c++單鏈表【建構函式運算子過載、解構函式、增刪查改等】

c++中的單向連結串列寫法:實現增刪查改、建構函式、運算子過載、解構函式等。建立標頭檔案SList.h#pragma once typedef int DataType; //SList要訪問SListNode,可以通過友元函式實現,友元函式在被訪問的類中 class SL

c++運算子過載中的兩種形式以及常引用的使用

下面是c++運算子過載的兩種形式: 形式1: Point operator + (const Point& A,const Point& B) { return Point(A.x+B.x,A.y+B.y); } 形式2: ostream&

C++ 過載運算子 運算子過載函式作為類成員函式 過載運算子+

用運算子過載函式作為類成員函式的方法過載運算子+ 下面的例子來自於課本: #include <iostream> using namespace std; class Complex {

賦值運算子過載函式 返回引用和返回物件的區別

先上程式碼 #include "stdafx.h" #include <string> using namespace std; class CStudent { public: CStudent(char *pName) :m_p

C++運算子過載(友元函式方式)

我們知道,C++中的運算子過載有兩種形式:①過載為類的成員函式(見C++運算子過載(成員函式方式)),②過載為類的友元函式。 當過載友元函式時,將沒有隱含的引數this指標。這樣,對雙目運算子,友元函

C++運算子過載和友元函式用法

1.友元函式的簡單介紹 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類A中的函式要訪問類B中的成員(例如:智慧指標類的實現),那麼類A中該函式要是類B的友元函式。具體來說:為了 使其他類的成員函式直接訪問該類的私有變數。即:允許外面的類或函式去訪問類的私有變數和

總結c++類的建構函式 拷貝建構函式 解構函式 賦值運算子過載的特點以及函式呼叫順序

對 c++類的建構函式 拷貝建構函式 解構函式 賦值運算子過載 相關知識的總結,並附上例子,希望對大家有幫助,有錯誤大家可以指出來  一 建構函式    1 建構函式: 建構函式時一個特殊的成員函式,用來初始化物件的資料成員,在物件建立時,由編譯器自動呼叫,在物件的生命週期