📜  我们可以在不使用成员或好友函数的情况下访问类的私有数据成员吗?

📅  最后修改于: 2021-05-26 01:49:55             🧑  作者: Mango

封装的思想是将数据和方法(对数据起作用)捆绑在一起,并限制对类外部私有数据成员的访问。在C++中,朋友函数或朋友类也可以访问私有数据成员。

是否可以在没有朋友的情况下访问班外的私人成员?
是的,可以使用指针。请参见以下程序作为示例。

#include 
using namespace std;
  
class Test {
private:
    int data;
  
public:
    Test() { data = 0; }
    int getData() { return data; }
};
  
int main()
{
    Test t;
    int* ptr = (int*)&t;
    *ptr = 10;
    cout << t.getData();
    return 0;
}
输出:
10

范例2:

/*Program to initialize the private members and 
display them without using member functions.*/
  
#include 
using namespace std;
  
class A {
private:
    int x;
    int y;
};
  
int main()
{
    A a;
    int* p = (int*)&a;
    *p = 3;
    p++;
    *p = 9;
    p--;
    cout << endl
         << "x = " << *p;
    p++;
    cout << endl
         << "y = " << *p;
}
输出:
x = 3
y = 9

解释:
在上面的程序中,a是类A的对象。通过类型转换将对象的地址分配给整数指针p。指针p指向私有成员x。整数值分配给* p,即x。对象a的地址增加,并且通过访问存储器位置值9分配给y。 p–语句设置x的存储位置。使用cout语句将显示包含x的内容。

范例3:

/*Program to initialize and display
private members using pointers.*/
#include 
using namespace std;
  
class A {
private:
    int x;
    int y;
};
  
class B : public A {
public:
    int z;
  
    void show(int* k)
    {
        cout << "x = " << *k << " y = " 
            << *(k + 1) << " z = " << *(k + 2);
    }
};
  
int main()
{
    B b; // object declaration
    int* p; // pointer declaration
    p = &b.z; // address of z is assigned to p
    *p = 3; // initialization of z
    p--; // points to previous location
    *p = 4; // initialization of y
    p--; // points to previous location
    *p = 5; // initialization of x
    b.show(p); // passing address of x to function show()
  
    return 0;
}
输出:
x = 5 y = 4 z = 3

/ *此代码由Shubham Sharma提供。* /

请注意,上述访问私有数据成员的方法根本不是推荐的访问成员的方法,并且永远不应使用。同样,这并不意味着封装在C++中不起作用。建立私人成员的想法是为了避免意外更改。以上对数据的更改并非偶然。这是故意编写的代码来愚弄编译器。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”