内置类型的变量can be value-initialized like this:
int var = int();
这样我就可以获得默认值int
,而无需在代码中对零进行硬编码。
但是,如果我尝试为指针做类似的事情:
int* ptr = int*();
编译器(Visual C ++ 10)拒绝编译它(说type int unexpected
)。
如何以类似的方式对指针进行值初始化?
答案 0 :(得分:9)
使用typedef为指针类型命名:
typedef int *ip;
ip ptr = ip();
同样的想法应该适用于需要多个词汇元素(单词)来定义类型名称的其他类型(例如unsigned long
,long long
,unsigned long long *
等)。
答案 1 :(得分:4)
如何使用Type()初始化Type *指针 - 就像语法一样?
你做不到。语法T()
在5.2.3 / 1,2中定义(C ++ 03,C ++ 11 FDIS中的措辞略有不同)。特别是第二段规定:
表达式T(),其中T是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的)void类型,它创建指定类型的rvalue,这是值初始化(8.5);
这意味着int()
将创建一个类型为int的rvalue和 value-initialize 它。现在的问题是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定义为:
type-name:
class-name
enum-name
typedef-name
这就是提出的解决方案的工作原理。创建typedef(直接或通过模板)创建一个类型名称(第三种类型),可以用作简单类型说明符(第一种类型)。
答案 2 :(得分: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();
答案 3 :(得分:1)
只做
int* x = int();
它仍然为指针指定0,使其指向NULL地址,因为你使用默认值int默认值为0,无论如何。
实际上,它适用于所有类型:
double* y = int();
地址仍然是一个32位(或64位,取决于平台)整数,所以我认为如果你做= int(),它应该适用于所有类型。
答案 4 :(得分:1)
这是一种方式:
template <typename T>
T make_default()
{
return T();
}
int main()
{
int *p = make_default<int*>();
}
答案 5 :(得分:0)
不起作用的原因是因为指针没有构造函数。
语法
int ()
调用(理论上)
int::int ()
初始化变量。 (更有可能的是,编译器只是将变量归零,但这是因为它“知道”了整数。)
在c ++ 11中,您可以使用nullptr
int *ptr = nullptr;
否则,你几乎必须使用NULL:
int *ptr = NULL;
答案 6 :(得分:-1)
这是你如何做到的 int * ptr = new int;