2010-04-08 91 views
2

嗯,我会在这里很直接,我只是有一段代码在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

+2

一个无关的问题:“__Queue”是非法的名字。您不能使用带有两个下划线的标识符或以一个下划线和大写字母开头的标识符。只是要记住。 – 2010-04-09 03:37:52

回答

3

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

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

+0

没错,但那是问题所在,我甚至都不知道他们有这个名字!但非常感谢你!我现在明白了。 – Bilthon 2010-04-09 00:09:56

+0

@Bilthon,是啊,如果没有适当的术语,很多事情都很难搜索......编程语言中特别奇怪的语法符号。 '#'预处理指令,'<>'模板以及其他一些其他的东西同样糟糕。 :p – Tanzelax 2010-04-09 00:59:00

5

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

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

无论是在构造函数中使用赋值的,如果他们const

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

所以C++家伙由该语法!

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

但在更高版本的C和C++规范中,0被定义为NULL。换句话说,即使体系结构对NULL指针使用其他位模式,编译器也需要将指针= 0转换为指针= NULL。 – 2010-04-09 00:00:05

+1

+1用于区分初始化和分配。虽然,因为0/NULL位不正确,所以几乎-1。正如@Zan所说,C++将NULL定义为0.实际的机器表示形式可能不同,但常量整数0 * always *会转换为空指针。 – jalf 2010-04-09 01:15:38