C++学习笔记
前言
看的书是:C++ Primer Plus 第六版
第1章 预备知识
没啥要点
第2章 开始学习C++
2.1 进入C++
2.1.1 main()函数
main() //original C style
在C语言中,省略返回类型相当于说函数的类型为int,但是C++淘汰了这种用法
也有这种变体
int main(void) //very explicit style(非常明确的风格)
在括号中使用关键词void明确地指出,函数不接受任何参数。在C++(不是C)中,让括号空着与在括号中使用void等效(在C中,让括号空着意味着对是否接收参数保持沉默)
有的程序员使用以下函数头,并省略返回语句:
void main()
这在逻辑上是一致的,因为void返回类型意味着函数不返回任何值。由于这个变体不是当前标准强制的选项,在有些系统上不能工作
如果编译器到达main()函数末尾时没有遇到返回语句,则认为main()函数以如下语句结尾(基于ANSI/ISO C++标准):
return 0;
这条隐含的返回语句只适用于main()函数,而不适用于其他函数
2.1.2 C++注释
C++注释以双斜杠(//)打头,到行尾结束;可以位于单独一行,也能与代码同行
C++能识别C注释(/* */),这种注释方法能跨越多行(C99标准也在C中加入了//注释)
2.1.3 C++预处理器和 iostream 文件
# include <iostream>
using namespace std;
在进行主编译前对源文件进行处理
使用cin和cout必须包含头文件iostream
2.1.4 头文件名
有些C头文件被转换为C++头文件,这些文件被重新命名,去掉了扩展名h(使之成为C++风格的名称),并在文件名称前面加上前缀C
| 头文件类型 | 约定 | 示例 | 说明 |
|---|---|---|---|
| C++旧式风格 | 以.h结尾 | iostream.h | C++程序可以使用 |
| C旧式风格 | 以.h结尾 | math.h | C、C++程序可以使用 |
| C++新式风格 | 没有扩展名 | iostream | C++程序可以使用,使用namespace std |
| 转换后的C | 加上前缀C,没有扩展名 | cmath | C++程序可以使用,可以使用不是C的特性,如namespace std |
.h的意思就是header file
2.1.5 名称空间
如果使用iostream而不是iostream.h,则应该如下使用名称空间编译指令使iostream中的定义对程序可用:
using namespace std;
这是using编译指令
一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。
例如A和B都参与了一个文件管理系统的开发,他们都使用了同一个函数,最终在软件中调用这个函数时,编译器会不知道调用谁的
因此,将代码封装进名称空间的单元中,程序就能使用名称空间来区分函数和变量
按照这种方式,类,变量和函数便是C++编译器的标准组件,它们现在都被放置在名称空间std中(仅当头文件扩展名没有h时)
意味着iostream中定义的用于输出的cout变量其实是std::cout,而endl实际上是std::endl,因此可以省略编译指令using,用以下方法编码:
std::cout<<std:endl;
绝大多数人不喜欢这样转换,于是using编译指令应运而生。 如果使用了using namespace std;,会使std空间名称空间中所有名称都可用,但是在大型项目中是个潜在的问题
更好的方式是只使所需要的名称可用,比如:
using std::cout; // make cout available
using std::cin; // make cin available
using std::endl; //make endl available
当然对于简单的程序而言,采用何种名称空间管理方法无关紧要
2.1.6 使用cout进行C++输出
cout << "Come up and C++ me some time.";
在C++中,双括号引起的一系列字符叫字符串
<<符号表示该语句将把这个字符串发送给cout
cout是一个预定义的对象,知道如何显示字符串,数字和单个字符(对象是类的特定实例,而类定义了数据的储存和使用方式)
从概念上来看,输出是一个流,即从程序中流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的
cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中
2.2 C++语句
2.2.1 声明语句和变量
程序中的声明语句叫作定义声明语句,简称为定义。这意味着它将导致编译器为变量分配内存空间。在较为复杂的情况下还会使用引用声明,这些声明命令计算机使用在其他地方定义的变量
2.2.2 赋值语句
C++(和C)有一项不寻常的特性————可以连续使用赋值运算符
int steinway;
int baldwin;
int yamaha;
yamaha = baldwin = steinway=88;
赋值将从右向左进行
2.3 其他C++语句
2.3.1 使用cin
cin >> carrots;
如同C++将输出看作是流出程序的字符流一样,它也将输入看作流进程序的字符流,iostream将cin定义为一个表示这种流的对象
与cout一样,cin也是一个智能对象(源自C++面向对象特性)。它可以将键盘输入的内容转换为接收信息的变量能接受的形式
2.3.3 类简介
类是用户定义的一种数据类型。要定义类,需要描述它能够表示什么信息和可对数据执行那些操作
类之于对象就像类型之于变量,也就是说,类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体
类可以来自类库,ostream和istream就属于这种情况,从技术上说,它们没有被内置到C++语言中,而是语言标准指定的类
类描述指定了可对类对象执行的所有操作。要对特定对象执行这些允许的操作,需要给该对象发送一条消息,C++提供了两种发送信息的方式:
-
使用类方法(本质上是函数调用)
-
重新定义运算符(cin和cout采用的就是这种方式)
2.4 函数
C++函数分为两种:有返回值的和没有返回值的
2.4.1 使用有返回值的函数
有返回值的函数将生成一个值,这个值可赋给变量或在其他表达式中使用,例如以下函数:
x = sqrt(6.25);
表达式sqrt(6.25)被称为函数调用,被调用的函数叫做被调用函数,包含函数调用的函数叫做调用函数
圆括号中的值(这里是6.25)是发送给函数的信息,称为传递给函数。以这种方式发送给函数的值叫参数


在使用函数前,C++编译器必须知道函数的参数类型和返回值类型,否则编译器将不知道如何解释返回值。C++提供这种信息的方式是使用函数原型语句
sqrt()函数的原型像这样:
double sqrt(double);
第一个double意味着sqrt()将返回一个double值,括号中的double意味着sqrt()需要一个double参数
在程序中使用函数时,必须提供原型,有两种方法实现:
-
在源代码文件中输入函数原型
-
包含头文件(其中定义了原型)
2.4.3 用户定义的函数
void simon(int n);
开头的void表明simon()没有返回值,因此调用simon不会生成可在main()中将其赋给变量的数字,因此不能这样使用:
simple = simon(3);
第3章 处理数据
3.1 简单变量
3.1.4 无符号类型
注意整形与无符号整形的最大限度问题,超过了就会存在溢出

3.1.8 char类型: 字符和小整数
C++对字符使用单引号,对字符串使用双引号
- 成员函数cout.put()
意思是通过类对象cout来使用函数put()
例如类ostream有一个put()成员函数,只能通过类的特定对象(例如这里的cout对象)来使用成员函数。要通过对象(如cout)使用成员函数,必须用句点将对象名和函数名(put())连接起来
句点被称为成员运算符
cout.put()的意思是,通过类对象cout来使用函数put()
cout.put()产生的原因是早期cout将字符变量显示为字符,而将字符常量(如'M')显示为数字
在release 2.0之后,C++将字符常量储存为char类型,而不是int类型,这样cout就能正确处理字符常量了
- 通用字符名
通用字符名可以以\u或\U打头,\u后面是8个16进制位,\U后面则是16个16进制位。这些位表示的是字符的ISO 10646码点。
ASCII是unicode的子集,unicode与ISO 10646的标准是同步的
- singed char与unsinged char
如果将char作数值类型,则unsigned char和signed char之间的差异将非常重要。unsigned char类型的表示范围通常为0~255,signed char类型表示的范围为-128~127。假如需要使用一个char变量来储存像200这样大的值,使用unsigned char可以在任何系统上达到这种目的
3.2 const 限定符
C++有一种更好的处理符号常量的方法,即使用const关键字来修改变量声明和初始化。常量被初始化后,其值就被固定了,编译器将不允许再修改该常量的值。
创建常量通用格式如下:
const type name = value;
const优于#define语句体现在:
-
能明确指定类型
-
能使用C++的作用域规则将定义限制在特定的函数或文件中
-
可以将const用于更复杂的类型
3.3 浮点数
3.3.1 书写浮点数
C++有两种书写浮点数的方式,一种是使用常用的标准小数点表示法:
即使小数部分为0(如8.0),小数点也将确保该数字以浮点格式(而不是整数格式)表示。
第二种是E表示法:
E表示法确保数字以浮点格式储存,即使没有小数点。既可以使用E也可以使用e,指数可以是正数也可以是负数,但是数字中不能有空格,因此 7.2 E6 是违法的
3.3.2 浮点类型
C++有三种浮点类型:float,double,long double。这些类型是按它们可以表示的有效位数和允许的指数最小范围来描述的
有效位是数字中有意义的位,如14179的有效位是5,14000的有效位是是2(精确到千位了,剩下3位只是占位符)
三种浮点类型的有效位数可以一样多,通常float为32位,double为64位,long double为80、96或128位,三种类型的指数范围至少是-37到37
一个浮点数由三部分组成:符号位S、指数部分E(阶码)以及尾数部分M
float总共用32位来表示浮点数,其中尾数用23位存储,加上小数点前有一位隐藏的1(IEEE754规约数表示法),
2^(23+1) = 16777216,10^7 < 16777216 < 10^8,
所以说单精度浮点数的有效位数是7位,考虑到第7位可能的四舍五入问题,所以单精度最少有6位有效数字(最小尺寸)。
double总共用64位来表示浮点数,其中尾数用52位存储,
2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,
所以双精度的有效位数是16位。同样四舍五入,最少15位。
3.4 C++算术运算符
3.4.4 类型转换
在计算表达式时,C++将bool,char,unsigned char,signed char和short转换为int,true被转换为1,false被转换为0,这些转换被称为整型提升
强制类型转换的通用格式如下:
(typeName) value
typeName (value)
第一种格式来自C语言,第二种是C++格式
第4章 复合类型
4.1 数组
数组声明应指出以下三点:
-
储存在每个元素中的值的类型
-
数组名
-
数组中的元素数
声明数组的通用格式如下:
typeName arrayName[arraySize]
size of运算符返回的类型或数据对象的长度,单位是字节;如果将size of用于数组名,得到的将是整个数组中的字节数;如果将size of用于数组元素,则得到的将是元素的长度,单位是字节
4.1.2 数组的初始化规则
只有在定义数组的时才能使用初始化,此后就不能使用了,也不能将一个数组赋给另一个数组,但是可以用下标分别给数组中的元素赋值
如果只对数组的一部分进行初始化,则编译器将把其他元素初始化为0

浙公网安备 33010602011771号