友元 java_C++ 友元關系詳解

在C++中,在某些情況下,允許特定的非成員函數訪問一個類的私有成員,同時仍然阻止一般的訪問,這是很方便做到的。例如,被重載的操作符,如輸入或輸出操作符,經常需要訪問類的私有數據成員。這些操作符不可能為類的成員。然而,盡管不是類的成員,它們仍是類的“接口的組成部分”。

而友元機制,允許一個類將對其非公有成員的訪問權授予指定的函數或類。友元的聲明以關鍵字 friend 開始。它只能出現在類定義的內部。友元聲明可以出現在類中的任何地方:友元不是授予友元關系的那個類的成員,所以它們不受聲明出現部分的訪問控制影響。

下面給出C++中所有有關友元的結論和限制,然后后面針對每個細節給出示例:

1、友元關系:

1.1將一個非成員函數reset()聲明為類example的友元函數,使得該非成員函數可以訪問類example的私有成員。

class example; // 這里必須對類 example 做前向聲明,否則下面的函數聲明將報錯

void reset(example &e);

class example

{

public:

friend void reset(class example &e);

private:

int n;

};

// 該函數定義必須放在類 example 的后面,否則無法解析變量n

void reset(example &e)

{

e.n = 0;

}

1.2 將類man聲明為類woman的友元類,使得可以通過類man對象訪問類woman的私有成員。

class woman; // 前向聲明

class man

{

public:

void disp(woman &w);

void reset(woman &w);

};

class woman

{

public:

friend class man; // 將man設為woman的友元類,這樣man對象的任何成員函數都可以訪問woman的私有成員

private:

string name;

};

void man::disp(woman &w)

{

cout << w.name << endl;

}

void man::reset(woman &w)

{

w.name.clear();

}

1.3 將一個類Y的某成員函數聲明為類X的友元函數,使得可以通過類Y的這個成員函數訪問類X的私有成員。

class woman; // 前向聲明

class man

{

public:

void disp(woman &w);

void reset(woman &w);

};

class woman

{

public:

friend void man::disp(woman &w); // 將man的其中一個成員函數disp()設為woman的友元函數,就可以使用該函數訪 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 問woman對象的私有成員了

private:

string name;

};

void man::disp(woman &w)

{

cout << w.name << endl;

}

// man的reset()成員函數不是woman類的友元函數,因此不能訪問其私有成員

/*

void man::reset(woman &w)

{

w.name.clear();

}

*/

2、友元作用域

注意到上面的示例代碼,友元聲明和友元定義之間的依賴關系:比如最后一個例子,由于woman類要聲明man類中的成員函數disp為友元函數,因此必須將man類的定義放在woman之前。但是man類中又要對woman類中的數據成員進行操作,所以必須將disp函數的定義放在woman的后面。這個關系要搞清楚,否則編譯不成功。

3、友元跟重載函數的關系

如果有多個重載函數的版本,那么可以將其中的一個或者幾個設為某個類的友元。其他的函數不受此設置的影響,依然不能訪問某類的私有數據成員。例如:

#include

#include

#include

using namespace std;

class screen;

void show(const screen &s);

void show(int, int, const screen &);

class screen

{

public:

screen():x(0.0), y(0.0){}

friend void show(const screen &s);

friend void show(int a, int b, const screen &s); // 如果將此行刪除,將無法調用該版本的show函數

private:

float x;

float y;

};

void show(const screen &s)

{

cout << s.x << ", " << s.y << endl;

}

void show(int a, int b, const screen &s)

{

cout << s.x + a << ", " << s.y + b << endl;

}

int main(void)

{

screen s;

show(s);

show(100, 200, s);

string word;

getline(cin, word);

return 0;

}

4、友元跟權限標識符的關系

實際上,一個類的友元,不管是友元類、友元成員函數還是友元非成員函數,都必須是public訪問權限的,否則無法在類外被調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388779.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Matplotlib中的“ plt”和“ ax”到底是什么?

Indeed, as the most popular and fundamental data visualisation library, Matplotlib is kind of confusing in some perspectives. It is usually to see that someone asking about的確&#xff0c;作為最受歡迎的基礎數據可視化庫&#xff0c;Matplotlib在某些方面令人困…

【數據庫的備份與還原】 .

差異備份,日志備份還原 IF DB_ID(db) IS NOT NULL DROP DATABASE db GO CREATE DATABASE db GO CREATE TABLE db.dbo.T(ID INT PRIMARY KEY IDENTITY(1,1)); GO BACKUP DATABASE db TO DISKd:/1.bak WITH FORMAT GO INSERT INTO db.dbo.T DEFAULT VALUES GO BACKUP DATAB…

方法 數組

方法的特點: 定義方法可以將功能代碼進行封裝 封裝:兩方面含義: 1.將有特定邏輯的多條代碼組合成一個整體!! 2.方便維護&#xff0c;提高代碼的復用性(聯想變量的作用域問題) 方法只有被調用才會被執行!!(方法調用的流程) 方法的重載: 兩同一不同: 同類,同方法名 形參列表不同 …

java 控制jsp_JSP學習之Java Web中的安全控制實例詳解

普通用戶界面修改登錄的Servlet&#xff0c;修改后的代碼如下&#xff1a;LoginProcess.java代碼&#xff1a;package servlet;import javabean.User;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.Ser…

