好吧,我在这里会非常简单,我只是在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
答案 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。
构造函数的:
语法称为初始化列表。它用于以简单,直接的方式初始化成员字段。应该很容易用适当的术语谷歌。