在 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 函数和指针的概念。一件重要的事情是不能在成员函数也是私有的类中创建对象。
牢记这一点,我们希望你喜欢阅读本文。请继续关注更多内容丰富的文章。
相关文章
Arduino 复位
发布时间:2024/03/13 浏览次数:315 分类:C++
-
可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。
Arduino 的字符转换为整型
发布时间:2024/03/13 浏览次数:181 分类:C++
-
可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。
Arduino 串口打印多个变量
发布时间:2024/03/13 浏览次数:381 分类:C++
-
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。

