一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 解析C++中不能重載為友元函數的四個運算符

解析C++中不能重載為友元函數的四個運算符

2020-12-21 11:26C++教程網 C/C++

以下是對C++中不能重載為友元函數的四個運算符進行了詳細的分析介紹,需要的朋友可以過來參考下

C++規定有四個運算符 =, ->, [], ()不可以是全局域中的重載(即不能重載為友員函數),這是為什么呢?
現在先說說賦值運算符“=”的重載
C++規定賦值運算符“=”只能重載為類的非靜態成員函數,而不可以重載為類的友元函數。
不能重載為類的靜態成員應該比較容易理解,因為靜態成員函數是屬于整個類的,不是屬于某個對象的,它只能去操作類靜態數據成員。而賦值運算符“=”是基于對象操作的。
那么為什么賦值運算符不可以重載為類的友元函數?像同樣都是雙目運算符的+為什么它就可以呢?

在討論這問題之前,先看一測試的程序:

復制代碼 代碼如下:


#include <iostream>
using namespace std;

class A
{
private:

 

  int x;
public:
         A(){x=99;}
         A(int xx)
         {
                   cout<<"Call A(int xx)"<<endl;
                   x = xx;
         }
};
int main()
{
         A a;
         a = 7;
}


程序執行結果為:
Call A(int xx)

 

說明執行a = 7這程序語句時,程序去調用類A中的帶參構造函數。
在類A中加入一賦值運算重載成員函數,如下:

復制代碼 代碼如下:

#include <iostream>
using namespace std;

class A
{
private:
         int x;
public:
         A(){x=99;}
         A(int xx)
         {
                   cout<<"Call A(int xx)"<<endl;
                   x = xx;
         }
         A operator=(int xx)   //重載賦值運算符運算
         {
                   cout<<"Call A operator=(int xx)"<<endl;
                   x = xx;
                   return *this;
         }
};

int main()
{
         A a;
         a = 7;
}


程序運行結果:
Call A operator=(int xx)

 

說明在類A中已經有相應賦值運算符重載函數的時候,執行賦值語句a = 7;程序會去調用類A中相應的賦值運算符重載函數,而不會像上面原來那樣去調用有參構造函數。

在此,我們可以對C++規則做出以下的判斷:
當類中沒有定義賦值運算符重載成員函數時(注意,在未定義形參數據類型為該類類型的賦值運算符重載函數時,編譯器會自動生成加入),當程序執行到某一賦值語句時,程序就會調用與賦值語句中右值類型匹配的構造函數,而把這右值當作此構造函數的實參。像最初的賦值語句a = 7,執行時,實際做的操作是a(7)。而當類中有定義賦值運算符重載成員函數,執行賦值語句時,程序就只會去調用相應的賦值運算符重載函數。

當明白上面的規則后,現在就可以回過來,討論為什么賦值運算符不可以重載為類的友元函數了。

我們知道友元函數不是類的成員函數,它只是類的“朋友“,具有訪問把它聲明為“朋友”的類的數據成員的權限而已。
那么當把賦值運算符重載為類的友員函數,在程序中執行類對象的賦值語句時,程序就會出現兩種矛盾的選擇。

1、因為它認為類中并沒有重載賦值運算符的成員函數,所以它根據C++的規則,會去調用相應的構造函數。

2、但是在全局里,我們已經重載了參數類型為此類類型的賦值運算符函數,而這賦值語句剛好和這函數匹配上了,根據C++的規則,也會去調用這函數。

程序是不允許有矛盾不確定選擇的,所以當賦值運算符重載為類的友元函數時,編譯器就會提示錯誤。

對于剩下的3個運算符 ->, [], () 為什么不能重載為友元函數,也是跟上面一樣的道理。即編譯器發現當類中沒有定義這3個運算符的重載成員函數時,就會自己加入默認的運算符重載成員函數。
例當類A中沒有定義運算符->的重載成員函數,但是我們仍然可以對類A對象指針用->的形式調用指針指向的對象里的成員。像類A里有成員函數f(),當

復制代碼 代碼如下:

A a;
A* p = &a;
 p->f();   //雖然類A中沒有自己定義運算符->重載成員函數,但這里仍可這樣使用


然而,當我們把->運算符重載為類A的友元函數時,程序就會出現跟把賦值運算符重載友元一樣的情況,即產生矛盾性。
聲明:以上僅為個人見解

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 亚洲国产免费观看视频 | 四虎免费影院在线播放 | 欧美男同互吃gay老头 | 久久国产精品永久免费网站 | 亚洲 欧美 中文 日韩欧美 | 精选国产AV精选一区二区三区 | 男人女人日批 | 含羞草传媒网站免费进入欢迎 | 国产精品嫩草影院一二三区 | 亚洲欧美国产自拍 | 精品午夜寂寞黄网站在线 | 欧美精品1区 | 欧美福利在线观看 | 日本动漫打扑克动画片樱花动漫 | 色综合久久六月婷婷中文字幕 | 国产真实伦对白在线播放 | 日韩毛片在线影视 | 亚洲啊v| 被强迫变性翘秘书 | 国产精品久久国产精品99 gif | 免费国产好深啊好涨好硬视频 | 亚洲精品国产精麻豆久久99 | 国产亚洲欧美日韩综合综合二区 | 国产高清免费在线 | ass极品美妇pic | 办公室大战秘书呻吟 | 九九99热久久999精品 | 亚洲不卡视频在线 | 男人天堂资源 | 日韩欧美中文字幕一区二区三区 | 国产自精品 | 性趣味商品推荐 | 99在线在线视频免费视频观看 | 果冻传媒 天美 麻豆 | 视频一区二区三区在线 | 99国产精品久久久久久久... | 青青草国产免费国产是公开 | 国内久久精品视频 | 欧美一级特黄aaa大片 | 青草娱乐极品免费视频 | 亚洲国产精品91 |