奇怪的构造器 我会很直截了当的,我只是在C++中有一段代码,我不确定我真的理解,需要一些帮助。

奇怪的构造器 我会很直截了当的,我只是在C++中有一段代码,我不确定我真的理解,需要一些帮助。,c++,syntax,constructor,definition,C++,Syntax,Constructor,Definition,好的,为了简化,让我们假设我有一个这样定义的类:(真实的类稍微复杂一点,但这才是重要的) class myClass:public Runnable{ 信号量*m_pMySemaphore; __队列*m_pQueue; 请求m_请求; VetorSlotBuffer*m_VetorSlotBuffer; } 到目前为止,没有什么不对,myClass只是一个常规类,它有3个成员,实际上是指向其他类的指针和类请求的对象,这些类的实现对于我这里的观点并不重要 然后,当此人为myClass实现构造函

好的,为了简化,让我们假设我有一个这样定义的类:(真实的类稍微复杂一点,但这才是重要的)

class myClass:public Runnable{
信号量*m_pMySemaphore;
__队列*m_pQueue;
请求m_请求;
VetorSlotBuffer*m_VetorSlotBuffer;
}
到目前为止,没有什么不对,myClass只是一个常规类,它有3个成员,实际上是指向其他类的指针和类请求的对象,这些类的实现对于我这里的观点并不重要

然后,当此人为myClass实现构造函数时,他或她执行了以下操作:

myClass::myClass():m_pMySemaphore(0)、m_pQueue(0)、m_vetorSlotBuffer(0){
}

很明显,构造函数是这样对待这三个变量的,因为它们是指针,对吗?但这是什么样的语法呢?我是否通过这样做将指针设置为null?我已经看到了一点C++,但是从来没有发现过类似的东西。 第二,构造函数声明之后“:”的处理是什么?我见过但从未花时间调查过。这像是一个内部类还是什么

事先非常感谢。
Nelson R.Perez

是的,设置为0的指针就是设置为null的指针


构造函数的
语法称为初始化列表。这里使用它以简单、直接的方式初始化成员字段。用合适的术语搜索应该很容易。

这是成员在创建对象时的初始化,称为初始化列表。
您不能在其他地方初始化它们,例如:

class X { 
    int i = 0; // error bad syntax
} 
在构造函数中,如果它们是
const
,则不使用赋值:

class X { 
    const int i; 
    X(){ 
        i = 0; // error it's a const
    } 
} 

所以C++的人编了这个语法! 是,这些指针正在初始化为NULL。这里的关键是它们是初始化的,而不是赋值的。即:

myClass::myClass()
  :  m_pMySemaphore(0),   // initialized to 0
     m_pQueue(NULL)      // initialized to NULL (preferable to 0)
                         // no initializer for m_Request - uses default constructor
                         // no initializer for m_vectorSlotBuffer
{
   // at this point, the object is entirely initialized, and can be used.

   // this next line ASSIGNS to the member
   m_vectorSlotBuffer = 0;
}
对m_vectorSlotBuffer所发生的事情是,它在两个单独的步骤中被初始化,然后被分配。通过像m_pQueue那样执行,我们可以节省一个步骤,并正确初始化。当我们想要使用非默认构造函数,或者想要初始化
const
成员时,这一点变得非常重要

另外,构造函数
()
之后的
是初始化部分的开始,在我们进入构造函数主体的
{
之前

最后,NULL不能保证为0。NULL是可移植的,但大多数架构使用0作为NULL

编辑:0/NULL区分不再有意义。只需选择一个并保持一致。

这是一个


,但在C和C++规范的后版本中,0被定义为NULL。换句话说,即使架构使用了其他空模式的空指针,编译器也需要将指针=0转换为指针= null。+ 1用于区分初始化和赋值。Ce 0/NULL位是不正确的。正如@ ZAN所说的,C++定义NULL为0。实际的机器表示可能不同,但常数整型0总是转换为空指针。确切地说,但这是问题,我甚至不知道他们有这个名字!!但是非常感谢!我现在明白了。@ Bilthon,是的,有很多事情是很难的。在没有适当术语的情况下进行搜索…特别是编程语言中奇怪的语法符号。
预处理器指令、
模板化和一系列其他事情都同样糟糕。:pAn无关问题:“\uu Queue”是非法名称。不能使用带有两个下划线的标识符或具有以下特性的标识符:以一个下划线和一个大写字母开头。只是要记住一些事情。
myClass::myClass()
  :  m_pMySemaphore(0),   // initialized to 0
     m_pQueue(NULL)      // initialized to NULL (preferable to 0)
                         // no initializer for m_Request - uses default constructor
                         // no initializer for m_vectorSlotBuffer
{
   // at this point, the object is entirely initialized, and can be used.

   // this next line ASSIGNS to the member
   m_vectorSlotBuffer = 0;
}