曾多次学习过不同C++书籍的部分内容,自知没有建立起相应的学习体系。经朋友介绍,开始啃《C++ Primer》并希望这次能踏踏实实地将C++完整过一遍
第一章 开始:
1.1
- 一个函数包括:函数名,返回类型(有内置类型,可定义),形参列表,函数体(由花括号与语句块组成)。
- 注意return语句中的分号
- 大多情况下main函数返回0即为正常,反之则有错误
- IDE(集成开发环境)包括编译器与程序创建和分析功能
1.2
- 流指随着时间推移,字符是顺序生成或删除的
- cin是istream类型的对象,cout,cerr(一般输出错误信息),clog(输出程序运行时一般性信息)是ostream类型的对象
- #include<头文件名称>
- 输出运算符: <<,可以将运算结果写入左侧ostream对象
- 输入运算符: >>,可以将左侧运算对象以输入流存入右侧运算对象
- std::endl除了结束当前行,还有刷新缓冲区将所有输出信息写入输出流中
- 标准库都定义在std空间中,命名空间可以避免命名冲突
1.3
- 注释:单行//,多行/* */
1.4
- while语句反复执行语句块,直到条件为假
- 先检验条件再执行
- for循环由循环头和循环体组成。循环头由初始化语句,循环条件,表达式(注意是由分号连接)
- for循环比较简洁且适用于需要控制次数的循环,而while循环则适用于不计次数的循环(以结果为导向)
- 处于检测流状态的istream对象如果遇到文件结束符或无效输入时,istream对象状态会变为无效。如果做为条件即为假。
- windows文件结束符:crtl+z -> enter
- 编译错误:语法错误,类型错误,声明错误
- if语句后接检测流语法保证输入不为空
1.5
- 这么快就类了!!!震惊
- 头文件一般用.h做为后缀来进行命名(不属于标准库的头文件,引用的时候记得用双引号)
- 对于类的定义最关键的就是定义相关的操作!
- 成员函数是类的一部分函数,有时也称为方法
- 点运算符左侧为类对象,右侧为对象中的成员
- 使用调用运算符(),来调用成员函数
第二章 开始:
2.1
- 基本数据类型:算术类型(字符,整数型,浮点数,布尔值)和空类型(不对应具体的值)
- 1字节(byte)=8比特(bit) 1个字(word)=32比特(bit)
- 可寻址最小内存块为字节(byte),存储基本单元为字(word)
- 表现形式还分为带符号的和不带符号的
- 当明确知晓数值不可能为负时,选用无符号类型。
- 使用int执行整数运算。在实际应用中, short常常显得太小而long一般和int有一样的尺寸。如果你的数值超过了int的表示范围,选用long long
- 在算术表达式中不要使用char或bool,只有在存放字符或布尔值时才使用它们。因为类型char在一些机器上是有符号的,而在另一些机器上又是无符号的,所以如果使用char进行运算特别容易出问题。如果你需要使用一个不大的整数,那么明确指定它的类型是 signed char或者 unsigned char
- 执行浮点数运算选用 double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度运算甚至比单精度还快。long double提供的精度在一般情况下是没有必要的况且它带来的运行时消耗也不容忽视
- 不同类型之间计算存在转换关系
- 在条件中,所有非0值都会转换为bool类型的true
- 注意取模与取余的计算差别,主要是取整时一个向无穷小方向,一个向0方向
- 给无符号数赋一个负数(即给这个负数+无符号数的模)
- 默认十进制数是带符号类型,而八进制,十六进制不一定
- 字符串字面值是由字符字面值构成的数组
- 字符串不仅包含内容还包括一个空字符
- 当使用一个长整型字面值时,使用大写字母L来标记,因为小写字母l和数字1易混淆
- string:可变长字符序列
- 对象是一种能存储数据具有某种类型的内存空间
- 初始化:创建变量时赋予其初始值 赋值:消去原始值,以新值替换
- 绝大多类支持无显示初始化定义对象
- 如果使用列表初始化({ })且存在丢失信息的风险,则编译器会报错
- 建议初始化每一个内置类型的变量,不然可能会造成很严重的后果
- 声明:使得名字为程序所知 定义:创建与名字相关的实体(会申请存储空间,可能包含初始化)
- 只声明不定义:类型名前加extern
- 变量可被多次声明,但只能定义一次
- 静态类型语言:编译阶段检查类型
- 标识符:以字母,数字,下划线组合而成,只能以字母和下划线开头
- 变量名一般用小写字母,类名以大写字母开头。由多个单词组成之间要加下划线或下一单词开头大写
- 作用域分为全局作用域,块作用域。在不同的区域会指向不同的实体
- 变量前+::可输出全局变量
- 外层作用域的变量会被内层作用域的变量所掩盖
2.3
- 引用:为对象起了另一个名字且必须初始化(可理解为与某对象绑定,则无法重新绑定到另一对象)(只是一个名字并不是对象)(不能与字面值或计算结果绑定)(类型必须与对象一致)
- 初始化变量,初始值是拷贝到对象中
- 指针:1.本身就是一个对象,可以被赋值和拷贝,可指向多个对象 2.无须在定义时赋值 3.与对象类型必须匹配
- 指针存放地址,所以需要取地址符(&)来获取地址(引用不是对象,所以不能定义指向引用的指针)
- 利用指针访问对象:使用解运算符(*)
- 空指针(利用nullptr来初始化)
- 预处理器:运行在编译之前的程序
- 赋值永远改变的是等号左边的值
- 空指针对应条件false,非0指针都为true
- void*: 可以存放任意类型对象,但不能直接操作其所指对象(因为类型不明确)
- **表示指向指针的指针,若想使用最初指向的对象也需要用两个解运算符(*)
- 指针的引用:定义和使用都需要加*
2.4
- const对象不能修改其内容,但是可以拷贝给其他对象(必须初始化)
- 如果想在多个文件共享const对象,必须在前面加上extern
- 对const的引用(常量引用):不能被修改,且声明时也需要带const关键字
- 临时量对象(临时量):当编译器需要创建一个空间暂存表达式的值所临时创建的一个未命名的对象
- const引用可以绑定到普通对象上,但是不能通过const引用来对对象进行修改
- 指向常量的指针也可以指向普通对象,但是依然不能通过指针修改对象
- 常量指针:必须初始化,且存储地址不能改变。如果指向const对象则不能修改其内容,若是普通对象则可以修改
- 顶层const:本身是个常量(不允许修改自身内容),底层const:所指对象是个常量(可以修改自身内容)
- 拷入和拷出的对象要么需要有底层const资格,要么是非常量转换为常量。而顶层const则没有限制
- 一般来说,如果你认定变量是一个常量表达式,那就把它声明成 constexpr类型
- constexpr会把对象设置为顶层const类型
2.5
- 类型别名:某种类型的另一个名字,方便记忆与查找。两种方法:typedef using
- 使用类型别名后注意指针是与数据类型相连还是与声明符相连
- auto:适合不知道表达式类型情况,可以声明多个变量但必须同一类型(必须初始化)(auto会忽略顶层const,保留底层const)( 符号&,*只属于声明符,与数据类型无关。所以注意auto的初始化)
- 常量引用可以绑定字面值
- 对常量对象取地址是一种底层const
2.6
- 数据结构:把一组数据组织起来然后定义如何使用
- 类以关键字开始,在结束时要加上;
- 类一般都不定义在函数体内。类应定义于头文件中,且头文件的名字与类名相同
- #ifdef:当后接变量未定义时继续 #define:把一个名词设为预处理变量 #endif: 指令结束 (以上为头文件保护符,记着加上就行)
- 持续更新中