您好,登录后才能下订单哦!
数据类型是程序的基础:它告诉我们数据的意义以及我们能在数据上执行的操作。
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使得可将大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。