在 C++ 中訪問私有變數

Anam Javed 2023年1月30日 2022年7月12日
  1. 在 C++ 中訪問私有變數
  2. 使用成員函式訪問 C++ 中的私有變數
  3. 使用 friend 函式訪問 C++ 中的私有變數
  4. 使用指標訪問 C++ 中的私有變數
  5. まとめ
在 C++ 中訪問私有變數

本文討論 C++ 私有變數以及如何在 C++ 中訪問它們。

在 C++ 中訪問私有變數

封裝保護敏感和重要資料免受未經授權的使用者的侵害。private 關鍵字用於實現這種現象。

除了封裝之外,資料隱藏的概念也在 C++ 中實現。在 C++ 中用 private 關鍵字宣告的變數表明它只能由其類的成員函式訪問。

任何物件或函式都不能直接訪問它。

#include <iostream>
using namespace std;

class shape
{
    private:
        double r;

    public:
    void area(double rr)
    {
        r = rr;

        double ar = 3.14*r*r;

        cout << "Radius is: " << r << endl;
        cout << "Area is: " << ar;
    }

};

int main()
{
    shape obj;
    obj.area(1.5);

    return 0;

}

輸出:

Radius is: 1.5
Area is: 7.065

除了類的 friend 函式或成員函式外,沒有實體可以訪問類的私有資料成員。這裡,變數 r 由類 area() 的成員函式訪問。

area() 函式通過訪問類的私有資料成員來計算圓的面積。並且類的物件是在類的主函式中建立的。

通過該物件訪問類成員函式,計算圓的面積。

friend 函式本身並不是訪問私有資料成員的方式。除此之外,還可以使用指標在類外部訪問私有變數。

這種使用指標訪問私有資料成員的方法是 C++ 中的一個漏洞。請繼續閱讀以瞭解更多資訊。

使用成員函式訪問 C++ 中的私有變數

C++ 中的私有成員變數或函式不能在類外部訪問或看到。C++ 的主要概念是其獨特的資料安全特性。

私有資料成員只能由建立它的類及其類的 friend 函式訪問。

關注下面的例子,瞭解類的成員函式如何訪問資料成員。

#include <iostream>
using namespace std;

class Emp {
  private:
    int sal;

  public:
    void setSal(int s) {
      sal = s;
    }

    int getSal() {
      return sal;
    }
};

int main() {
  Emp myObj;
  myObj.setSal(50000);
  cout << myObj.getSal();
  return 0;
}

輸出:

50000

在上面的程式中,類 emp 有私有成員和公共成員。sal 是兩個類成員函式可以訪問的私有變數:setSal()getSal()

setSal() 正在初始化私有資料成員 sal 的值,而 getSal() 返回私有資料成員 sal 的值。最後,在 main 方法中,建立了類的物件。

物件 myObj 訪問類的成員函式 setSal(),以將值傳遞給私有資料成員 sal。最後,類物件訪問 getSal() 返回 sal 資料成員。

預設情況下,一個類的所有成員都是私有的;例如,在下面的類中,w 是一個私有成員。因此,在你將成員標記為公共或受保護之前,它將被視為私有資料成員。

class B {
   double w;

   public:
      double len;
      void setW( double wid );
      double get( void );
};

實時的,資料定義在私有區域,成員函式在公共區域從類外呼叫,如下程式所示。

#include <iostream>

using namespace std;

class B {
   public:
      double len;
      void setW( double wid );
      double getW( void );

   private:
      double w;
};

double B::getW(void) {
   return w ;
}

void B::setW( double wid ) {
   w = wid;
}

int main() {
   B box;

   box.len = 10.0;
   cout << "Length: " << box.len <<endl;

   box.setW(10.0);
   cout << "Width: " << box.getW() <<endl;

   return 0;
}

在上面的程式中,類 B 有私有成員和公共成員。這裡,w 是兩個類成員函式可以訪問的私有變數:setW()getW()

setW() 初始化私有資料成員 w 的值,getW() 返回私有資料成員 w 的值。物件框訪問類的成員函式。

公共變數 len 可通過物件框訪問並使用值進行初始化。setW() 將給定值分配給私有資料成員 w

最後,類物件框訪問 getW() 以返回 w 資料成員。

輸出:

Length: 10
Width: 10

使用 friend 函式訪問 C++ 中的私有變數

friend 函式位於類的私有或公共部分。它可以在不使用物件的情況下被稱為普通成員函式。

