学习一门新的程序设计语言的最好方法就是练习编写程序!
C++基础
变量和基本类型
基本内置类型
算术类型:
/*
整型:包括字符和布尔类型,bool、char、wchar_t、char16_t、char32_t、short、int、long、long long
浮点型:float、double、long double
*/
类型转换:类型所能表示的值的范围决定了转换的过程。
字面值常量:
/*
整型:20
浮点型:3.14159
字符:'a'
字符串:"Hello World"
转义序列:/n
*/
变量
变量定义基本形式:首先是类型说明符,随后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。
int sum, value;
初始化:当对象在创建时获得了一个特定的值,就说这个对象被初始化了。初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。
double price = 109.99;
列表初始化:用花括号来初始化变量的形式被称为列表初始化。
int units_sold = 0;
int units_sold = {0};
int units_sold(0);
int units_sold{0};
标识符:由字母、数字和下划线组成,其中必须以字母或下划线开头;标识符长度没有限制,但对大小写字母敏感。
int somename, someName, SomeName, SOMENAME;//定义了4个不同的int 变量
作用域:是程序的一部分,在其中名字有其特定的含义,C++语言中大多数作用域都以花括号分隔;同一个名字在不同的作用域可能指向不同的实体;名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。主要分成全局作用域和块作用域。
复合类型
复合类型:指基于其他类型定义的类型,主要有引用和指针。
引用(reference):
为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型,其中d是申明的变量名。
引用必须初始化;
引用即别名;
int ival = 1024;
int &refVal = ival;
int &refVal2; //报错:引用必须被初始化
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头。
int i = 1024, i2 = 2048; //i和i2都是int
int &r = i, r2 = i2;//r是一个引用,与i绑定在一起,r2是int
int i3 = 1024, &ri= i3; //i3是int, ri是一个引用,与i3绑定在一起
int &r3 = i3, &r4 = i2; //r3和r4都是引用
指针(pointer):
是“指向(point to)”另外一种类型的复合类型,与引用类似,指针也实现了对其他对象的间接访问;指针与引用相比有很多的不同点,其一,指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内他可以先后指向几个不同的对象;其二,指针无须在定义时赋初值。
和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
定义指针类型的方法将声明符写成*d的形式,其中d是变量名,如果在一条语句中定义了几个指针的变量,每个变量前面都必须有符号*。
int *ip1, *ip2;//ip1和ip2都是指向int型对象得到指针
double dp, *dp2; //dp2是指向double型对象的指针,dp是double型对象
获取对象的地址:指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&)。
double dval;
double *pd = &dval; //初始值是double型对象的地址
double *pd2 = pd; //初始值是指向double对象的指针
空指针(null pointer):
不指向任何对象,在试图使用一个指针之前代码可以首先检查它是否为空。
建议初始化所有指针。
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL; //需要首先#include cstdlib
void*指针:
是一种特殊的指针类型,可用于存放任意对象的地址,一个void*指针存放着一个地址,这一点和其他指针类似;不同的是,对该地址中到底是个申明类型的对象并不了解。
void*指针能做的事情比较有限:拿它和别的指针比较、作为函数的输入或输出、或赋给另外一个void*指针;不能直接操作void*指针所指向的对象。
double obj = 3.14, *pd = &obj;
void *pv = &obj;
pv = pd;
指向指针的指针:
指针是内存中的对象,像其他对象一样也有自己的地址,因此允许把指针的地址再存放到另一个指针当中。
int ival = 1024;
int *pi = &ival;//pi指向一个int型的数
int **ppi = π//ppi指向一个int型的指针
指向指针的引用:
引用本身不是一个对象,因此不能定义指向引用的指针;但指针是对象,所以存在对指针的引用。
int i = 42;
int *p;//p是一个int型指针
int *&r = p;//r是一个对指针p的引用
const限定符
来由:希望定义这样一种变量,它的值不能被改变,所以可以用关键字const对变量的类型加以限定。
const int bufsize = 512;
任何试图为bufsize赋值的行为都将引发错误,因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化。
const int i = get_size();
const int j = 42;
const int k;//错误,k是一个未经过初始化的常量
初始化和const
只能在const类型的对象上执行不改变其内容的操作;
默认状态下,const对象仅在文件内有效,解决办法就是对于const变量不管是声明还是定义都添加extern关键字。
const引用
把引用绑定到const对象上,称之为对常量的引用。
const int ci = 1024;
const int &ri = ci;//正确,引用及其对应的对象都是常量
r1 = 42; //错误,r1是对常量的引用
int &r2 = ci; //错误,试图让一个非常量引用指向一个常量对象
【=========================================待更新=============2023.7.31========================】
处理类型
自定义数据结构
字符串、向量和数组
- 命名空间的using声明
- 标准库类型string
- 标准库类型vector
- 迭代器介绍
- 数组
- 多维数组
表达式
- 基础
- 算术运算符
- 逻辑与关系运算符
- 赋值运算符
- 递增和递减运算符
- 成员访问运算符
- 条件运算符
- 位运算符
- sizeof运算符
- 逗号运算符
- 类型转换
- 运算符优先级表
语句
- 简单语句
- 语句作用域
- 条件语句
- 迭代语句
- 跳转语句
- try语句块和异常处理
函数
- 函数基础
- 参数传递
- 返回类型和return语句
- 函数重载
- 特殊用途特性
- 函数匹配
- 函数指针
类
- 定义冲向数据类型
- 访问控制与封装
- 类的其他特性
- 类的作用域
- 构造函数再探
- 类的静态成员
C++标准库
IO库
- IO类
- 文件输入输出
- string流
顺序容器
- 顺序容器概览
- 顺序容器操作
- vector对象是如何增加的
- 额外的string操作
- 容器适配器
泛型算法
- 初识泛型算法
- 定制操作
- 再探迭代器
- 泛型算法结构
- 特定容器算法
关联容器
- 关联容器概述
- 关联容器操作
- 无序容器
动态内存
- 动态内存与智能指针
- 动态数组
- 使用标准库:文本查询程序
C++类设计者工具
拷贝控制
- 拷贝、赋值与销毁
- 拷贝控制和资源管理
- 交换操作
- 拷贝控制示例
- 动态内存管理类
- 对象移动
重载运算与类型转换
- 输入和输出运算符
- 算术和关系运算符
- 赋值运算符
- 下标运算符
- 递增和递减运算符
- 成员访问运算符
- 函数调用运算符
- 重载、类型转换与运算符
面向对象程序设计
- OOP概述
- 定义基类和派生类
- 虚函数
- 抽象基类
- 访问控制与继承
- 继承中的类作用域
- 容器与继承
- 文本查询程序再探
模板与泛型编程
- 定义模板
- 模板实参推断
- 重载与模板
- 可变参数模板
- 模板特例化
C++高级主题
标准库特殊设施
- tuple类型
- bitset类型
- 正则表达式
- 随机数
- IO库再探
用于大型程序的工具
- 异常处理
- 命名空间
- 多重继承与虚继承
特殊工具与技术
- 控制内存分配
- 运行时类型识别
- 枚举类型
- 类成员指针
- 嵌套类
- union
- 局部类
- 固有的不可移植的特性
C++11的新特性
特性 | 解释 |
long long 类型 | |
列表初始化 | |
nullptr常量 |
参考
C++ Primer(第5版).