奇怪的构造函数

时间:2010-04-08 23:44:20

标签: c++ syntax constructor definition

好吧,我在这里会非常简单,我只是在c ++中有一段代码,我不确定我是否真的理解并需要一些帮助。

好的,简化就是说我有一个这样定义的类:(真正的类有点复杂,但这才是最重要的)

class myClass : public Runnable {
    Semaphore *m_pMySemaphore;
    __Queue<Requests> *m_pQueue;
    Request m_Request;
    VetorSlotBuffer *m_vetorSlotBuffer;
}

到目前为止没有任何问题,myClass只是一个普通的类,它有3个成员实际上是指向其他类的指针和类Request的对象,这些类的实现对我的观点来说并不重要。

然后当这个人为myClass实现构造函数时,他或她就这样做了:

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

很明显,这三个变量被构造函数处理得因为它们是指针,我是对的吗?但那是什么样的语法?我通过这样做将指针设置为null吗?我已经看过一些c ++,但从来没有找到类似的东西。

其次,在构造函数声明之后处理“:”的是什么?我见过但从未花时间去调查。这是内心阶级还是什么?

非常感谢您提前。 Nelson R. Perez

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分:5)

它是成员在对象创建时的初始化,称为初始化列表 你无法在别处初始化它们,比如说:

class X { 
    int i = 0; // error bad syntax
} 

在构造函数中使用赋值,如果它们是const

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

所以c ++人员编写了这种语法!

答案 2 :(得分:4)

是的,这些指针被初始化为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区别不再有意义。只需选择一个并保持一致。

答案 3 :(得分:3)

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

构造函数的:语法称为初始化列表。它用于以简单,直接的方式初始化成员字段。应该很容易用适当的术语谷歌。