欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊: 次

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

說明執(zhí)行a = 7這程序語句時(shí),程序去調(diào)用類A中的帶參構(gòu)造函數(shù)。
在類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)

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

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

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

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

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

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

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

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

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

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

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

上一篇:淺析如何在c語言中調(diào)用Linux腳本

欄    目:C語言

下一篇:C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析

本文標(biāo)題:解析C++中不能重載為友元函數(shù)的四個(gè)運(yùn)算符

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4247.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有