迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

在 C++ 中访问私有变量

作者:迹忆客 最近更新:2023/03/15 浏览次数:

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

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C++ 中通过掷骰子生成随机值

发布时间:2023/04/09 浏览次数:169 分类:C++

本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。

在 C++ 中使用模板的链表

发布时间:2023/04/09 浏览次数:158 分类:C++

本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。

在 C++ 中添加定时延迟

发布时间:2023/04/09 浏览次数:142 分类:C++

本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。

在 C++ 中创建查找表

发布时间:2023/04/09 浏览次数:155 分类:C++

本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。

如何在 C++ 中把字符串转换为小写

发布时间:2023/04/09 浏览次数:63 分类:C++

介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码

如何在 C++ 中确定一个字符串是否是数字

发布时间:2023/04/09 浏览次数:163 分类:C++

本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便