5

我尝试理解这段代码(取自这里):

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才能成为指针的默认值(指针应该将地址作为值,而不是整数)。

4

2 回答 2

10

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

引用Stroustrup 的话:

我应该使用NULLor0吗?

在 C++ 中, 的定义NULL0,所以只有审美差异。我更喜欢避免使用宏,所以我使用0. 另一个问题NULL是人们有时错误地认为它不同于0和/或不是整数。在准标准代码中,NULL有时会/被定义为不合适的东西,因此必须/必须避免。这几天不太常见了。

如果必须命名空指针,请调用它nullptr;这就是它在 C++11 中的名称。然后,nullptr将是一个关键字。

空指针常量的正式定义如下(强调我的):

4.10 指针转换 [conv.ptr]

1空指针常量是整数类型的整数常量表达式 (5.19) 纯右值,其计算结果为零 或 std::nullptr_t 类型的纯右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与指向对象的指针或指向函数类型的指针的所有其他值区分开来。这种转换称为空指针转换。

NULL被定义为这样一个常数:

18.2 类型 [support.types]

3 该宏NULL是本国际标准 (4.10) 中实现定义的 C++ 空指针常量。192

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

于 2013-04-05T14:29:11.040 回答
3
explicit auto_ptr(T* p = 0) : ptr(p) {}

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

于 2013-04-05T14:30:47.630 回答