C++静态空指针

C++ static null pointer

本文关键字:空指针 静态 C++      更新时间:2023-10-16

我无法弄清楚以下情况:我有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 类型的静态点。我以以下方式开始主要:

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

我得到的输出是

//0xaeed70
//0

那么为什么AA::i不等于i呢?

BB::setI

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

你想要的可能是按引用传递的,即

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

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

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

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

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

无论其类型如何,如果希望函数修改对象,都需要向它传递对该对象的引用(或指针(;不能传递对象的值。