1. 程式人生 > >C++之訪問控制(public、private、protected以及friend)

C++之訪問控制(public、private、protected以及friend)

public  所有均可訪問
private 類自己的成員函式訪問,不能被類物件訪問

protected 類自己以及子類訪問,不能被類物件訪問

friend 友元,別人是你的朋友,他可以訪問我的東西。(但不是我可以訪問他的東西)

  • 友元關係不能被繼承。
  • 友元關係是單向的,不具有交換性。若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的宣告。
  • 友元關係不具有傳遞性。若類B是類A的友元,類C是B的友元,類C不一定是類A的友元,同樣要看類中是否有相應的申明 
  • 友元函式並不是類的成員函式,因此在類外定義的時候不能加上class::function name

例子1 

#include <iostream>

using namespace std;

class A {
private:
	int i;
public:
	A() {i = 0; cout <<"A::A"<<endl; }
	~A() {i = 0; cout <<"A::~A"<<i<<endl; }
	void set(int i) {this->i = i;}
	void g(A *q) { cout << q->i << endl; }
};

int main ()
{
	A a;
	A b;
	b.set(100);
	a.g(&b);   // 使用物件a的成員函式訪問物件b中的私有變數i,則不能通過物件直接訪問

	return 0;
}

結果


備註:

  • private,protected限制編譯時刻檢查,而不是執行檢查。一直編譯成二進位制,則不再受到此限制。
  • struct 預設許可權是public, class預設許可權是private
  • C++中,只有成員變數很簡單數量少才可能使用struct;一般使用class

例子2-protected

#include <iostream>

using namespace std;


class A {
public:
    int a = 1;
private:
    int b = 2;
protected:
    int c = 3;
};

class B: public A
{
public:
    void func()
    {
        std::cout << A::a << std::endl;    // 可通過A類訪問公有變數
//        std::cout << A::b << std::endl;  // 不能在B類中通過A類訪問私有變數
        std::cout << A::c << std::endl;    // 可通過A類訪問保護變數
    }
};


int main()
{
    B b;
    A a;
    cout << b.a << a.a << endl;   // 可通過A類變數訪問共有變數
//    cout << b.c << a.c << endl; // 不可通A過類變數訪問保護變數
    return 0;
}

注:

  • 類中省略public 等時,預設是private屬性
  • 繼承基類, 在基類前省略public 等時, 預設是protected屬性

例子3-友元函式,外部呼叫可訪問類的變數和方法

#include <iostream>
#include <math.h>

using namespace std;

class Point
{
public:
	Point(double xx, double yy) { x=xx; y=yy; }  //預設建構函式
	void Getxy();   //公有成員函式
	friend double Distance(Point &a, Point &b);  //友元函式
private:
	double x, y;
        int key = 101;
public:
        int kk = 102;
};

void Point::Getxy()
{
	cout<<key<<endl;  // 函式定義中訪問私有變數
}

double Distance(Point &a, Point &b)  // 友元定義,注意函式名前未加類宣告符
{
	double dx = a.x - b.x;
	double dy = a.y - b.y;
	return sqrt(dx*dx+dy*dy);
}

int main()
{
	Point p1(3.0, 4.0), p2(6.0, 8.0);
	p1.Getxy();
   
        // cout << p2.key << endl;    不能訪問私有變數
        // cout << Point::key << endl;  不能訪問非靜態變數

        cout << p2.kk << endl;
	double d = Distance(p1, p2);   // 友元訪問
	cout<<"Distance is: "<<d<<endl;

	return 0;
}

結果:


例子4-友元類,外部呼叫可訪問類的變數和方法

當一個類作為另一個類的友元時,它的所有成員函式都是另一個類的友元函式,都可以訪問另一個類的私有或者公有成員

友元作為引數與使用類指標作為引數的區別在於,友元可以訪問類的私有成員

#include <iostream>  
#include <cstring>  
using namespace std ;  
//宣告教師類   
class Techer ;  
//學生類   
class Student   
{  
    private:  
        string name ;  
        int age ;     
        char sex ;   
        int score ;   
    public :  
        Student(string name , int age , char sex , int score);  
        void stu_print(Techer &tech);  
};  
//教師類   
class Techer  
{  
    private:  
        string name ;  
        int age ;     
        char sex ;   
        int score ;   
    public :  
        Techer(string name , int age , char sex , int score);  
        //宣告一個友元類  
        friend Student ;     
};  
  
