【C++ Primer】摘记--第2章 变量和基本类型

1.arithmetic types(算术类型)表示数值即整数和浮点数的类型。浮点型值有三种类型:long doubledoublefloat,分别表示扩展精度值、双精度值和单精度值。一般总是使用 double 型。特别地,float 只能保证六位有效数字,这对于大多数的计算来说都不够。整型包括 boolcharwchar_tshortintlong 。整型可以是带符号或无符号的。一般在算术计算中总是避免使用 shortchar

2.算术类型的存储空间依机器而定。这里的存储空间是指用来表示该类型的位(bit)数。C++标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。因为位数的不同,这些类型所能表示的最大(最小)值也因机器的不同而有所不同。

3.字符类型有两种:charwchar_tchar 类型保证了有足够的空间,能够存储机器基本字符集中任何字符相应的数值,因此,char 类型通常是单个机器字节(byte)。wchar_t 类型用于扩展字符集,比如汉字和日语,这些字符集中的一些字符不能用单个 char 表示。

4.一般, short 类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机器字长(在 32 位机器中 int 类型和 long 类型通常字长是相同的)。

5.整型 intshortlong 都默认为带符号型。要获得无符号型则必须指定该类型为 unsigned,比如 unsigned longunsigned int 类型可以简写为 unsigned,也就是说,unsigned 后不加其他类型说明符意味着是 unsigned int 。和其他整型不同,char 有三种不同的类型:plain charunsigned charsigned char。虽然 char 有三种不同的类型,但只有两种表示方式。可以使用 unsigned char 或 signed char 表示 char 类型。使用哪种 char 表示方式由编译器而定。

6. C++ 标准并未定义 signed 类型如何用位来表示,而是由每个编译器自由决定如何表示 signed 类型。这些表示方式会影响 signed 类型的取值范围。8 位 signed 类型的取值肯定至少是从 -127 到 127,但也有许多实现允许取值从 -128 到 127。

7. C++ 中,把负值赋给 unsigned 对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。所以,如果把 -1 赋给8位的 unsigned char,那么结果是 255,因为 255 是 -1 对 256 求模后的值。当将超过取值范围的值赋给 signed 类型时,由编译器决定实际赋的值。在实际操作中,很多的编译器处理 signed 类型的方式和 unsigned 类型类似。也就是说,赋值时是取该值对该类型取值数目求模后的值。然而我们不能保证编译器都会这样处理 signed 类型。

8. 事实上,在某些应用中 char 类型被当作 signed 类型,在另外一些应用中则被当作 unsigned 类型,因此把 char 类型作为计算类型使用时容易出问题。

9. 以 0(零)开头的字面值整数常量表示八进制,以 0x0X 开头的表示十六进制。

10. 字面值整数常量的类型默认为 intlong 类型。其精度类型决定于字面值——其值适合 int 就是 int 类型,比 int 大的值就是 long 类型。通过增加后缀,能够强制将字面值整数常量转换为 longunsignedunsigned long 类型。通过在数值后面加 L 或者 l(字母“l”大写或小写)指定常量为 long 类型。定义长整型时,应该使用大写字母 L。小写字母 l 很容易和数值 1 混淆。类似地,可通过在数值后面加 Uu 定义 unsigned 类型。同时加 LU 就能够得到 unsigned long 类型的字面值常量。但其后缀不能有空格。没有 short 类型的字面值常量。通常可以用十进制或者科学计数法来表示浮点字面值常量。使用科学计数法时,指数用 E 或者 e 表示。默认的浮点字面值常量为 double 类型。在数值的后面加上 Ff 表示单精度。同样加上 L 或者 l 表示扩展精度(再次提醒,不提倡使用小写字母l)。

11. 连接字符串字面值和宽字符串字面值,其结果是未定义的,也就是说,连接不同类型的行为标准没有定义。这个程序可能会执行,也可能会崩溃或者产生没有用的值,而且在不同的编译器下程序的动作可能不同。

12. C++ 是一门静态类型语言,在编译时会作类型检查。在大多数语言中,对象的类型限制了对象可以执行的操作。如果某种类型不支持某种操作,那么这种类型的对象也就不能执行该操作。在 C++ 中,操作是否合法是在编译时检查的。当编写表达式时,编译器检查表达式中的对象是否按该对象的类型定义的使用方式使用。如果不是的话,那么编译器会提示错误,而不产生可执行文件。

13. 左值(发音为 ell-value):左值可以出现在赋值语句的左边或右边。右值(发音为 are-value):右值只能出现在赋值的右边,不能出现在赋值语句的左边。

14. 一般而言,对象就是内存中具有类型的区域。说得更具体一些,计算左值表达式就会产生对象。

15. 语言本身并没有限制变量名的长度,但考虑到将会阅读和/或修改我们的代码的其他人,变量名不应太长。

16. 除了关键字,C++ 标准还保留了一组标识符用于标准库。标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。有些标识符(在函数外定义的标识符)不能以下划线开头。(貌似属于编程风格类)

