封装的思想是将数据和方法(对数据起作用)捆绑在一起,并限制对类外部私有数据成员的访问。在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等的更多准备工作,请参阅“完整面试准备课程” 。