類物件不呼叫它,因為它不在類的範圍內。此外,它不能直接訪問類的私有和受保護資料成員。

friend 函式使用類的物件並使用點運算子訪問成員。它可以是全域性函式或另一個類的成員。

#include <iostream>
using namespace std;

class Dist {
    private:
        int m;

        friend int add(Dist);

    public:
        Dist() : m(0) {}

};

int add(Dist d) {

    d.m += 5;
    return d.m;
}

int main() {
    Dist D;
    cout << "Distance: " << add(D);
    return 0;
}

輸出:

Distance = 5

在上面的程式中,我們可以看到一個帶有私有成員 m 的類 Dist。我們有一個公共建構函式來初始化 m 的值。

然後,有一個 friend 函式 add(),它使用 m 計算距離。add() 是一個 friend 函式,它不在類的範圍內。

在 main 方法中,建立類的一個物件並傳遞 add() 函式。add() 函式計算距離並顯示結果。

C++ 中的 friend

friend 類就像可以建立的 friend 函式。friend 類可以訪問與它成為朋友的類的祕密和受保護成員。

friend 函式類似,還有一個 friend 類。它可以訪問它是朋友的私有和受保護的類成員。

語法:

class X{

Data members;
Member Functions;

friend class Y;

};

class B{
……..
};

如語法所示,類 X 是類 Y朋友。這意味著類 Y 可以訪問類 X 的私有成員和受保護成員。

但是這種友誼不是相互的,並且類 X 不能訪問類 Y 的私有和受保護成員。我們必須將類 X 指定為類 Y朋友

此外,友誼不是繼承的,所以類 Y 不會是類 X 的子類的朋友

C++ 中 friend 類的示例

#include <iostream>
#include <string>
using namespace std;
class Ar{
   int len,br,arr;

   public:

   Ar(int l,int b)
   {
    len = l;
    br = b;
   };

   void computeArea(){
      arr = len * br;
   }

   friend class prClass;

};
class prClass{

   public:
   void prAr(Ar &a){
      cout<<"Area = "<<a.arr;
   }
 };
int main(){
   Ar a(20,10);
   a.computeArea();
   prClass p;
   p.prAr(a);

   return 0;
}

輸出:

Area = 200

在上面的程式中,有兩個類。Ar 類使用 lenbr 變數計算面積。

此類具有三個私有資料成員:arrlenbr。建立的另一個類是 prClass,它列印由 Ar 類的成員函式 computeArea 計算的最終區域。

因為所有資料成員都是私有的,所以我們需要讓 prClass 成為 Ar 類的朋友 來列印結果。Ar 類物件在主函式內部建立。

面積計算完成,Ar 類的物件被傳遞給 prClass 函式。該函式稱為 prAr,用於顯示區域。

在 C++ 中使用 friend 函式訪問私有變數的缺點

C++ 最重要的特性是封裝,即一組資料和函式。資料成員和成員函式一起處理資料,因此沒有外部函式或類可以訪問資料。

由於允許 friend 函式或類訪問另一個類的私有成員,封裝特性受到損害。資料安全面臨危險。

使用指標訪問 C++ 中的私有變數

指標在沒有 friend 或類成員函式的情況下訪問資料。

#include <bits/stdc++.h>
using namespace std;

class Hello {
private:
    int c;
    int d;
};



int main()
{
    Hello a;
    int* q = (int*)&a;
    *q = 4;
    q++;
    *q = 5;
    q--;
    cout << endl << "c = " << *q;
    q++;
    cout << endl << "d = " << *q;
    return 0;
}

輸出:

c = 4
d = 5

在上面的程式中,a 是類 Hello 的物件。類物件 a 地址通過型別轉換分配給整數指標 q

指標 q 然後指向私有成員 c。整數值分配給*q,即 c

然後物件 a 的地址增加,並通過訪問記憶體位置值 5 分配給 dq-- 語句設定 c 的記憶體位置。

使用 cout 語句,顯示 c

まとめ

在本文中,我們討論了在 C++ 中訪問私有變數。我們瞭解了在 C++ 中訪問私有成員的各種方法。

此外,通過大量示例,我們討論了 C++ 中的 friend 函式和指標的概念。一件重要的事情是不能在成員函式也是私有的類中建立物件。

牢記這一點,我們希望你喜歡閱讀本文。請繼續關注更多內容豐富的文章。