C++ C++;编译器是否默认初始化指针?

C++ C++;编译器是否默认初始化指针?,c++,oop,pointers,initialization,C++,Oop,Pointers,Initialization,请参见下面的我的代码: class A { public: A() { i = 0; if(pt != NULL) { std::cout << "why" << std::endl; } } A(bool flag) { i = 0; pt = new B(3.14); } private: class B { public: B(double in

请参见下面的我的代码:

class A
{
 public:

  A()
  {
    i = 0;

    if(pt != NULL)
    {
      std::cout << "why" << std::endl;
    }
  }

  A(bool flag)
  {
    i = 0;
    pt = new B(3.14);
  }

 private:

  class B
  {

   public:
    B(double in) : j(in) {}

   private:
    double j;
  };

 private:

  int i;
  B *pt; 
};

int main(int argc, char *argv[])
{
  A obj; // place1

  int *p;

  if(p != NULL)
  {
    std::cout << "test2" << std::endl;
  }

  return 0;
}
A类
{
公众:
()
{
i=0;
如果(pt!=NULL)
{

p的值未定义。它可以是0、1、2或。。。。。。 因此,如果这是你的幸运日,你可能会得到一个打印,否则不会


寓意:不要依赖于你得到的,自己初始化变量。

指针在默认情况下不会初始化。你需要在构造函数(对于成员)或声明处(对于局部变量)初始化它

C++不会为您初始化实例变量。只要您不将它们设置为值,它们就会有一个随机值(或一些看起来像随机垃圾的值)

在这段代码中,我想知道pt是否会被初始化为@place1

它没有初始化为任何值。从技术上讲,它是默认初始化的,这对于指针意味着没有执行初始化。这意味着它可以保存任何值,从中读取是未定义的行为

在C++11中,如果您具有初始化obj的值,则
pt
将初始化为零:

A obj{}; // obj.pt is nullptr
另一个问题是,如果我删除obj的定义,test2将打印,否则不会打印,为什么

p
也有一个未确定的值。它可以是
NULL
,但可能不是。从中读取也是未定义的行为。因此,它有时可以取
NULL
的值,有时不取,并且您无法依赖可预测的行为

if(pt != NULL)
可能是真的,因为pt在代码中未初始化为NULL,它可以是任何值。程序员应将指针在代码中初始化为NULL。

你可以阅读相关的问题。了解它。

< P>根据C++标准,局部变量不是隐式初始化的。因此,在这个代码段

int main(int argc, char *argv[])
{
  // ...
  int *p;
  // ... 
int main(int argc, char *argv[])
{
  A obj; // place1
编译器不会隐式初始化p,因为p是一个局部变量。如果p具有静态存储持续时间,则可以将其初始化为零。例如

 int *p;

int main(int argc, char *argv[])
{
  // ... 
在此代码段中,变量p将被初始化为零

至于类A,那么在这个代码段中

int main(int argc, char *argv[])
{
  // ...
  int *p;
  // ... 
int main(int argc, char *argv[])
{
  A obj; // place1
对象obj将被默认初始化,该对象是将被调用的类的默认构造函数。由于未在构造函数中初始化数据成员pt,其值将未定义

同样,如果对象具有静态存储持续时间,那么首先,在调用默认构造函数之前,对象占用的内存将初始化为零。在这种情况下,pt将初始化为零

A obj;

int main(int argc, char *argv[])
{

正如[此处][1]所讨论的,指针在声明时没有初始化。[1]:静态变量和全局变量从init到0。自动变量包含垃圾,可能包含任何内容。
pt
的可能重复项也可以是
NULL
。@juanchopanza ya。它也可以是0,所以也可以是NULL。好的,谢谢。编译器为什么默认情况下不将指针初始化为NULL?@xunzhang它就是其中之一“你得到你所付的东西”。C++遵循C,允许你决定内置类型(在某些上下文中)。是零初始化的,因为你不想总是零初始化它们,而且这样做不是免费的。我不明白你的真正意思。编译器初始化每个指针为NULL,如果你想使用它,你自己初始化指针。这样有什么问题?@xunzhang初始化东西需要花费很多钱。这不是免费的。CPU周期必须花费有时你不需要花费这些周期。C++允许你不这样做。不完全正确。如果变量有静态存储持续时间,会发生什么?@ EDS。(假设内置或POD)。或者你的意思是静态的?…是的,我的意思是静态的,谢谢。多任务失败。@EdS。你说得对,我说得更清楚了,我说的是实例变量。与“指针”无关,与存储类有关。