在 C++ 中訪問私有變數

Anam Javed 2023年10月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 函式和指標的概念。一件重要的事情是不能在成員函式也是私有的類中建立物件。

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