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的友元