在C ++中,据我所知,所有数据类型都是作为类实现的。 (不知道它是否正确,但我将其视为int a(5);
语句的理由,这些语句调用int的参数化构造函数。)
如果是这样,如何实施多空?我发现long long
和short short
是有效类型,但short long
和long short
不是(检查后者只是因为它听起来很有趣!)
同样,如何实施签名和未签名?
PS。通过实现,我的意思是“使用C / C ++函数编写,还是在编译器本身的较低级别编写”。
因此,基本类型的变量声明和用户定义的对象或变量的等效部分是(向下读)
auto|register|static|extern <=> auto|register|static|extern
const <=> const
(signed|unsigned)(long|short)datatype <=> class name etc
variable name <=> object/variable name
?这种说法是否正确?
答案 0 :(得分:6)
在特定问题上,long long
由编译器以编译器+平台特定方式实现(通常比编译器依赖的平台更多)。
至于最初的误解,不,并非所有类型都是C ++中的类。这些语言试图尽可能为所有类型提供统一的语法,尝试尽可能地使所有类型的行为相似,并以类似的方式使用。事实上,它实际上恰恰相反:C ++尽可能地尝试使类的行为类似于原始类型(值语义)。
能够以这种方式初始化整数的特殊原因实际上与类非常相关,只是以不同的方式。在类构造函数定义中,有初始化列表,用于定义在执行构造函数块之前如何初始化每个成员。列表中每个初始化元素的语法基本上是(我必须查找确切的定义):member_name( initializer )
,所以例如你会得到:
class my_int_vector {
int * p;
int size;
public:
my_int_vector() : p(0), size(0) {}
//...
}
指针和整数都是基本类型,但它们可以以类似于类的方式初始化。如果基本类型不允许这种类型的初始化,并且只允许type name = value;
语法,则必须扩展初始化列表语法,并且您将无法在以后无缝地更改这些类型(比如,将int
更改为atomic_int
)。
答案 1 :(得分:5)
并非所有数据类型都是C ++中的类。原始C数据类型不是(它们被称为标量)。它们根本没有“实现”,而是形成了直接转换为机器代码的语言的核心功能。语法int i(5);
等同于C int i = 5;
并在声明时初始化变量。
答案 2 :(得分:5)
内置数据类型未实现为类。他们只是有一些句法上的相似之处。
short
,long
,int
以及其他所有内置类型名称都是 keywords ,由编译器专门处理。所以,简而言之,它们被实现为 magic 。他们不是上课,他们只是自己。
所以不,这些类型不能用其他语言功能,std::string
或其他标准库组件的方式实现。内置类型是核心语言的基本组成部分。
答案 3 :(得分:2)
你在一些误解下工作:
并非所有数据类型都是作为C ++中的类实现的。实际上,只有类类型被实现为类。除了基本类型之外,枚举,指针和数组不是作为类实现的。
short short
不是有效类型。签名的整数类型
C ++ 03是signed char
,short
,int
和long
。期。 C ++ 11
添加long long
,并允许实施添加其他内容。
我不确定你在这里“实施”是什么意思。在几乎所有现代机器上,所有的整体类型(有符号或无符号)都直接支持硬件; C ++编译器只生成适当的硬件指令。 (在较旧的计算机上,long
,有时甚至是int
或short
,通常需要对基本操作进行函数调用,而在一些罕见且奇特的计算机上,无符号算法需要添加指令。)
如何编写定义是语法问题,而不是实现问题。如果类型支持复制,T v(i);
和T v = i;
都是合法的;对于所有类型的类型,它们完全相同。 (使用现代编译器;我过去曾使用过一些在这方面存在缺陷的编译器。但这是一个相当遥远的过去。)