1. 程式人生 > >c++友元實現操作符過載

c++友元實現操作符過載

運算子過載的本質是一個函式

#include <iostream>
using namespace std;

class A {
private:
    int m_a;
    int m_b;

    friend A operator+(A &a1, A &a2);//友元函式訪問私有屬性,實現二元運算子過載

    friend A operator++(A &a); //友元函式訪問私有屬性,實現一元運算子過載(前置)

    /*後置為避免與前置函式定義相同,使用佔位符int,告訴編譯器是後置運算子過載*/
    friend A operator
++(A &a, int); //友元函式訪問私有屬性,實現一元運算子過載(後置) friend class B; //友元類,訪問私有屬性。若B類是A類的友員類,則B類的所有成員函式都是A類的友員函式 public: A(int a){ this->m_a = a; } A(int a, int b) { m_a = a; m_b = b; } void show() { cout << m_a << endl; } }; class
B { private: A *pObjA = new A(21); public: void showA() { cout << pObjA->m_a << endl; } }; A operator+(A &a1, A &a2) { A tmp(a1.m_a + a2.m_a, a1.m_b + a2.m_b); return tmp; } A operator++(A &a) { //前置++ a.m_a++; a.m_b++; return a; } A operator
++(A &a, int) { //後置++ A tmp = a; a.m_a++; a.m_b++; return tmp; } int main() { A a1(1, 9); A a2(3, 4); A a3 = a1 + a2; a3.show(); ++a3; a3.show(); a3++; a3.show(); return 0; }
class Complex
{
public:
    int a;
    int b;
    friend Complex operator+(Complex &c1, Complex &c2);
public:
    Complex(int a=0, int b=0)
    {
        this->a = a;
        this->b = b;
    }

public:
    void printCom()
    {
        cout<<a<<" + "<<b<<"i "<<endl;
    }

private:
};

/*
Complex myAdd(Complex &c1, Complex &c2)
{
    Complex tmp(c1.a+ c2.a, c1.b + c2.b);
    return tmp;
}
*/

Complex operator+(Complex &c1, Complex &c2)
{
    Complex tmp(c1.a+ c2.a, c1.b + c2.b);
    return tmp;
}

void main()
{
    Complex c1(1, 2), c2(3, 4);

    //Complex c3 = c1 + c2;  //使用者自定義型別 編譯器無法讓變數相加
    //Complex myAdd(Complex &c1, Complex &c2);

    //1 普通函式
    //Complex c3 = myAdd(c1, c2);
    //c3.printCom();

    //2 operator+ 函式名稱
    //Complex c3 = operator+(c1, c2);
    //c3.printCom();

    //3 +替換 函式名
    Complex c3 = c1 + c2; //思考C++編譯器如何支援操作符過載機制的 (根據型別)
    c3.printCom();
{
int a =0, b = 0, c; //基礎型別C++編譯器知道如何加減 
c = a +b;
}

    //4 把Complex類變成私有屬性
    //friend Complex operator+(Complex &c1, Complex &c2);

    cout<<"hello..."<<endl;
    system("pause");
    return ;
}

為vector類過載流插入運算子和提取運算子

class vector
{ 
public :
    vector( int size =1 ) ;       
    ~vector() ;
    int & operator[]( int i ) ;
    friend ostream & operator << ( ostream & output , vector & ) ;
    friend istream & operator >> ( istream & input, vector & ) ;
private :  
    int * v ;     
    int len ;
};

vector::vector( int size ) 
{ 
    if (size <= 0 || size > 100 )
    { 
        cout << "The size of " << size << " is null !\n" ; abort() ;  
    }
    v = new int[ size ] ;  len = size ;
}

vector :: ~vector() 
{ 
    delete[] v ;  
    len = 0 ; 
}

int &vector::operator[]( int i )        
{ 
    if( i >=0 && i < len )  return v[ i ] ;
    cout << "The subscript " << i << " is outside !\n" ;  abort() ;
}
ostream & operator << ( ostream & output, vector & ary )
{ 
    for(int i = 0 ; i < ary.len ; i ++ )  
        output << ary[ i ] << "  " ;
    output << endl ;
    return output ;
}
istream & operator >> ( istream & input, vector & ary ) 
{ 
    for( int i = 0 ; i < ary.len ; i ++ )  
        input >> ary[ i ] ;
    return  input ;
}

void main()
{ 
    int k ;
    cout << "Input the length of vector A :\n" ;     
    cin >> k ;
    vector A( k ) ;
    cout << "Input the elements of vector A :\n" ;     
    cin >> A ;
    cout << "Output the elements of vector A :\n" ;
    cout << A ;
    system("pause");
}

相關推薦

c++實現操作符過載

運算子過載的本質是一個函式 #include <iostream> using namespace std; class A { private: int m_a; int m_b; friend A operator+

C++ 過載運算子 函式作為過載運算子 過載運算子+

以友元函式作為過載運算子的方式過載運算子+ 下面的例子來自於課本 #include <iostream> using namespace std; class Complex {

C++——運算子的過載---以成員函式方式過載---以函式方式過載

一、運算子的過載   1、運算子的過載   允許把標準運算子(如+ - * /等運算子)應用於自定義資料型別的物件,可以提高程式的可讀性,運算子的過載本質上還是函式過載。運算子僅僅是語法上的方便,它是另一種函式呼叫的方式,只有在設計涉及的程式碼更容易寫,尤其是更容易讀的時候才有必要過載。   2、實現運

C++過載+運算子易錯點

  我今天晚上覆習C++類的用法,在使用友元過載雙目運算子+的時候,出現了一個詭異的錯誤.百思不得其解,專門重寫一個類進行測試,最後發現了原因.猛然想起我之前也犯過這樣的錯誤,以為經典,故記之.   奉上錯誤程式碼: #include <iostrea

C++ 函式的使用&過載“輸入輸出”運算子

友元函式 形式 friend 型別名 友元函式名(形參表); 然後在類體外對友元函式進行定義,定義的格式和普通函式相同,但可以通過物件作為引數直接訪問物件的私有成員 說明如下 1)必須在類的說明中說明友元函式,說明時以關鍵字friend開頭,後跟友元函式的函

[C++]

約束 能夠 需要 pos 語句 c++ 函數聲明 一般來說 定義 友元 類可以允許其他類或函數訪問它的非共有成員,辦法是令其他類或函數成為它的友元。如果類想把一個函數作為它的友元,只需要添加一條以friend關鍵字開始的函數聲明語句即可。 友元聲明只能出現在類定義的內部,但

c/c++ 基本概念

test names 能夠 ons fun c++ std 訪問類 color 友元基本概念: 1,把一個一般函數聲明為一個類的友元函數 2,把一個類A的某幾個成員函數聲明為某個類B的友元函數 3,把一個類A聲明為一個類B的友元類。 友元的作用:可以訪問類B裏所有的成員變量

C#中如何利用操作符過載和轉換操作符 (轉載)

操作符過載 有的程式語言允許一個型別定義操作符應該如何操作型別的例項,比如string型別和int型別都過載了(==)和(+)等操作符,當編譯器發現兩個int型別的例項使用+操作符的時候,編譯器會生成把兩個整數加到一起的程式碼。當編譯器發現兩個string型別的例項使用+操作符的時候,編譯器會生成把兩個

c++ 和異常

1. 如果remote類是local類的成員,當使用friend class remote對remote類進行宣告時,remote類為local類的友元類。 2. 友元成員函式 把remote的某個成員函式宣告為Tv類的友元函式 3. 可以互為友元類 4. 一個函式可以同時是兩

c語言如何實現函式過載

c語言如何實現函式過載 c語言中不允許有同名函式,因為編譯時函式命名是一樣的,不像c++會新增引數型別和返回型別作為函式編譯後的名稱,進而實現過載。如果要用c語言顯現函式過載,可通過以下方式來實現: 使用函式指標來實現,過載的函式不能使用同名稱,只是類似的實現了函式過載功能

c++ friend簡單理解

C++中的友元機制允許類的非公有成員(private成員)被一個類或者函式訪問,友元按型別分為三種:普通非類成員函式作為友元,類的成員函式作為友元,類作為友元。 友元包括友元的宣告以及友元的定義。友元的宣告預設為了extern,就是說友元類或者友元函式的作用域已

C++學習筆記

友元可以分為三種: 1.友元函式; 2.友元類; 3.友元成員函式; 友元的好處,通過友元函式,可以賦予函式與類成員函式相同的訪問許可權,友元函式是可以訪問類私有成員的非類成員函式。 因為友元函式不是類的成員函式,所以不能用類物件呼叫成員函式的方式(類成員符)呼叫友元函式。

C# 函式

2. 簡述:不用繼承的方式為一個類增加成員方法。 3. 實現程式碼: /// <summary> /// Component擴充套件類 /// </summary> internal static class ComponentDesignMod

C++函式和類用法詳解

在C++中,我們使用類對資料進行了隱藏和封裝,類的資料成員一般都定義為私有成員,成員函式一般都定義為公有的,以此提供類與外界的通訊介面。但是,有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成員,這時可以將這些函式定義為該函式的友元函式。除了友元函式

c++的幾種情況

一、友元類 對於一個類的私有成員,只有該類的成員函式才能訪問,其他類訪問不了。友元類就是希望另外一個類能夠訪問當前類的私有成員,這樣就可以在當前類中宣告一個友元類。程式碼如下: #include <iostream> using namespace std;

C#建構函式、操作符過載以及自定義型別轉換

構造器   構造器(建構函式)是將型別的例項初始化的特殊方法。構造器可分為例項構造器和型別構造器,本節將詳細介紹有關內容。 例項構造器   顧名思義,例項構造器的作用就是對型別的例項進行初始化。如果類沒有顯示定義任何構造器,C#編譯器會定義一個預設的無參構造器。相反,如果類

c++函式宣告及其呼叫

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

c++類宣告及其呼叫

友元類 友元除了前面講過的函式以外,友元還可以是類,即一個類可以作另一個類的友元。當一個類作為另一個類的友元時,這就意味著這個類的所有成員函式都是另一個類的友元函式。 使用友元類時注意: (1) 友元關係不能被繼承。 (2) 友元關係是單向的,不具有交換性。若類B

c++函式說明

1)C++中引入友元函式,是為在該類中提供一個對外(除了他自己以外)訪問的視窗;2)這個友元函式他不屬於該類的成員函式,他是定義在類外的普通函式  只是在類中宣告該函式可以直接訪問類中的private或者protected成員。使用友元函式注意的要點:類中通過使用關鍵字fri

試圖對C++函式,靜態成員函式做個小結

2014年12月13日 22:28:43第一篇部落格   以下僅僅是個人觀點,請大家指正.  友元函式分類:(按照我的想法,結合C++ Plus) 一.   1. 讓其他類(B類)的成員數最為類A的友元函式(只需要在類A中宣告即可)         2.讓類B成為類A的友元