通过指针更改私有数据成员是不可能的?

时间:2017-03-04 16:37:53

标签: c++ class pointers

我试图通过指针访问数据成员,所以我写了这段代码:

#include <iostream>
#include <string>

using namespace std;

class test{
public:
    int * returnAdd();
    int getA();
    void setmember(int x);
private:
    int a;
};

int *test::returnAdd()
{
    return &a;
}

int test::getA()
{
    return a;
} 

void test::setmember(int x)
    {
        a = x;

        return;
    }

int main(void)
{
    test test1;

    int *a = test1.returnAdd();
    test1.setmember(12);
    *a++;
    cout << test1.getA() << endl;
    cout << *a << endl;

    return 0;
}

我希望数据成员(a)的值会变为13但不会发生。然后我打印了* a的值,我就是垃圾。 我想知道为什么数据成员的值不会改变,而a指向它的位置?为什么* a包含垃圾,甚至不包含数据成员a的值的复制品

4 个答案:

答案 0 :(得分:4)

作为operator precedence的结果,在取消引用++之前执行后增量运算符a。因此,post increment operator返回的原始表达式a被解除引用。

同时a递增以指向下一个不存在的相邻内存。下次取消引用时,a将调用未定义的行为。

你可能想要:

(*a)++;

Demo

答案 1 :(得分:2)

*a++;并不意味着:

  1. 取消引用a
  2. 增加它(a指出的内容)
  3. *a++;表示:

    1. 取消引用a
    2. 增加指针a
    3. 使用(*a)++;增加指向的内容。

答案 2 :(得分:0)

您正在移动指针,然后从中读取。试试(*a)++;

答案 3 :(得分:-2)

它是私人的,所以你想得到它

尝试编写一个为您执行此操作的成员函数

void test::add_one(void)
{
++a;
}

始终寻找简单的方法 希望这有帮助

相关问题