17. 类型决定了分配给变量的存储空间的大小和可以在其上执行的操作。

18. C++ 支持两种初始化变量的形式:复制初始化直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:int ival(1024);     // direct-initialization      int ival = 1024;    // copy-initialization

19. 初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替。在 C++ 中初始化和赋值是两种不同的操作。对内置类型来说,复制初始化和直接初始化几乎没有差别。对类类型的对象来说,有些初始化仅能用直接初始化完成。

20. 定义如何进行初始化的成员函数称为构造函数。和其他函数一样,构造函数能接受多个参数。一个类可以定义几个构造函数,每个构造函数必须接受不同数目或者不同类型的参数。

21. 如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的操作。它是通过定义一个特殊的构造函数即默认构造函数来实现的。这个构造函数之所以被称作默认构造函数,是因为它是“默认”运行的。如果没有提供初始化式,那么就会使用默认构造函数。不管变量在哪里定义,默认构造函数都会被使用。

22. 变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。extern 声明不是定义,也分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。

23. 只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可被当作是定义,即使声明标记为 extern:      extern double pi = 3.1416; // definition 。只有当 extern 声明位于函数外部时,才可以含有初始化式。

24. 左值被const修饰后仍然为左值,只是已经成为不可修改的左值。

25. 在全局作用域(第 2.3.6 节)里定义非 const 变量时,它在整个程序中都可以访问。非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须地指定它为 extern。我们可以把一个非 const 变更定义在一个文件中,假设已经做了合适的声明,就可在另外的文件中使用这个变量。与其他变量不同,除非特别说明,在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。通过指定 const 变更为 extern,就可以在整个程序中访问 const 对象:

      // file_1.cc // defines and initializes a const that is accessible to other files
      extern const int bufSize = fcn();
      // file_2.cc
      extern const int bufSize; // uses bufSize from file_1

26. 引用必须用与该引用同类型的对象初始化:

       int ival = 1024;
      int &refVal = ival; // ok: refVal refers to ival
      int &refVal2;       // error: a reference must be initialized
      int &refVal3 = 10;  // error: initializer must be an object

27. const 引用是指向 const 对象的引用:

       const int ival = 1024;
      const int &refVal = ival;      // ok: both reference and object are const
      int &ref2 = ival;              // error: non const reference to a const object

const 引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:

       int i = 42;
      //  legal for const references only
      const int &r = 42;
      const int &r2 = r + i;

const 引用只能绑定到与该引用同类型的对象。

const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。

 

28. typedef 通常被用于以下三种目的:

  • 为了隐藏特定类型的实现,强调使用类型的目的。

  • 简化复杂的类型定义,使其更易理解。

  • 允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。


29. 默认地,第一个枚举成员赋值为 0,后面的每个枚举成员赋的值比前面的大 1。
枚举成员值可以是不唯一的。不能改变枚举成员的值。
枚举成员本身就是一个常量表达式,所以也可用于需要常量表达式的任何地方。
每个 enum 都定义了一种新的类型。和其他类型一样,可以定义和初始化 Points 类型的对象,

也可以以不同的方式使用这些对象。枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚

举类型的其他对象来进行。

 

30. 定义类时,通常先定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其

功能所需要的数据,以及是否需要定义一些函数来支持该类的实现。

定义变量和定义数据成员存在非常重要的区别:

一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型。

类不是在类定义里定义数据成员时初始化数据成员,而是通过称为构造函数的特殊成员函数控制初始化。

 

31. 如果使用 class 关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为 private

如果使用 struct 关键字,那么这些成员都是 public

使用 class 还是 struct 关键字来定义类,仅仅影响默认的初始访问级别。

 

32. 头文件为相关声明提供了一个集中存放的位置。头文件一般包含类的定义、extern 变量的声明和函数的声明。

 

33. 对于头文件不应该含有定义这一规则,有三个例外。

头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数。

这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

 

34. 因为 const 对象默认为定义它的文件的局部变量,所以把它们的定义放在头文件中是合法的。

如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。

相反,和其他的变量一样,该 const 变量应该在一个源文件中定义并初始化。

应在头文件中为它添加 extern 声明,以使其能被多个文件共享。

 

35. 预处理器变量有两种状态:已定义或未定义。

定义预处理器变量和检测其状态所用的预处理器指示不同。

#define 指示接受一个名字并定义该名字为预处理器变量。

#ifndef 指示检测指定的预处理器变量是否未定义。

如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif

可以使用这些设施来预防多次包含同一头文件:

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

36. 如果头文件名括在尖括号(< >)里,那么认为该头文件是标准头文件。

编译器将会在预定义的位置集查找该头文件,这些预定义的位置可以通过设置查找路径环境变量或者通过命令行选项来修改。

使用的查找方法因编译器的不同而差别迥异。建议你咨询同事或者查阅编译器用户指南来获得更多的信息。

如果头文件名括在一对引号里,那么认为它是非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。

 

(本章完) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值