1. 程式人生 > >對於友元過載方式和成員函式過載方式的選擇

對於友元過載方式和成員函式過載方式的選擇

今天看C++primier第五版494頁下面有一段敘述:

  與iostream標準庫庫相容的輸入輸出運算子必須是普通的非成員函式,而不能是類的成員函式。否則,它們的左側運算物件將是我們類的一個物件。

  原因倒是非常簡單,因為如果過載函式是作為類中的一個非靜態成員的話,就必須通過一個已經被例項化的類來呼叫,如果僅僅是作為一個友元函式的話,那麼直接呼叫就可以了。

  那麼對於前者,很明顯地可以知道的是由於是作為類中的一個非靜態成員,自然也就有隱式定義的this指標,所以在定義和宣告函式的時候,引數自然而然地就少了一個,但是引用該函式的時候就必須要劃定該函式的作用域是在某個已經被例項化的域上。

  對於作為友元的後者,引數而言的話就多了一個。以位計算符的過載為例:

  首先是作為類成員函式:

#include<iostream>
using namespace std;
class Date{
    public:
        Date(){
        }
        Date(int y,int m,int d){
            year=y;
            month=m;
            day=d;
        }
    const Date& operator<<(const Date &d) const;
    private:
        int year,month,day;
    };
const Date& Date::operator <<(const Date& d) const
    {
        const char sep='\t';
        cout<<"year:"<<d.year<<sep<<"month:"<<d.month<<sep<<"day:"<<d.day<<endl;
        return *this; 
    }
int main(){
    Date b;
    Date a(2016,12,12);
    Date c(2011,11,11);
    b<<a<<c;
    return 0;
} 

看上述例子,為什麼要返回this指標?原因很簡單,這樣我們像std名稱空間的cout<<一樣可以連續的使用,具體地話可以參見我之前轉載的一片文章,記敘iostream中的庫和stdio中標準輸入輸出的不同。

然後是友元函式的寫法

#include<iostream>
using namespace std;
class Date{
public:
	Date(){
	}
	Date(int y,int m,int d){
		year=y;
		month=m;
		day=d;
	}
	friend ostream& operator<<(ostream &os,const Date &dt);
private:
	int year,month,day;
};
ostream& operator <<(ostream& os,const Date& d)
{
	const char sep='\t';
	os<<"year:"<<d.year<<sep<<"month:"<<d.month<<sep<<"day:"<<d.day<<endl;
	return os; 
}
int main(){
	Date a(2016,12,12);
	cout<<a;
	return 0;
}

  對於上述的問題,顯然用友元的處理方式更加地科學,因為並沒有必要為了使用過載後的運算子而提前例項化一個物件,在一些相關的運算子過載的問題上,最後我們應該選取何種方式來過載運算子呢?這個應該視具體情況和具體運算子而定。

相關推薦

對於過載方式成員函式過載方式選擇

今天看C++primier第五版494頁下面有一段敘述:   與iostream標準庫庫相容的輸入輸出運算子必須是普通的非成員函式,而不能是類的成員函式。否則,它們的左側運算物件將是我們類的一個物件。   原因倒是非常簡單,因為如果過載函式是作為類中的一個非靜態成員的話,就

運算子過載,何時用,何時用成員函式

1.能用成員函式,儘量使用成員函式。因為,友元函式,可以訪問類內的所有資料,破壞了類的封裝。 2.當所過載的運算子的函式的引數中,含有該類不能訪問的資料時,用友元函式。因為,友元函式時全域性函式,它不在某一類中,可以訪問類之外的資料。

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

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

C++實現輸入輸出運算子過載函式成員函式實現複數類Complex

今天答應幫朋友做一個C++題目,頗費了一番周折,終於還是寫出來了,讓很久沒敲程式碼的我反省了一下,也回憶了以前學過的知識。 題目要求如下: 一、按下列要求編制複數類,並除錯通過: 1)  基本的建構函式; 2)  成員運算子+、-實現複數的加減運算; 3)  友元運算子+

