在 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
類使用 len
和 br
變數計算面積。
此類具有三個私有資料成員:arr
、len
和 br
。建立的另一個類是 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 分配給 d
。q--
語句設定 c
的記憶體位置。
使用 cout
語句,顯示 c
。
まとめ
在本文中,我們討論了在 C++ 中訪問私有變數。我們瞭解了在 C++ 中訪問私有成員的各種方法。
此外,通過大量示例,我們討論了 C++ 中的 friend
函式和指標的概念。一件重要的事情是不能在成員函式也是私有的類中建立物件。
牢記這一點,我們希望你喜歡閱讀本文。請繼續關注更多內容豐富的文章。