如何在C ++中长期实现?

时间:2011-06-27 11:10:25

标签: c++

在C ++中,据我所知,所有数据类型都是作为类实现的。 (不知道它是否正确,但我将其视为int a(5);语句的理由,这些语句调用int的参数化构造函数。)

如果是这样,如何实施多空?我发现long longshort short是有效类型,但short longlong 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

?这种说法是否正确?

4 个答案:

答案 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)

内置数据类型未实现为类。他们只是有一些句法上的相似之处。

shortlongint以及其他所有内置类型名称都是 keywords ,由编译器专门处理。所以,简而言之,它们被实现为 magic 。他们不是上课,他们只是自己。

所以不,这些类型不能用其他语言功能,std::string或其他标准库组件的方式实现。内置类型是核心语言的基本组成部分。

答案 3 :(得分:2)

你在一些误解下工作:

  • 并非所有数据类型都是作为C ++中的类实现的。实际上,只有类类型被实现为类。除了基本类型之外,枚举,指针和数组不是作为类实现的。

  • short short 不是有效类型。签名的整数类型 C ++ 03是signed charshortintlong。期。 C ++ 11 添加long long,并允许实施添加其他内容。

  • 我不确定你在这里“实施”是什么意思。在几乎所有现代机器上,所有的整体类型(有符号或无符号)都直接支持硬件; C ++编译器只生成适当的硬件指令。 (在较旧的计算机上,long,有时甚至是intshort,通常需要对基本操作进行函数调用,而在一些罕见且奇特的计算机上,无符号算法需要添加指令。)

  • 如何编写定义是语法问题,而不是实现问题。如果类型支持复制,T v(i);T v = i;都是合法的;对于所有类型的类型,它们完全相同。 (使用现代编译器;我过去曾使用过一些在这方面存在缺陷的编译器。但这是一个相当遥远的过去。)