最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2013年07月31日 09:54:33   作者:  
以下是對(duì)C++中不能重載為友元函數(shù)的四個(gè)運(yùn)算符進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下

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

在討論這問(wèn)題之前,先看一測(cè)試的程序:

復(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)

說(shuō)明執(zhí)行a = 7這程序語(yǔ)句時(shí),程序去調(diào)用類(lèi)A中的帶參構(gòu)造函數(shù)。
在類(lèi)A中加入一賦值運(yùn)算重載成員函數(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)   //重載賦值運(yùn)算符運(yùn)算
         {
                   cout<<"Call A operator=(int xx)"<<endl;
                   x = xx;
                   return *this;
         }
};

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 詳解C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法

    詳解C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法

    這篇文章主要介紹了C語(yǔ)言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法,包括errno和strerror以及perror的介紹,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言實(shí)現(xiàn)支持動(dòng)態(tài)拓展和銷(xiāo)毀的線程池

    C語(yǔ)言實(shí)現(xiàn)支持動(dòng)態(tài)拓展和銷(xiāo)毀的線程池

    這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)支持動(dòng)態(tài)拓展和銷(xiāo)毀的線程池,感興趣的小伙伴們可以參考一下
    2016-01-01
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存規(guī)劃詳解

    C語(yǔ)言動(dòng)態(tài)內(nèi)存規(guī)劃詳解

    這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存的規(guī)劃,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • C++ 互斥鎖原理以及實(shí)際使用介紹

    C++ 互斥鎖原理以及實(shí)際使用介紹

    本文主要聊一聊如何使用互斥鎖以及都有哪幾種方式實(shí)現(xiàn)互斥鎖。實(shí)現(xiàn)互斥,可以有以下幾種方式:互斥量(Mutex)、遞歸互斥量(Recursive Mutex)、讀寫(xiě)鎖(Read-Write Lock)、條件變量(Condition Variable)。感興趣的同學(xué)可以參考一下
    2023-04-04
  • C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇

    C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • c++中new和delete操作符用法

    c++中new和delete操作符用法

    c++中new和delete運(yùn)算符是用于動(dòng)態(tài)分配和撤銷(xiāo)內(nèi)存的運(yùn)算符,下面是示例,大家參考使用吧
    2014-04-04
  • linux C++ 獲取文件絕對(duì)路徑的實(shí)例代碼

    linux C++ 獲取文件絕對(duì)路徑的實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇linux C++ 獲取文件絕對(duì)路徑的實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • CMakeList中自動(dòng)編譯protobuf文件過(guò)程

    CMakeList中自動(dòng)編譯protobuf文件過(guò)程

    這篇文章主要介紹了CMakeList中自動(dòng)編譯protobuf文件過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++程序的五大內(nèi)存分區(qū)實(shí)例詳解

    C++程序的五大內(nèi)存分區(qū)實(shí)例詳解

    C++內(nèi)存區(qū)域,一般可分為棧內(nèi)存區(qū)、堆內(nèi)存區(qū)、全局/靜態(tài)內(nèi)存區(qū)、文字常量?jī)?nèi)存區(qū)及程序代碼區(qū)5大分區(qū),本文就帶大家深刻的理解這5大內(nèi)存分區(qū),感興趣的可以了解一下
    2021-10-10
  • 利用C++實(shí)現(xiàn)簡(jiǎn)易的狼人殺游戲

    利用C++實(shí)現(xiàn)簡(jiǎn)易的狼人殺游戲

    狼人殺游戲是一款非常有趣的角色扮演游戲,它需要玩家之間互相猜測(cè)身份并進(jìn)行投票,通過(guò)推理來(lái)找出真正的狼人。本文將用C++實(shí)現(xiàn)這一游戲,感興趣的可以了解一下
    2023-04-04

最新評(píng)論

梁河县| 东丰县| 星座| 射洪县| 马关县| 巴马| 邢台县| 徐闻县| 鄂州市| 健康| 隆德县| 香河县| 剑阁县| 泰州市| 庆云县| 湘潭县| 屏山县| 建阳市| 金堂县| 九龙县| 昔阳县| 南城县| 仙桃市| 宁化县| 阳朔县| 福安市| 衡山县| 井冈山市| 怀集县| 商洛市| 高尔夫| 邵阳县| 栾川县| 清苑县| 特克斯县| 即墨市| 朝阳县| 青岛市| 视频| 灌南县| 玉龙|