//Student類的建構函式的實現   
Student::Student(string name , int age , char sex , int score)  
{  
    this->name = name ;   
    this->age = age ;   
    this->sex = sex ;   
    this->score = score ;  
}  
//Techer類的建構函式的實現  
Techer::Techer(string name , int age , char sex , int score)  
{  
    this->name = name ;   
    this->age = age ;   
    this->sex = sex ;   
    this->score = score ;  
}  
  
//列印Student類中的私有成員和Techer的私有成員   
void Student::stu_print(Techer &tech)  
{  
    //用this指標訪問本類的成員   
    cout << this->name << endl ;   
    cout << this->age << endl ;   
    cout << this->sex << endl ;   
    cout << this->score << endl ;  
    //訪問Techer類的成員   
    cout << tech.name << endl ;  
    cout << tech.age << endl ;   
    cout << tech.sex << endl ;   
    cout << tech.score << endl ;  
}  
  
int main(void)  
{  
    Student stu1("YYX",24,'N',86);  
    Techer t1("hou",40,'N',99);  
    stu1.stu_print(t1);  
    return 0 ;  
}
結果


備註:

  • 運算子過載經常使用friend
  • friend寫在類宣告中,一旦類實現完成,則不能再新增friend
  • friend的授權在編譯期

相關推薦

C++訪問控制publicprivateprotected以及friend

public  所有均可訪問private 類自己的成員函式訪問,不能被類物件訪問protected 類自己以及子類訪問,不能被類物件訪問friend 友元,別人是你的朋友,他可以訪問我的東西。(但不是我可以訪問他的東西)友元關係不能被繼承。友元關係是單向的,不具有交換性。若

Swift - 協議類擴展extension 訪問控制fileprivate,private,internal,public,open

