我知道只能通过set和get-methods间接访问该类的成员。以下C ++程序的输出是什么?为什么这可能?有人可以向我解释为什么这是一个糟糕的编程风格?
#include <iostream>
using std::cout;
using std::endl;
class Test
{
private:
int N;
public:
void setN(int N_in) { N = N_in; };
int getN(){ return N; };
int* getptrN(){ return &N; };
};
int main()
{
Test A;
A.setN(5);
int* ptr = A.getptrN();
cout << A.getN() << endl;
*ptr = 10;
cout << ptr << endl;
cout << A.getN() << endl;
return 0;
}
答案 0 :(得分:0)
public
,protected
和private
访问说明符适用于成员名称。它们允许您指定类名的用户可以使用哪些数据和函数。如果在运行时通过其他方式(例如通过指针或引用)授予对变量或函数的访问权限,则编译时访问说明符不再起作用。
封装的基本思想是,您希望对象在您尝试解决的问题中表示值,并且您希望这些值始终有意义。您可以限制对象可以拥有的状态,以便该对象只能表示有意义的状态。
例如,长度为负数没有意义,因此假定setLength
成员函数在给定负参数值时永远不会成功。
通过授予对对象成员的无限制访问权限,允许以不一定产生有效状态的方式对其进行修改,这可能会使您的程序行为不正确。如果x
假设其长度只是非负数,但您说*x.getPtrLength() = -1;
,则所有投注均已关闭。
答案 1 :(得分:0)
public
,private
尝试将封装概念引入我们的代码。这个概念有助于将课堂内发生的事情与外界分开。这并不意味着您无法访问对象的内存空间。因为您已经创建了Test对象的实例,所以您可以访问它;你只需要内部变量的地址(由return &N
提供)。
答案 2 :(得分:-1)
我不确定我完全理解您的问题(您在代码中看到的问题究竟是什么),但您需要在public:
和private:
上刷新内存。