C ++静态空指针

时间:2018-01-11 10:04:45

标签: c++ pointers static

我无法弄清楚以下情况: 我有3个课程:

AA.h

class AA
{
   public:
   AA();
   static CC *i;
};

BB.h

class BB
{
  public:
  BB();
  void static setI(CC *i);
};

CC.h

class CC
{
  public:
  CC();
};

AA.cpp

AA::AA(){}
CC *AA::i= nullptr;

BB.cpp

BB::BB(){}

void BB::setI(CC *i)
{
  i = new CC();
  cout<<i<<endl;
  cout<<AA::i;
}

CC.cpp

CC::CC(){}

所以我在A类中有一个CC类型的静态pointe。 我以下列方式开始主攻:

int main(int argc, char *argv[])
{
    BB::setI(AA::i);
    return 0;
}

我得到的输出是

//0xaeed70
//0

为什么AA::i不等于i

3 个答案:

答案 0 :(得分:4)

BB::setI的参数类型为CC *i,指针本身按值传递,i从参数中复制。对函数内i的任何修改都与原始参数AA::i无关。

你想要的可能是传递参考,即

void BB::setI(CC *&i)
{
  i = new CC();
  cout<<i<<endl;
  cout<<AA::i;
}

答案 1 :(得分:1)

在表达式i = new CC()中,变量i是函数BB::setI的局部变量,它使用AA::i的值进行初始化,因为您调用的函数类似BB::setI(AA::i);。将任何值分配给i只会更改此局部变量的值,而不会更改在调用函数时用于初始化它的其他变量的值。

答案 2 :(得分:0)

与这个较小的例子完全相同:

int i = 0;

void setI(int x)
{
    x = 1234;
    cout << x << endl;
    cout << i;
}

int main()
{
    setI(i);
}

正如您在此处可以更清楚地看到的那样,您正在为函数的参数指定一个新值 此参数与AA的成员无关。

无论其类型如何,如果您想要一个函数来修改对象,您需要将一个引用(或指针)传递给该对象;你不能传递对象的价值。