【问题标题】:What is the char() type in C++?C++ 中的 char() 类型是什么?
【发布时间】:2017-11-03 11:28:25
【问题描述】:

我在GCC编译器中编译并运行了以下代码sn-ps。成功了。

#include <iostream>
using namespace std;

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

输出:

A

那么,char() 是内置类型函数还是系统调用?

【问题讨论】:

  • char 是一个内置类型,但您可以在初始化内置类型时使用(){} 语法,即使这看起来像一个构造函数调用。这只是语法,没有特殊的函数调用。
  • char ch = char('A');: char ch 声明变量 ch 类型为 char= 开始初始化。 'A' 是字母 A 的字符常量(ASCII 值 65)。 char('A') 将常量表达式 'A' 转换为类型 char。另一种形式可能是(char)'A'。它似乎没有多大意义,但在语法和语义上都是正确的。

标签: c++ c++11 char g++ c++14


【解决方案1】:

从技术上讲,这是一种类型转换。标准中用于描述语法的短语是“显式类型转换(功能表示法)”。来自标准([expr.type.conv]/2)的效果描述如下:

如果初始值设定项是带括号的单个表达式,则类型转换表达式是等价的(在定义中, 并且如果在含义中定义)到相应的强制转换表达式(8.4)。 [...] [T]表达式是指定类型的纯右值,其结果对象使用初始化程序直接初始化(11.6)。

在这种情况下,您从 'A'(一个字符文字)开始,它已经具有类型 char1,并将其转换为 char(因此转换没有效果,一事无成)。

如果您对具有采用正确参数类型的构造函数的类型执行此操作,则可以使用该类型的构造函数进行转换。但对于其他类型转换符号也是如此,例如使用(T)xstatic_cast&lt;T&gt;(x)。与任何其他可以进行转换的语法相比,这种语法没有什么比使用 ctor 更重要的了。由于您已明确转换,它可用于调用标记为 explicit 的 ctor,但除此之外,它与 T ch = value; 并没有什么不同(就它是否使用 ctor 而言)(没有演员表,但可能包括转换)。


1. 请注意,这是 C++ 与 C 不同的地方。在 C 中,字符文字的类型为 int,而不是 char

【讨论】:

  • 源文件上的unicode编码怎么样,'A'在那种情况下可以是unicode吗?
  • @JasonLang:不。'A' 始终是一个窄字符文字。如果你想要一个 Unicode 字符文字,你可以使用 U'a'(或者可能是 L'A')。
【解决方案2】:

声明:

 char ch = char('A'); 

正在调用char 类型的构造函数,它采用char。它不是函数或任何系统调用。实际上,对于基本数据类型,它甚至不是一个调用,它只是一个语法糖,因此任何类型 T 都可以这样初始化:

T var = T(arg);

在编写模板函数和类时,这种方法非常有用且方便。因此,每当输入T(模板类型参数)时,编译器就不会抱怨char(arg) 无效。

【讨论】:

  • 你为什么声称它调用char 的构造函数,而实际上不存在这样的东西,而你显然意识到不涉及调用?
  • 很高兴我不是唯一一个在这里看到类型转换的人!
  • @JerryCoffin,因为char ch=char() 意味着构造一个分配了默认值的char 对象。 char() 在这里不是类型转换,而是构造函数语法。同样,当char(X)被调用时,逻辑上是构造函数调用(不是字面意义上的)。
猜你喜欢
  • 2012-12-28
  • 2015-02-08
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多