PHP 基礎 自動類型轉換之比較運算符

<?php var_dump( 123fg456>122); var_dump(some string 0); var_dump(123.0 123d456); var_dump(0 "a"); var_dump("1" "01"); var_dump("1" "1e0"); 當數字與字符串進行比較運算時&#xff0c;字符串會自動轉…

java的多線程訪問共享變量_java多線程通信之共享變量

(1)當訪問共同的代碼的時候&#xff1a;可以使用同一個Runnable對象&#xff0c;這個Runnable對象中有這個共享數據&#xff0c;比如賣票系統就可以這么做。或者這個共享數據封裝在一個對象當中&#xff0c;然后對這個對象加鎖&#xff0c;也可以實現數據安全訪問。public clas…

2018年阿里云NoSQL數據庫大事盤點

2019獨角獸企業重金招聘Python工程師標準>>> NoSQL一詞最早出現在1998年。2009年Last.fm的Johan Oskarsson發起了一次關于分布式開源數據庫的討論&#xff0c;來自Rackspace的Eric Evans再次提出了NoSQL概念&#xff0c;這時的NoSQL主要是指非關系型、分布式、不提供…

cayenne:用于隨機模擬的Python包

TL;DR; We just released v1.0 of cayenne, our Python package for stochastic simulations! Read on to find out if you should model your system as a stochastic process, and why you should try out cayenne.TL; DR; 我們剛剛發布了 cayenne v1.0 &#xff0c;這是我們…

java 如何將word 轉換為ftl_使用 freemarker導出word文檔

近日需要將人員的基本信息導出&#xff0c;存儲為word文檔&#xff0c;查閱了很多資料&#xff0c;最后選擇了使用freemarker&#xff0c;網上一共有四種方式&#xff0c;效果都一樣&#xff0c;選擇它呢是因為使用簡單&#xff0c;再次記錄一下,一個簡單的demo&#xff0c;僅供…

DotNetBar office2007效果

1.DataGridView 格式化顯示cell里的數據日期等。 進入編輯列&#xff0c;選擇要設置的列&#xff0c;DefaultCellStyle里->行為->formart設置 2.tabstrip和mdi窗口的結合使用給MDI窗口加上TabPage。拖動個tabstrip到MDI窗口上tabstrip里選擇到主窗口名就加上TABPAGE了。d…

Spring boot 中pom.xml 各個節點詳解

<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <!-- 父項目的坐…

spotify 數據分析_沒有數據? 沒問題! 如何從Wikipedia和Spotify收集重金屬數據

spotify 數據分析For many data science students, collecting data is seen as a solved problem. It’s just there in Kaggle or UCI. However, that’s not how data is available daily for working Data Scientists. Also, many of the datasets used for learning have …

stack 的一些用法

#include<bits/stdc.h> using namespace std; int32_t main() {stack<int> st;st.push(1);st.push(2);st.push(3);cout<<st.size()<<endl;while(!st.empty()){cout<<st.top()<<endl;st.pop();} } 轉載于:https://www.cnblogs.com/Andromed…

IS環境下配置PHP5+MySql+PHPMyAdmin

IIS環境下配置PHP5MySqlPHPMyAdmin Posted on 2009-08-07 15:18 謝啟祥 閱讀(1385)評論(18) 編輯 收藏 雖然主要是做.net開發的&#xff0c;但是&#xff0c;時不時的還要搞一下php&#xff0c;但是&#xff0c;php在windows下的配置&#xff0c;總是走很多彎路&#xff0c;正好…

js復制功能

<div id"cardList"><div class"btn" onClick"copy(111)">點擊我&#xff0c;復制我</div></div> <script type"text/javascript"> function copy(str){var save function (e){e.clipboardData.setDa…

input在iOS里的兼容性

input框在iOS里&#xff0c;無法聚焦&#xff0c;不能輸入內容&#xff0c;把-webkit-user-select:none改成-webkit-user-select:auto;或者直接加一個style“-webkit-user-select:auto”.

kaggle數據集_Kaggle上有170萬份ArXiv文章的數據集

kaggle數據集“arXiv is a free distribution service and an open-access archive for 1.7 million scholarly articles in the fields of physics, mathematics, computer science, quantitative biology, quantitative finance, statistics, electrical engineering and sys…

java用接口實例化對象_[求助]迷茫中,接口可以直接實例化對象嗎?

可能是我沒有寫完整吧,還是我沒有理解好1 接口public interface SetAndGetWeight{public void setW(double weight);public double getW();}2 類class Train{SetAndGetWeight[] things;public void Train(SetAndGetWeight[] things){this.thingsthings;}public void returnTota…

異常作業2(2018.08.22)

2、編寫程序接收用戶輸入分數信息&#xff0c;如果分數在0—100之間&#xff0c; 輸出成績。如果成績不在該范圍內&#xff0c; 拋出異常信息&#xff0c;提示分數必須在0—100之間。 要求&#xff1a;使用自定義異常實現1 import java.util.Scanner;2 3 class AtException ext…

深度學習數據集中數據差異大_使用差異隱私來利用大數據并保留隱私

深度學習數據集中數據差異大The modern world runs on “big data,” the massive data sets used by governments, firms, and academic researchers to conduct analyses, unearth patterns, and drive decision-making. When it comes to data analysis, bigger can be bett…