亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

復制代碼 代碼如下:

#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í)行結果為:
Call A(int xx)

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

復制代碼 代碼如下:

#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中已經有相應賦值運算符重載函數(shù)的時候,執(zhí)行賦值語句a = 7;程序會去調用類A中相應的賦值運算符重載函數(shù),而不會像上面原來那樣去調用有參構造函數(shù)。

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

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

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

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

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

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

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

復制代碼 代碼如下:

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

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

相關文章

  • 解決不用sizeof求出int大小的方法

    解決不用sizeof求出int大小的方法

    本篇文章是對不用sizeof求出int大小的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用c++11 constexpr時遇到的坑詳解

    使用c++11 constexpr時遇到的坑詳解

    c++11 constexpr將變量聲明為constexpr類型以便由編譯器來驗證變量是否是一個常量表達式,這篇文章主要給大家介紹了關于使用c++11 constexpr時遇到的坑,需要的朋友可以參考下
    2021-05-05
  • C語言深入探究函數(shù)的溯源

    C語言深入探究函數(shù)的溯源

    函數(shù)是一組一起執(zhí)行一個任務的語句。每個 C 程序都至少有一個函數(shù),即主函數(shù) main() ,所有簡單的程序都可以定義其他額外的函數(shù)
    2022-04-04
  • Qt使用隨機驗證碼的實現(xiàn)示例

    Qt使用隨機驗證碼的實現(xiàn)示例

    有時候在登錄界面需要驗證碼功能,這樣能夠防止被惡意程序攻擊,本文主要介紹了Qt使用隨機驗證碼的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Visual Studio 2022 Preview 使用 C++20 Module的詳細過程

    Visual Studio 2022 Preview 使用 C++20 Module的詳細過程

    這篇文章主要介紹了Visual Studio 2022 Preview 使用 C++20 Module的過程,本文通過項目分析實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • C語言實現(xiàn)自動發(fā)牌程序

    C語言實現(xiàn)自動發(fā)牌程序

    這篇文章主要介紹了利用C語言實現(xiàn)自動發(fā)牌程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • c++中cin實現(xiàn)輸入字符串方式

    c++中cin實現(xiàn)輸入字符串方式

    這篇文章主要介紹了c++中cin實現(xiàn)輸入字符串方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言字母轉換大小寫的3種方法圖文詳解

    C語言字母轉換大小寫的3種方法圖文詳解

    我們在C語言入門的時候都會遇到要求寫大小寫轉換的題目,所以下面這篇文章主要給大家介紹了關于C語言字母轉換大小寫的3種方法,文中給了詳細的代碼示例,需要的朋友可以參考下
    2023-10-10
  • c++之解決char轉string時出現(xiàn)的亂碼問題

    c++之解決char轉string時出現(xiàn)的亂碼問題

    這篇文章主要介紹了c++之解決char轉string時出現(xiàn)的亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言變長數(shù)組使用詳解

    C語言變長數(shù)組使用詳解

    這篇文章主要介紹了C語言變長數(shù)組使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論