构造函数中指针的默认值是什么意思?

时间:2013-04-05 14:28:25

标签: c++ pointers constructor default-value

我尝试理解这段代码(取自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如何可以作为指针的默认值(指针应该将地址作为值,而不是整数)。

2 个答案:

答案 0 :(得分:10)

是的,= 0是默认值。对于指针参数,它与= NULL相同。

引用Stroustrup

  

我应该使用NULL还是0

     

在C ++中,NULL的定义是0,所以只有美学差异。我更喜欢避免使用宏,因此我使用0NULL的另一个问题是人们有时会错误地认为它与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 ++空指针常量。 192

     

192)可能的定义包括00L,但不包括(void*)0

答案 1 :(得分:3)

explicit auto_ptr(T* p = 0) : ptr(p) {}

这是auto_ptr的构造函数,它使用T* p,如果用户没有提供指针,将使用= 0。构造函数将成员ptr设置为参数: ptr(p),并且不执行任何其他操作{}。此构造函数不能用于隐式构造explicit