2017-06-02 184 views
4

我编译并运行了GCC编译器中的以下代码片段。它成功地工作。什么是C++中的char()类型?

#include <iostream> 
using namespace std; 

int main() 
{ 
    char ch = char('A'); 
    cout<<ch<<endl; 
    return 0; 
} 

输出:

A 

所以,为CHAR()内部类型功能或系统调用?

+4

'char'是一种内置类型,但在初始化内置函数时可以使用'()'或'{}'语法,即使这看起来像构造函数调用。这只是语法,没有特殊的函数调用。 – BoBTFish

+1

'char ch = char('A');':'char ch'声明'char'类型的变量'ch'。 '='开始初始化。 “A”是字母“A”的字符常量(ASCII值为65)。 'char('A')'将常量表达式'A'转换为'char'类型。另一种形式可以是'(char)'A''。它似乎没有多少意义,但在语法和语义上都是正确的。 – Scheff

回答

11

从技术上讲,这是一种类型转换。标准中用于描述语法的短语是“显式类型转换(功能符号)”。从标准的影响的说明([expr.type.conv/2)如下:

如果初始化是一个圆括弧单个表达,类型转换表达式是等效(在definedness, 和如果在含义中定义)与相应的演员表达(8.4)。 [...] [T]表达式是指定类型的一个前值,其结果对象用初始值设定项进行直接初始化(11.6)。

在这种情况下,你已经从“A”(字符文字),它已经具有类型char ,并且铸造char(所以剧组有没有效果,无所作为)。

如果您对具有带正确参数类型的构造函数的类型执行此操作,则可以使用该类型的构造函数进行转换。但其他演员表示法也是如此,例如使用(T)xstatic_cast<T>(x)。这个语法没有任何关于使用ctor的语法,而不是其他任何可以执行转换的其他语法。既然你已经明确了转换,它可以用来调用一个标记为explicit的ctor,但除此之外,它没有任何区别(就其是否使用ctor而言)而不是T ch = value;(没有转换,但无论如何可能包括转换)。


1。注意,这是一个地方,C++从C.不同在C中,字符文字具有类型int,不char

+0

如何在源文件上进行unicode编码,在这种情况下'A'是否是unicode? –

+1

@JasonLang:不,'A'总是一个窄字符。如果你想要一个Unicode字符文字,你可以使用'U'a'(或可能是'L'A'')。 –

4

声明:

char ch = char('A'); 

是调用构造char型,这需要char。这不是一个功能或任何系统调用。在现实中,对于基本的数据类型,它甚至不是一个电话,它只是一个语法糖,使任何类型的T可以用这种方式进行初始化:

T var = T(arg); 

和写作模板函数和类时,该方法非常有用和方便。因此,无论何时输入T(模板类型参数),编译器都不会抱怨char(arg)无效。

+3

为什么你声称它调用'char'的构造函数,当没有这样的事情存在时,你显然意识到没有涉及的调用? –

+0

很高兴我不是唯一一个看到类型投在这里的人! –

+0

@JerryCoffin,因为'char ch = char()'意味着构造一个赋予它默认值的'char'对象。 'char()'在这里不是类型转换,而是一个构造函数语法。同样,当调用char(X)时,它在逻辑上是一个构造函数调用(不是字面意义上的)。 – Ajay

-3

char()是函数类型没有参数,返回char

char是表示字符的默认类型。

它在预期类型的​​上下文中很重要。其他背景是不同的,例如char a = char();value-initializes a.