【问题标题】:What is this odd thing after the colon in a C++constructor definition? [duplicate]C++ 构造函数定义中冒号后面的这个奇怪的东西是什么? [复制]
【发布时间】:2011-06-24 09:43:42
【问题描述】:

可能重复:
What is this weird colon-member syntax in the constructor?

我需要知道这段代码的含义:

Cman::Cman() :
m_pThread (NULL)  //m_pThread is pointer to other class
{
}

我不太明白这段代码。 NULL 是什么意思? 我可以将它用作常规构造函数吗?

【问题讨论】:

标签: c++ constructor


【解决方案1】:

它说在执行构造函数内部的代码之前将m_pThread初始化为NULL。

【讨论】:

    【解决方案2】:

    这是Cman 类的默认构造函数。它将m_pThread 的值初始化为NULL,该值可能是指针类的私有成员。当NULL 没有指向任何有用的东西(而不是你无法测试的随机值)时,它被分配给一个指针。

    【讨论】:

      【解决方案3】:

      这是Cman 类的默认构造函数,它初始化一个名为m_pThread 的成员(它是一个指针),其值为NULL。在这种情况下,NULL 表示 nothingempty0,基本上它是一个无效的指针(它指向任何东西)。

      【讨论】:

        【解决方案4】:
        Cman::Cman() : m_pThread(NULL) { }
        

        : 之后的内容称为初始化列表。它用于初始化成员变量。所以语法m_pThread(NULL)NULL 初始化m_pThread。您可以使用它来初始化所有成员变量。

        例子,

        class Cman
        {
           Thread *m_pThread;
           int Duration;
           int MemorySize;
           public:
           Cman() : m_pThread(NULL), Duration(10000), MemorySize(9999)
           { 
           }  
        };
        

        记住,初始化赋值是有区别的。

        在这里阅读:Using Initialization Lists to Initialize Fields

        【讨论】:

          【解决方案5】:
          Cman::Cman() : m_pThread(NULL) { }
          

          完全等价于:

          Cman::Cman() { m_pThread = NULL; }
          

          NULL 本身就是null pointer

          【讨论】:

          • 在这种情况下是的,但在更复杂的情况下,当它是一个对象时,它不是。
          • @Mark Loeser 你能举个例子吗?
          • @Andrey:当然,如果您正在初始化的变量是一个对象(比如一个字符串),则该字符串将被默认构造,然后您将在构造函数中使用赋值运算符,而不是第一次用数据构建它。
          • 某些成员变量不能在构造函数体中初始化,必须使用成员初始化,例如没有默认构造函数的类类型的引用和成员。
          • @Mihran, @Andrey:对于原语,如指针或 int(等),它可能完全相同。使用初始化列表真正重要的时候是当你有常量成员,或者对默认构造很傻的成员,然后分配给而不是一开始就正确构造。
          【解决方案6】:

          这是 Cman 类的简单构造函数,它使用初始化列表来初始化 m_pThread 并将其值设置为 NULL。大多数情况下 NULL 都是这样宏定义的

          #define NULL 0
          or
          #define NULL 0L
          

          在此初始化之后,您的指针指向地址 0x000000。

          【讨论】:

          • 空指针不一定表示地址0x00000000
          • 这就是我写“在大多数情况下”的原因:)
          猜你喜欢
          • 1970-01-01
          • 2015-06-08
          • 2011-03-02
          • 2010-11-19
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 2020-03-27
          相关资源
          最近更新 更多