C++的内置基本类型和初始化

  数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。

专注于为中小企业提供网站制作、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业荥经免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

  C++的内置数据类型分为两组:基本类型和复合类型。如下所示:

C++的内置基本类型和初始化  

  bool类型的字面值为true和false:

  bool test = false;

  字面值true和false都可以通过提升转换为int类型,true被转换为1,而false被转换为0:

  int ans = true;  // ans assigned 1
  int promise = false;  // promise assigned 0

整型short、int、long和long long

  C++的short、int、long和long long类型通过使用不同数目的位(bit)来存储值,最多能够表示4种不同的整数宽度。如果在所有的系统中,每种类型的宽度都相同,则使用起来将非常方便。例如,如果short总是16位,int总是32位,等等。不过生活并非那么简单,没有一种选择能够满足所有的计算机设计要求。C++提供了一种灵活的标准,它确保了最小长度(从C语言借鉴而来),如下所示:

  •   short至少16位;

  •   int至少与short一样长;

  •   long至少32位,且至少与int一样长;

  •   long long至少64位,且至少与long一样长。

  C++提供了大量的整型,应使用哪种类型呢?通常,int被设置为对目标计算机而言最为“自然”的长度。自然长度(natural size)指的是计算机处理起来效率最高的长度。如果没有非常有说服力的理由来选择其他类型,则应使用int。

初始化

  初始化将赋值与声明合并在一起。可以使用字面值常量来初始化;也可以将变量初始化为另一个变量,条件是后者已经定义过;甚至可以使用表达式来初始化变量,条件是当程序执行到该声明时,表达式中所有的值都是已知的。如下:

  int uncles = 5;  // initialize uncles to 5
  int aunts = uncles;  // initialize aunts to 5
  int chairs = aunts + uncles + 4;  // initialize chairs to 14

  如果将uncles的声明移到语句列表的最后,则另外两条初始化语句将非法,因为这样当程序试图对其他变量进行初始化时,uncles的值是未知的。

  前面的初始化语法来自C语言,C++还有另一种C语言没有的初始化语法:

  int owls = 101;  // traditional C initialization, sets owls to 101
  int wrens(432);  // alternative C++ syntax,set wrens to 432

  警告:如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的。这意味着该变量的值将是它被创建之前,相应内存单元保存的值。

  如果知道变量的初始值应该是什么,则应对它进行初始化。

C++11的初始化方式

  还有一种初始化方式,这种方式用于数组和结构,但在C++98中,也可用于单值变量:

  int hamburgers = {24};  // set hamburgers to 24

  将大括号初始化器用于单值变量的情形还不多,但C++11标准使得这种情形更多了。首先,采用这种方式时,可以使用等号(=),也可以不使用:

  int emus{7};  // set emus to 7
  int rheas = {12};  // set rheas to 12

  其次,大括号内可以不包含任何东西。在这种情况下,变量将被初始化为零:

  int rocs = {};  // set rocs to 0
  int psychics{};  // set psychics to 0

  第三,这有助于更好地防范类型转换错误。关于这个主题有如下说明:

  C++将使用大括号的初始化称为列表初始化(list-initialization),因为这种初始化常用于给复杂的数据类型提供值列表。与其他初始化方式相比,列表初始化对类型的要求更严格。具体地说,列表初始化不允许缩窄(narrowing),即变量的类型可能无法表示赋给它的值。例如,不允许将浮点型转换为整型。在不同的整型之间转换或将整型转换为浮点型可能被允许,条件是编译器知道目标变量能够正确地存储赋给它的值。例如,可将long变量初始化为int值,因为long总是至少与int一样长;相反方向的转换也可能被允许,只要int变量能够存储赋给它的long常量:

  const int code = 66;
  int x = 66;
  char c1 {31325};  // narrowing, not allowed
  char c2 = {66};  // allowed because char can hold 66
  char c3 {code};  // ditto(同上)
  char c4 = {x};  // not allowed, x is not constant
  x = 31325;
  char c5 = x;  // allowed by this form of initialization

  在上述代码中,初始化c4时,您知道x的值为66,但在编译器看来,x是一个变量,其值可能很大。编译器不会跟踪下述阶段可能发生的情况:从x被初始化到它被用来初始化c4。

为什么需要更多的初始化方法?

  为何需要更多的初始化方法?有充分的理由吗?原因是让新手更容易学习C++,这可能有些奇怪。以前,C++使用不同的方式来初始化不同的类型:初始化类变量的方式不同于初始化常规结构的方式,而初始化常规结构的方式又不同于初始化简单变量的方式;通过使用C++新增的大括号初始化器,初始化常规变量的方式与初始化类变量的方式更像。C++11使得可将大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。


网页题目:C++的内置基本类型和初始化
文章URL:http://pwwzsj.com/article/peoejs.html