14

内置类型的变量可以像这样进行值初始化

int var = int();

这样我就得到了默认值,int而无需在我的代码中硬编码零。

但是,如果我尝试为指针做类似的事情:

int* ptr = int*();

编译器(Visual C++ 10)拒绝编译(说type int unexpected)。

如何以类似的方式对指针进行值初始化?

4

7 回答 7

9

使用 typedef 为您的指针类型命名:

typedef int *ip;

ip ptr = ip();

同样的想法也适用于需要多个词法元素(单词)来定义类型名称的其他类型(例如,、、、unsigned longlong longunsigned long long *

于 2011-11-09T15:54:01.633 回答
4

如何使用类似 Type() 的语法对 Type* 指针进行值初始化?

你不能。语法T()在 5.2.3/1,2 中定义(C++03,C++11 FDIS 中的措辞略有不同)。特别是第二段指出:

表达式 T(),其中 T 是非数组完整对象类型或(可能是 cv 限定的)void 类型的简单类型说明符 (7.1.5.2),创建指定类型的右值,即 value -初始化(8.5);

这意味着int(), 将创建一个 int 类型的右值并对其进行值初始化。现在的问题是这int*不是一个简单的类型说明符,而是一个详细的类型说明符。语法中simple-type-specifier的定义是:

  simple-type-specifier:
    ::opt nested-name-specifieropt type-name
    ::opt nested-name-specifier template template-id
    char
    wchar_t
    bool
    short
    int
    long
    signed
    unsigned
    float
    double
    void

类型名称定义为:

  type-name:
    class-name
    enum-name
    typedef-name

这就是使提议的解决方案起作用的原因。typedef 的创建(直接或通过模板)创建了一个类型名称(第三种类型),可以用作简单类型说明符(第一种类型)。

于 2011-11-09T16:35:33.367 回答
3

不需要使用typedef(但 C++11 独有),这在处理多种指针类型时很有用:

template<typename T>
using alias = T;

然后alias<int*>就是int*,这样就可以了int* p = alias<int*>()

C++03 的类似解决方案,使用身份元函数:

template<typename T>
struct identity {
    typedef T type;
};

int* p = identity<int*>::type();
于 2011-11-09T16:08:51.980 回答
1

做就是了

int* x = int();

它仍然将 0 分配给指针,使其指向 NULL 地址,因为您将其默认为 int 的默认值,无论如何都是 0。

实际上,它适用于所有类型:

double* y = int();

该地址仍然是一个 32 位(或 64 位,取决于平台)整数,所以我认为如果你使用 = int(),它应该适用于所有类型。

于 2011-11-09T15:53:32.663 回答
1

这是一种方法:

template <typename T>
T make_default()
{
    return T();
}

int main()
{
    int *p = make_default<int*>();
}
于 2011-11-09T15:53:37.490 回答
0

不起作用的原因是指针没有构造函数。

语法

int ()

电话(理论上)

int::int ()

它初始化变量。(更有可能的是,编译器只是将变量归零,但那是因为它“知道”整数)。

在 c++11 中,您可以使用 nullptr

int *ptr = nullptr;

否则,您几乎必须使用 NULL:

int *ptr = NULL;

于 2011-11-09T15:55:45.220 回答
-1

这就是你的做法 int* ptr = new int;

堆指针

于 2011-11-09T15:54:41.240 回答