string ext 定義 新的 不可 mov extension 腳本 () 1,Swift中協議類似於別的語言裏的接口,協議裏只做方法的聲明,包括方法名、返回值、參數等信息,而沒有具體的方法實現。 protocol Person { //讀寫屬性 v

C#基礎篇①VS快捷鍵WriteLine()與Write()區別ReadKey()與ReadLine()區別double,float,decimal區別

     今天我們來分享一下VS視訊中第一講內容,這篇內容主要分享的是VS工具的使用以及簡單的資訊顯示、變數宣告。 一、導圖類: 二、程式碼類 2.1、顯示資訊 Console.WriteLine("************

C++ 多型非常非常重要,重點在後面

開發十年,就只剩下這套架構體系了! >>>   

Apache基礎服務Web訪問控制身份驗證虛擬目錄虛擬主機

火墻 不同 14. cfa 防火 控制 根據 主機名訪問 a20 Apache HTTP server之所以受到眾多企業的青睞,得益於其代碼開源、跨平臺、功能模塊化、可靈活定制等諸多優點,其不僅性能穩定,在安全性方面的表現也十分的出色。接下來我們通過Apache搭建網站來學

C# 成員預設訪問許可權(publicprivateprotectedinternal)

1.C#五個修飾符的許可權修飾符    級別    適用成員        解釋public    公開    類及類成員的修飾符   對訪問成員沒有級別限制private     私有    類成員的修飾符     只能在類的內部訪問protected   受保護的    類成

訪問控制publicprivateprotected以及friend

https://blog.csdn.net/Tostick/article/details/80685482  public  所有均可訪問private 類自己的成員函式訪問,不能被類物件訪問 protected 類自己以及子類訪問,不能被類物件訪問 friend 友元,別人是你的

C#中五種訪問修飾符作用範圍 publicprivateprotectedinternalprotected internal

在C#語言中,共有五種訪問修飾符:public、private、protected、internal、protected internal。作用範圍如下表:訪問修飾符 說明public 公有訪問。不受任何限制。private 私有訪問。只限於本類成員訪問,子類,例項都不能訪

C# 訪問修飾符 publicprivateprotectrdinternalprotected internal 訪問許可權

 訪問修飾符   許可權說明  private     私有成員,在類的內部才可以訪問  protected   保

maven生成javadoc 如何設定訪問級別publicprotectedpackageprivate

相信很多初次使用maven生成javadoc的時候都遇到生成的文件訪問級別都是public,百度上面根本找不到如何配置訪問級別的例子,都是一些如何使用的示例。 其實官網API中是有介紹的test-javadoc 但是官網並沒有示例,並不知道怎麼配置。我對

Cisco訪問控制列表ACL

cisco acl 訪問控制列表(ACL)是應用在路由器接口的指令列表(即規則),這些規則表用來告訴路由器,哪些數據包可以接收,哪些包需要拒絕。其基本原理如下:ACL使用包過濾技術,在路由器上讀取OSI七層模型的第三層和第四層包頭中的信息,如源地址、目的地址、源端口、目的端口等,根據預先定義的規則,對包

lamp-配置防盜鏈訪問控制Directory針對目錄訪問控制針對單文件

lamp 訪問控制 防盜鏈 directory 配置防盜鏈 防止服務器的圖片和其他資源被非本機的站點引用,被其他網站引用後會導致流量圖片的用戶的數量暴增,而帶寬流量增加、增加站點的成本; 編輯虛擬配置文件 vim /usr/local/apache2.4/conf/extra/httpd-vh

C++快速入門---訪問控制12

C++快速入門---訪問控制(12)   訪問控制:C++提供了一種用來保護類裡的方法和屬性的手段。 這裡所說的保護意思是對誰可以呼叫某個方法和訪問某個屬性加上一個限制。如果某個物件試圖呼叫一個它無權訪問的函式,編譯器將報錯。   C++的訪問級別:

Java教程33—Java 訪問修飾符publicprivateprotected和default

在練習java程式時,你必須看過public、private、protected關鍵字,這些被稱為訪問修飾符。 訪問修飾符是對另一個類中的類,建構函式,資料成員和方法的訪問進行一定的限制。 在java中我們有四個訪問修飾符: default private pro

C++的public繼承中的publicprivateprotected

    C++語言是對C語言的一種增強,而其主要貢獻在於,為C語言增加了類和模板等功能,可以幫助實現面對物件程式設計和程式碼複用等更方便的功能。     在C++語言的類,一般都包含兩種成員,分別是成員變數和成員函式。成員變數可以用來表示該類的某些狀態,而成員函式則可以用來

C#基礎篇④程式三大結構:順序分支迴圈,for迴圈與while迴圈的轉換,C#乘法表

     今天我們來分享一下VS視訊中第四講的內容,這篇文章我們會簡單分享一下程式中的三大結構,重點分享我們的迴圈體結構。 一、程式中的三大結構 順序結構、分支結構、迴圈結構 【順序結構】 程式中的各個操作是按照它們在原始碼中的排列順序依次執行的,如下圖

C#基礎篇③邏輯關係運算符if....else語句ReadKey()不顯示輸入內容的退出

       今天我們來分享一下VS視訊中第三講內容,這篇文章繼續擴充C#中的運算子:邏輯運算子以及關係運算符,並對三大結構中的分支結構進行初步梳理。 一、導圖類 C#符號在原有導圖基礎上的擴充與整合。 二、程式碼類  ①、邏輯

C#基礎篇②變數轉義符運算子型別轉換++先加後加

      今天我們來分享一下VS視訊中第二講的內容,這篇文章主要分享的是C#語言的語法部分:變數的語法規則,C#中的轉義符、運算子、預算表達式,C#中的型別轉換方式。 一、問題類(此部分純屬個人理解,如有不足還望指正) ①、什麼是轉義字元? 一些字母前加“

【Solidity】internalprivateexternalpublic區別測試後整理

public與private 對於public和private,相信學過其他主流語言的人都能明白: public修飾的變數和函式,任何使用者或者合約都能呼叫和訪問。 private修飾的變數和函式,只能在其所在的合約中呼叫和訪問,即使是其子合約也沒有許可權訪問。 external和i

訪問修飾符 publicprivate Access Control

可見性: visibility   private : 不可被外部訪問,即不可見(invisible)   public : 可被外部訪問的,即可見(visible)   java習慣將屬性設定為 private,當要訪問某個屬性時,新增一個getter方法,當要設定屬性值時,新增一個set