第2章 变量和基本类型

1.一般程序语言所包含的基本特征集有哪些?(5个)

答:(1)内置数据类型

(2)表达式和语句

(3)变量

(4)控制结构:控制有条件的执行或者重复执行一组操作。

(5)函数:程序员可以使用函数把行为抽象成可以代用的计算单元。

2.大多数现代程序设计语言都采用哪两种方式对基本集进行扩充?

答:(1)允许程序员通过自定义数据类型扩展该语言

(2)提供一组库例程。这些例程定义了一些并非内置在语言中的实用函数和数据类型。

3. C++最重要的特征是什么?

答:C++最重要的特征是类,程序员可以实用类自定义数据类型,利用这一特征,c++实现了一个具有丰富类类型和相关函数的标准库。

4. C++内置了几种基本类型?
答:整型、浮点型、字符型、布尔型。

5. 整型分哪两类?默认是哪种类型?

答:signed和unsigned类型,默认是有符号的signed类型

6.整型字面常量有哪三种表示方法?后缀有几种,如何书写?

答:十进制、八进制、十六进制;以0开头表示八进制,以0x或者0X开头表示十六进制。

整型字面常量后缀有三种;后缀加u或者U表示unsigned类型数值,加L或小写l表示long类型,同时加U和L表示unsigned long类型。

7.浮点字面值的后缀有几种,如何书写?默认类型是什么?

答:默认的浮点型字面值常量是double型,后缀F或f表示单精度浮点型。还有第二种后缀,加L(或l)表示扩展精度。

8. 非打印字符的转义序列有哪些?

换行符 \n                            水平制表符\t
纵向制表符 \v                     退格符 \b
回车符 \r                             进纸符 \f
报警(响铃)符 \a             反斜线 \\
疑问号 \?                           单引号 \'
双引号 \"

9. 通用转义字符有哪两种写法?

答:任何字符可表示为以下两种形式的通用转义字符:\ooo或者\xddd两种表示形式。

其中ooo表示三个八进制数字,这三个数字表示字符的数字值;ddd表示十六进制数字。

10.多行字符串字面值有哪两种写法?哪种更常用?

答:(1)两个仅由空格、换行符、制表符分隔的字符串字面值可连接成一个新的字符串字面值。比较常用。

(2)依赖于程序格式化特性,在一行的 末尾加上一个反斜线符号可以将此行和下一行作为同一行来处理。

第(2)种比较适合于c++程序中的一些不能插入空格的地方,例如单词中间不能有空格。注意反斜线符号必须是该行的尾字符——不允许有注释或空格符。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。)

11.变量的本质是什么?作用是什么?变量的类型能决定哪三个方面?变量命名有哪些习惯?哪些标识符不能做变量名?

答:变量的本质是存储区。作用是提供了程序可以操作的有名字的存储区。变量的类型决定了:(1)变量的内存大小和布局;(2)能够存储于该内存的值的取值范围;(3)可应用在该变量上的操作集。

变量名可以由字母、数字和下划线组成。变量名必须以字母或下划线开头,并且区分大小写字母。c++中的关键字不能用作变量的标识符。

变量命名习惯:
• 变量名一般用小写字母。
• 标识符应使用能帮助记忆的名字,也就是说,能够提示其在程序中的用法的名字,如 on_loan 或 salary。
• 包含多个词的标识符书写为在每个词之间添加一个下划线,或者每个内嵌的词的第一个字母都大写。

12. C++的表达式分哪两种?

答:c++的表达式分左值和右值两种。

13. 左值和右值有什么区别?

答:左值可以出现在赋值语句的左边或右边。右值只能出现在赋值语句的右边,不能出现在赋值语句的左边。

14.为什么左值和右值的使用影响程序的操作和性能?

答:例如在向函数传递值的时候,如果传递的参数是右值,则在函数体中不能对该参数进行赋值等可以改变右值的操作,而如果传递的左值,可函数体中可以对该值进行赋值操作。还有从函数中返回值的时候,如果返回值得类型是右值类型,那么函数返回值只能放在赋值操作符的右边,且只能赋给const类型的变量。如果函数返回值是左值,则它可以赋给一般变量,且该变量的值可以更改。

15.C++支持哪两种初始化形式?如何书写?有何区别?

答:复制初始化和直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:
int ival(1024); // 直接初始化
int ival = 1024; // 复制初始化

当初始化类类型对象时,复制初始化和直接初始化之间的差别才会比较明显:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。

string null_book = "9-999-99999-9"; // 复制初始化

string empty_copy = string(); // 复制初始化

16.赋值和初始化有什么区别?复制初始化和直接初始化有什么差别?

答:初始化是创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。复制初始化和直接初始化的差别同答案15.

17.对于内置类型,复制初始化和直接初始化有区别吗?

答:初始化内置类型的对象只有一种方法:提供一个值,并且把这个值复制到新定义的对象中。对内置类型来说,复制初始化和直接初始化几乎没有差别。

