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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

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

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

2020-12-21 11:26C++教程網(wǎng) C/C++

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

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

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

復(fù)制代碼 代碼如下:


#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;
}


程序執(zhí)行結(jié)果為:
Call A(int xx)

 

說明執(zhí)行a = 7這程序語句時,程序去調(diào)用類A中的帶參構(gòu)造函數(shù)。
在類A中加入一賦值運算重載成員函數(shù),如下:

復(fù)制代碼 代碼如下:

#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;
}


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

 

說明在類A中已經(jīng)有相應(yīng)賦值運算符重載函數(shù)的時候,執(zhí)行賦值語句a = 7;程序會去調(diào)用類A中相應(yīng)的賦值運算符重載函數(shù),而不會像上面原來那樣去調(diào)用有參構(gòu)造函數(shù)。

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

當(dāng)明白上面的規(guī)則后,現(xiàn)在就可以回過來,討論為什么賦值運算符不可以重載為類的友元函數(shù)了。

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

1、因為它認(rèn)為類中并沒有重載賦值運算符的成員函數(shù),所以它根據(jù)C++的規(guī)則,會去調(diào)用相應(yīng)的構(gòu)造函數(shù)。

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

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

對于剩下的3個運算符 ->, [], () 為什么不能重載為友元函數(shù),也是跟上面一樣的道理。即編譯器發(fā)現(xiàn)當(dāng)類中沒有定義這3個運算符的重載成員函數(shù)時,就會自己加入默認(rèn)的運算符重載成員函數(shù)。
例當(dāng)類A中沒有定義運算符->的重載成員函數(shù),但是我們?nèi)匀豢梢詫︻怉對象指針用->的形式調(diào)用指針指向的對象里的成員。像類A里有成員函數(shù)f(),當(dāng)

復(fù)制代碼 代碼如下:

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


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

延伸 · 閱讀

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

    深入理解goto語句的替代實現(xiàn)方式分析

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

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

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

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

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

    C/C++經(jīng)典實例之模擬計算器示例代碼

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

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

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

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

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

    源之緣11542021-10-27
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

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

    謝恩銘10102021-05-08
  • C/C++C語言實現(xiàn)電腦關(guān)機程序

    C語言實現(xiàn)電腦關(guān)機程序

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

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

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

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

    青山的青6062022-01-04
主站蜘蛛池模板: 日本一区二区三区国产 | 免费午夜影片在线观看影院 | 1769最新资源站 | 娇妻被老外疯狂调教 | 97国产精品久久碰碰牛牛 | 全肉一女n男np高h乳 | 青草视频网站在线观看 | 亚洲AV久久无码精品九号 | julia ann多人乱战 | 2019亚洲男人天堂 | 国产成人精品免费2021 | 2021国产麻豆剧传媒剧情动漫 | 国产999在线观看 | 精品久久免费视频 | 91资源在线视频 | 久久精品国产亚洲AV麻豆欧美玲 | 亚洲精品成人 | 国产在线观看精品香蕉v区 国产在线观看a | 色男人综合 | 亚洲一区二区三区久久精品 | 天天做天天爱天天爽综合网 | 9久热这里只有精品视频在线观看 | 亚洲第一区欧美日韩精品 | 天堂网在线网站成人午夜网站 | 欧美成人免费观看国产 | 桃色公寓 | 性欧美黑人巨大喷潮xxoo | 亚洲第一在线 | 精品国产人成亚洲区 | 60岁妇女毛片免费观看 | 三年片韩国在线 | 亚洲精选在线观看 | 国内在线播放 | 日本高清视频在线观看 | 奇米成人| 风间由美一区二区播放合集 | 亚洲成人综合在线 | 欧美特欧美特级一片 | 久久精品一区二区三区资源网 | 色五夜婷婷 | 欧美二区视频 |