奇怪的构造器 我会很直截了当的,我只是在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;
}