成員函式過載運算子函式過載運算子的比較

下面的例子可以很好的說明定義為friend   function的好處.      #include   <iostream.h>      class   point      {              int   x;              int   y;             

C++----類的成員變數成員函式在類的儲存方式

類的成員變數和成員函式在類的儲存方式為分開儲存。 即只有非靜態變數儲存在類中,其餘的所有成員均不在類中。 實驗如下: exp1: class Person1 { }; void test01() { cout << "size of (空類Person)

C++運算子過載(注意點),(使用優缺點)

運算子過載例項程式碼 class A{ public: int a,b; A(int _a=0,int _b=0):a(_a),b(_b){} A operator+(A & tmpa){ A t;

【C++】成員函式過載二元一元運算子

過載雙目運算子時,運算子函式中應該具有兩個引數,若運算子函式作為類的成員函式(當運算子過載函式作為類的成員函式時,要求運算元左邊必須是一個物件,而函式的引數可以是同類的物件也可以是普通的變數),則只需要一個引數。 雙目運算子 雙目運算子就是具

成員函式 過載 覆蓋 隱藏 的區別

a.成員函式被過載的特徵: (1)相同的範圍(比如在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 b.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引數相

Java中類成員函式過載、覆蓋隱藏的區別

其他擴充套件連結: 過載: 成員函式被過載的特徵: 1)相同的範圍:在同一個類中 2)函式名相同,引數不同 3)virtual可有可無 覆蓋: 派生函式覆蓋基類函式 1)位於不同的範圍內(子類

C++之函數

res con 形參 display tle private 一點 second main 通過friend關鍵字,我們可以將不屬於當前類的一個函數在當前類中加以聲明,該函數便可以成為當前類的友元函數。#include<iostream>using namesp

C++中的函數

pan string 拷貝構造函數 student 私有 oid 一個 each cor 友元函數可以修改類的私有屬性,寫在類的public/private/protected底下都可以。友元函數的函數體寫在類的外面時,寫法和普通函數一樣,不需要加friend關鍵字,但函數

函數

private 私有 友元 col vat main 受限 div tex 友元全局函數以及友元成員函數 關鍵字: friend class A{ //友元全局函數 friend void printXY(A & a); //友元成員函數,是B的成員函數 frie

【轉載】預設建構函式建構函式過載

轉載自:https://blog.csdn.net/simon_2011/article/details/78129898  作者:simon_syeming  本文主要總結了預設建構函式的相關用法和建構函式過載,旨在能夠對平時的專案開發起到一定的夯實基本功的作用,言簡意

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

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

第15章 、異常其他

本章內容包括: 友元類 友元類方法 巢狀類 引發異常,try塊和catch塊 異常類 執行階段型別識別(RTTI) dynamic_cast和typeid static_cast,const_cast和reiterpret_cast RTT

c++成員函式儲存方式

轉自:點選開啟連結 用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。 按理說,如果用同一個類定義了10個物件,那麼就需要分別為10個物件的資料和函式程式碼分配儲存單元,如圖8.4所示。 圖8.

C++Primer Plus筆記——第十五章 、異常其他總結及程式清單

目錄 本章小結 程式清單 友元類 巢狀類  異常 本章小結        友元使得能夠為類開發更靈活的介面。類可以將其他函式、其他類和其他類的成員函式作為友元。在某些情況下,可能需要使用前向宣告,需要特別注意類和方法宣告的順序

C++Primer Plus筆記——第十五章 、異常其他課後程式設計練習答案

課後程式設計練習答案 習題1                習題2               習題3             習題4 習題1 //tv.h #ifndef TV_H_ #define TV_H_ #include <iostream> u

成員函式過載函式指標

在有成員函式過載的情況下該如何使用函式指標呢 class l { public: void func(); void func(int, int); }; void l::func() { cout << "func()" << endl; }