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

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