在 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 函数和指针的概念。一件重要的事情是不能在成员函数也是私有的类中创建对象。

牢记这一点,我们希望你喜欢阅读本文。请继续关注更多内容丰富的文章。