18. 类是用何种机制实现初始化的?

答:每个类都可能会定义一个或几个特殊的成员函数来们初始化类类型的变量。定义如何进行初始化的成员函数称为构造函数。

19. 那种情况不能使用复制初始化?

答:对类类型的对象来说,有些初始化仅能用直接初始化完成,如std::string all_nines(10, '9'); 不能用复制初始化是因为用所给参数创建不了临时对象,创建临时对象是自动调用构造函数创建的,只能是单参数的构造函数可以用于创建临时对象,也就是说只有单参数时可能用复制初始化,否则不能使用复制初始化,而只能使用直接初始化。

20.系统自动初始化变量的结果取决于哪两个因素?内置类型和类类型分别如何初始化?

答:系统自动初始化变量取决于(1)变量的类型,(2)变量定义的位置

a.内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成 0,在函数体里定义的内置类型变量不进行自动初始化。除了用作赋值操作符的左操作数,未初始化变量用作任何其他用途都是没有定义的。

b.类通过定义一个或多个构造函数来控制类对象的初始化,创建一个类的对象时如果没有提供初始化式,就调用默认构造函数对对象进行初始化,如果提供了初始化式,就调用参数类型相匹配的构造函数对类类型变量进行初始化。如果类定义中没有定义默认构造函数,则创建类类型的变量时,必须给出初始化式。

21. 写出string的三种初始化方法。

答:string str("fileName");//用字符串常量进行初始化

string str;//调用默认构造函数,初始化为空字符串

string str(10,'a');//10个a

22.声明和定义的区别是什么?他们之间的关系是什么?

答:变量的定义用于为变量分配存储空间,还可以为变量指定初始值(定义的关键在于分配存储空间,而不是给不给初始化)。在一个程序中,变量有且仅有一个定义。

声明用于向程序表明变量的类型和名字,并不分配存储空间。在一个程序中,变量可以声明多次。

关系:定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern 关键字声明变量名而不定义它。extern int i; // 声明而非定义                        

       int i; //声明并定义了i。
       extern double pi = 3.1416; //含有初始化式的声明被当做定义

23.不是定义的声明有唯一一种表达形式是什么?

答: extern double pi;不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。

24. 什么情况下需要与定义分离的多个声明?

答:任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。

25.C++有哪六种作用域?什么是作用域嵌套?作用域嵌套的最佳实践是什么?

答:全局作用域、局部作用域、语句作用域、类作用域、命名空间作用域、(少一个)

局部作用域位于全局作用域里,局部作用域里可能还有内部的作用域,这种就叫做作用域的嵌套。

作用域嵌套的最佳实践是继承中的作用域嵌套:派生类可以重定义其基类的成员还可以定义新成员,派生类作用域嵌套在基类作用域中,因此派生类可以直接访问基类的成员。派生类中定义的与基类成员同名的成员屏蔽基类成员。具体而言,派生类中的成员函数不重载基类成员。基类中的被屏蔽成员可以用作用域操作符访问。(这个答案是自己想的)

26.变量声明和定义的最佳实践是什么?这样做的好处是什么?

答:变量的声明和定义的最佳实践是类的定义。类的定义是一些接口的声明,放在头文件中,而这些接口的定义放在源文件中,在用到这个类的对象的成员函数(接口)时,只要包含头文件就行了,相当于包含了声明。这样做的好处是实现了接口声明和实现的分离。(这个答案也是自己想的,欢迎大家多提意见)

27. 当程序中出现幻数时,有哪两个缺点?

答:这里的幻数可能指得就是书中所说的魔数吧。魔数有两个缺点:程序的可读性差,程序的可维护性差。

28.常量定义如何书写?定义时必须初始化吗?为什么?

答:加const修饰符,如const int bufSize = 512;因为常量在定义后就不能被修改,所以定义时必须初始化:

29. const默认的作用域是什么?

答:const对象默认为文件的局部变量。

30.如何定义const为全程序作用域?这种写法对非const是否适用?

答:通过指定 const 变量为 extern,就可以在整个程序中访问 const 对象:

// file_1.cc
extern const int bufSize = fcn();//定义

// file_2.cc
extern const int bufSize; //声明
for (int index = 0; index != bufSize; ++index)  //uses bufSize from file_1

...

非 const 变量默认为 extern。所以当然适用。

31. 引用的主要用途是什么?

答:主要用途是用作函数的形式参数。

32. 引用的本质是什么?如何书写?

答:引用的本质是对象的别名,通过在变量名前添加“&”符号来定义。

33.为什么初始化以后不能将引用绑定到别的对象上,或者说只能在定义引用时对其进行初始化?

答:因为引用只是它绑定的对象的另一名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上,初始化以后对引用进行的赋值操作,效果也是修改该引用所绑定的对象的值。因此,必须在定义引用时进行初始化,初始化以后不能将引用绑定到别的对象上。初始化是指明引用指向哪个对象的唯一方法。

