我尝试理解这段代码(取自here):
template <class T> class auto_ptr
{
T* ptr;
public:
explicit auto_ptr(T* p = 0) : ptr(p) {}
~auto_ptr() {delete ptr;}
T& operator*() {return *ptr;}
T* operator->() {return ptr;}
// ...
};
我对理解这行代码有疑问:explicit auto_ptr(T* p = 0) : ptr(p) {}
。
据我所知,通过这一行,我们尝试定义一个具有pointer-to-object-of-T-class
类型参数的构造函数。然后我们有= 0
。那是什么?它是默认值吗?但是0
如何可以作为指针的默认值(指针应该将地址作为值,而不是整数)。
答案 0 :(得分:10)
是的,= 0
是默认值。对于指针参数,它与= NULL
相同。
引用Stroustrup:
我应该使用
NULL
还是0
?在C ++中,
NULL
的定义是0
,所以只有美学差异。我更喜欢避免使用宏,因此我使用0
。NULL
的另一个问题是人们有时会错误地认为它与0
和/或不是整数不同。在预标准代码中,NULL
有时被定义为不适合的东西,因此必须/必须避免。这些日子不太常见。如果必须命名空指针,请将其命名为
nullptr
;这就是它在C ++ 11中所称的内容。然后,nullptr
将成为关键字。
空指针常量的正式定义如下(强调我的):
4.10指针转换[conv.ptr]
1 空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零 或者类型为std :: nullptr_t的prvalue。空指针常量可以转换为指针类型;结果 是该类型的空指针值,并且可以与指向对象的指针的每个其他值区分开 指向函数类型的指针。这种转换称为空指针转换。
NULL
被定义为一个这样的常数:
18.2类型[support.types]
3宏
NULL
是本国际标准(4.10)中一个实现定义的C ++空指针常量。 192192)可能的定义包括
0
和0L
,但不包括(void*)0
。
答案 1 :(得分:3)
explicit auto_ptr(T* p = 0) : ptr(p) {}
这是auto_ptr
的构造函数,它使用T* p
,如果用户没有提供指针,将使用= 0
。构造函数将成员ptr
设置为参数: ptr(p)
,并且不执行任何其他操作{}
。此构造函数不能用于隐式构造explicit
。