【问题标题】:What do default values of pointers in constructors mean?构造函数中指针的默认值是什么意思?
【发布时间】:2013-03-28 00:29:13
【问题描述】:

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

【问题讨论】:

    标签: c++ pointers constructor default-value


    【解决方案1】:

    是的,= 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 类型的纯右值。空指针常量可以转换为指针类型;结果 是该类型的空指针值,并且可以与指向对象或指针的所有其他值区分开来 指向函数类型的指针。这种转换称为空指针转换。

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

    18.2 类型 [support.types]

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

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

    【讨论】:

    • 我仍然不明白如何将 0(或 NULL)用作指针的值。指针是地址,地址不同于整数。
    • @Roman:指针可以有一个空值,这意味着它们不指向任何东西。 0 可用于表示该值。
    • @Roman 0 是一个“特殊”整数值。可以隐式转换为指针类型,代表空指针。
    • 就像10可以作为浮点类型的值,因为它可以转换,0可以作为指针类型的值,因为它可以转换。
    【解决方案2】:
    explicit auto_ptr(T* p = 0) : ptr(p) {}
    

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

    【讨论】:

    • 什么是“会员ptr”?该类没有这样的成员。据我了解,:ptr() 表示auto_ptr(T* p = 0) 构造函数应该调用ptr 类的ptr(T* p) 构造函数。
    • @Roman 不,大卫说得对。成员初始化器列表指定如何初始化基类和成员。 auto_ptr 没有基类,但它确实有一个成员 ptrT* 类型),通过在 mem-initialiser 列表中的出现初始化为 p
    • @Roman:这个班当然有这样的成员。 T* ptr; 是类中声明的第一件事。
    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多