34. 引用初始化的两个限制是什么?

答:(1)引用必须在定义时就初始化

(2)用与该引用同类型的对象来初始化

35. const引用的作用是什么?特别之处是什么?

答:const引用是指向const对象的引用,特别之处在于不能通过该引用修改所绑定的对象,const 引用可以初始化为不同类型的对象或者初始化为右值。

36.非const引用的限制是什么?const引用和非const引用的区别是什么?

答:非const引用不能绑定到const对象上。只能绑定到与该引用同类型的对象上。

const引用和非const引用的区别是:前者绑定的对象不可以通过该引用来修改,后者绑定的对象可以可以通过该引用修改。非 const 引用只能绑定到与该引用同类型的对象。const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。

37. 使用typedef的目的有那三个?

答:为了隐藏特定类型的实现,强调使用类型的目的。
       简化复杂的类型定义,使其更易理解。
       允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。

38. typedef的本质是什么?

答:typedef 定义以关键字 typedef 开始,后面是数据类型和标识符。标识符或类型名并没有引入新的类型,而只是现有数据类型的同义词。

39. typedef的名字是如何使用的?

答:typedef 名字可出现在程序中类型名可出现的任何位置。

40. 定义和初始化枚举的写法是什么?

答:枚举的定义包括关键字 enum,其后是一个可选的枚举类型名,和一个用花括号括起来、用逗号分开的枚举成员列表。可以为一个或多个枚举成员提供初始值,用来初始化枚举成员的值必须是一个常量表达式。

enum Forms {shape = 1, sphere, cylinder, polygon};

41. 枚举的默认初始化是什么?

答:默认地,第一个枚举成员赋值为 0,后面的每个枚举成员赋的值比前面的大1。

42. 枚举成员的值有唯一性要求吗?

答: 没有。枚举成员值可以是不唯一的。

43.枚举成员的初始化有哪三种方式?分别如何书写?

答:三种方式?

enum Forms {shape,sphere, cylinder, polygon};//默认初始化

enum Forms {shape = 1, sphere, cylinder, polygon};//后面的一次增1

enum Points { point2d = 2, point2w,point3d = 3, point3w };//point2w为3,point3w为4

44. 枚举类型对象的初始化有何特殊要求?

答:枚举类型的对象的初始化(或赋值),只能通过其枚举成员或同一枚举类型的其他对象来进行。

45.每个类都定义了一个什么和什么?它们分别代表什么?

答:每个类都定义了一个接口和一个实现。接口由使用该类的代码需要执行的操作组成。实现一般包括该类所需要的数据。实现还包括定义该类需要的但又不供一般性使用的函数。(实现的概念竟然是数据,还以为是源文件中的实现呢。。)

46. 定义类的步骤如何?

答:定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。

47. 类定义后必须有一个什么符号?

答:分号。

48.定义变量和定义数据成员的重要区别是什么?

答:定义变量和定义数据成员存在非常重要的区别:一般不能把类成员的初始化作为其定义的一部分。而是通过构造函数控制初始化。

49.类成员的访问类型有哪几种?类的定义中可以有多少个访问标号?

答:public、private、protected三种。类的定义中可以包含 0 个到多个访问标号。

50. structure和class的区别是什么?

答:两个区别:

默认访问级别:默认情况下,struct 的成员为public,而 class 的成员为 private。

默认继承访问级别:使用 class 保留字定义的派生类默认具有 private 继承,而用 struct 保留字定义的派生类默认具有 public 继承。

class Panda : public Bear, public Endangered { ............};//如果public省略不写,则是默认的private继承。

51. 正确使用头文件的两个好处是什么?

答:(1)保证所有文件使用给定实体的同一声明;(2)当声明需要修改时,只有头文件需要更新。

52. 头文件可以用于声明还是定义?

答:用于声明。(头文件为相关声明提供了一个集中存放的位置。头文件一般包含类的定义extern 变量的声明函数的声明。使用或定义这些实体的文件要包含适当的头文件。)

下列语句是一些定义,所以不应该放在头文件里:
extern int ival = 10;
double fica_rate;

53. 头文件不应该包含定义有那三个例外?

答:头文件可以定义值在编译时就已知道的 const 对象inline 函数

注意:如果 const 变量不是用常量表达式初始化,即值不是在编译时就已知道的,那么它就不应该在头文件中定义。相反,和其他的变量一样,该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添加 extern 声明,以使其能被多个文件共享

54. 预处理器变量命名规则是什么?为什么?

答:预处理器变量 的名字在程序中必须是唯一的。因为任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。预处理器变量经常用全大写字母表示。

注:(#define 指示接受一个名字并定义该名字为预处理器变量。#ifndef 指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif。)

55.预防头文件被包含多次的措施是什么?如何书写?最佳实践是什么?

答:为了保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容。

#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
#endif

最佳实践是?

posted @ 2014-04-21 20:59  蓝蓝鱼鱼  阅读(305)  评论(0编辑  收藏  举报