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

Rom*_*man 5 c++ constructor pointers default-value

我试着理解这段代码(从这里开始):

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;}
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我对理解这行代码有疑问:explicit auto_ptr(T* p = 0) : ptr(p) {}.

据我所知,通过这一行,我们尝试定义一个具有一个pointer-to-object-of-T-class类型参数的构造函数.然后我们有= 0.那是什么?它是默认值吗?但是如何0成为指针的默认值(指针应该将地址作为值,而不是整数).

NPE*_*NPE 10

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

引用Stroustrup:

我应该使用NULL0

在C++中,定义NULL0,所以只有美学差异.我更喜欢避免使用宏,所以我使用了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++空指针常量.192

192)可能去网络nitions包括00L,但不会(void*)0.

  • @Roman`0`是一个"特殊"积分值.它可以隐式转换为指针类型,表示空指针. (5认同)
  • @Roman:允许指针具有空值,这意味着它们不指向任何东西.`0`可用于表示该值. (2认同)
  • 就像10可以用作浮点类型的值,因为它可以被转换,0可以用作指针类型的值,因为它可以被转换. (2认同)