2017-03-04 17 views
2

我试图通过一个指针来访问数据成员,所以我写这样的代码:通过指针更改私人数据成员是不可能的?

#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; 
} 

我想到的是数据成员的值(一)将成为13,但它不会发生。然后我打印了* a的值,而且我是垃圾。 我不知道为什么数据成员的价值没有改变,而一个指向它的位置?为什么* a包含垃圾,甚至没有数据成员a的值的副本?

+0

[推荐读](http://stackoverflow.com/a/18484907/7571258)。他很好地解释了'* a ++'(以及变体'* ++ a'和'++ * a')的表达实际上所做的。 – zett42

回答

2

*a++;并不意味着:

  1. 提领a
  2. 增加它(什么是a指向)

*a++;手段:

  1. 提领a
  2. 增量指针a

使用(*a)++;递增什么是指向。

0

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

4

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

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

你可能想:

(*a)++; 

Demo

+0

_因此你移动到下一个不存在的相邻内存,然后解除引用。其中调用了未定义的行为._ ...是不正确的。 '* a ++'的效果是指针'a'首先被解除引用然后递增。这[例子](http://coliru.stacked-crooked.com/a/fd98eb9e73f3da42)打印“1”,然后“2”。如果你的陈述是正确的,它会再次打印“2”和“2”。请参阅[这个答案](http://stackoverflow.com/a/18484907/7571258)一个很好的解释。 – zett42

+0

@ zett42。谢谢你指出。更正 – WhiZTiM

-2

所以你要得到它

尝试写一个成员函数,它为你

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

总是寻找最简单的方式 希望这有助于它是私人

+0

这不回答OP的问题。 –

相关问题