标准库类型string 字符串
标准库类型vector 动态数组
标准文件流和文件读写 fstream和stringstream
如果认定某个对象是常量表达式,可以把它声明为constexpr类型或const类型
声明变量auto:自动分析表达式的类型,推断出变量的实际类型。(定义auto必须要有初始值)
希望从初始值表达式推断出要定义的变量的类型时,用auto
cltype类型指示符:选择并返回操作数的类型(编译器会分析表达式的类型,并不真正计算表达式的值)
希望从表达式推断出要定义的变量的类型,但是又不想用这个表达式的值初始化该变量时,用decltype
Range-for语句(一种简化的for语句):
for( 定义一个变量,表示序列中的每个元素 : 要处理的序列 )
一条语句或语句块,表示对元素的处理代码;
指针存放指定类型对象的地址,要获取对象的地址,使用取地址运算符“&”
如果指针指向一个对象,则可以通过指针间接访该对象,使用指针解引用运算符“”
每个指针都有相关的类型,需要在定义指针时指出:type pointer
指针值为0时是一个空指针,即不指向任何对象的指针;生成空指针的3种方法
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
动态内存的管理方法:(1)new运算符:分配单个对象:new 类型 或者 new 类型(初始值);
分配多个连续存储的对象:new 类型[数组大小];
定位new,在指定位置分配空间:new (指针) 类型;
(使用定位new,必须包含标准库头文件)
(2)delete运算符:释放new分配的单个对象的delete形式
delete 指针;
释放new分配的数组的delete形式;
delete[ ] 指针;
定位new没有对应的delete表达式;
空悬指针:执行delete运算后,指针ip指向的空间被释放,不能再使用ip指向的内存,但是ip这个指针变量自己的存储空间不受影响
delete后的ip不是空指针,而是“空悬指针”,即指向不确定的单元
引用:左值引用:引用由类型标识符和一个取地址符(&)来定义
type& refVariable = leftValue;
引用必须被初始化,初始值是一个有内存地址的对象
引用关系:引用一旦初始化,就不能再指向其他的对象,对左值引用的所有操作都会被应用在它所指向的对象上
引用的初始化和赋值不同:初始化时引用“绑定到”一个对象
赋值时,引用被作为所绑定对象的别名
int x = 100, y = 20;
int &r = x; // r是x的引用
r = y; // r不会变成y的引用,而是x = y
指针的定义形式:类型 指针变量;
指针保存指定类型的对象的地址,一个指针可以指向同类型的不同对象
引用的定义和初始化:类型 &引用名 = 初始值;
引用是一个对象的别名,定义引用时必须用有内存地址的对象初始化
引用在初始化之后,一直指向该对象
指针间接访问,引用直接访问
有空指针,没有空引用
引用:右值引用:&&右值引用变量 = 右值表达式
右值引用只能绑定到临时对象
函数std::move函数返回给定对象的右值引用
标准库中定义
const限定指针:指向const对象的指针(非const ):const type cp; 或者type const cp;
cp是指向常量的指针,它所指向的内存中的内容不可以改变,即cp的值不能改变
指向非const对象的const指针:type const cp = initAddressValue;
cp是常量指针,初始化后值不能改变,指向固定的单元
指向const对象的const指针:const type const cp = initAddressValue;
结构体由关键字struct定义,语法形式:struct 结构体类型名{
成员声明;
};
枚举
枚举类型定义了一组命名的整数常量,以提高代码的可读性。
enum TrafficLight { red, green, yellow };
初始化string对象的方式:
string的常用操作:
读写string对象:使用标准库中iostream可以读写string对象
可以用循环读取未知数量的string对象
输入操作符返回输入流对象,如果输入流对象处于有效状态,表示没有遇到文件结束或非法输入
getline()函数:两个参数:输入流对象和存放读入字符串的string对象
从指定输入流中读取内容,遇到换行符为止;将所读内容存入指定的string对象中,流中的换行符被读取并丢弃
返回参数输入流对象
empty()函数:判断string对象是否为空,返回一个布尔值
stringObj.empty()
size()函数返回string对象的长度,即对象中字符的个数
返回的长度是string::size_type类型
允许把一个string对象的值赋给另一个string对象
也可以为string对象赋一个字符串字面值常量
string对象和C风格字符串:
字符串字面值不是string类型,而是const char*类型
string对象和C风格字符串的转换
可以将C风格的字符串直接赋给string对象,反之不可
头文件中的标准库函数:
用下标运算符可以访问string对象中指定位置的字符
string对象s的下标范围从0到s.size()-1
下标变量的类型是string::size_type
标准库类型vector
vector的用法
vector是长度可变的向量,可替代内置数组
更灵活,更高效
要使用vector,必须包含头文件
定义vector时必须指定元素的类型,格式为:
vector<元素类型> 变量名;
定义的同时可以初始化vector对象,常用方法:
列表初始化
vector svec1{“how”, “are”, “you”}; //3个元素
注意容易混淆的问题:各种括号
vector v1(10);//v1有10个int元素,每个都初始化为0
vector v2{10}; //v2有1个元素,值是10
vector v3[10]; //v3是有10个元素的数组
//每个元素都是一个空vector对象
vector v4(10, 1); //v4有10个int元素,每个都初始化为1
vector v5{10, 1}; //v5有2个int元素,值分别是10和1
vector支持的操作:
push_back()
将一个值添加到vector的末尾,并使vector的大小增加
pop_back()
删除vector对象末尾的元素(要先检测对象是否为空)
迭代器
标准库容器迭代器的类型:iterator、const_iterator
begin()和end() 操作返回容器对象上的迭代器
begin()返回指向第一个元素或字符的迭代器
end()则返回指示容器或string的最后一个元素的下一个位置的迭代器
如果容器为空,begin()和end()返回同一个迭代器,都是尾迭代器
cbegin()和cend()函数返回const_iterator
迭代器支持的运算符:
vector和string迭代器支持的运算符:
字符串流
使用时包含标准库头文件
在定义时直接用string对象初始化
strm.str(s),将字符串s复制到字符串流strm中,返回void
strm.str(),返回字符串流strm中保存的字符串的副本
函数定义
函数定义的语法形式为:返回类型 函数名(参数列表) { 函数体 }
函数一般用一个名字表示,即函数名。函数的操作数称为参数,由参数列表指定。函数的结果称为返回值,其类型称为函数返回类型。函数执行的动作在函数体中指定。
函数的参数列表不能省略。函数必须指定一个返回类型
函数声明
函数在使用之前必须声明。一个函数可以在程序中多次声明。函数定义也可以当作声明,但函数在程序中只能定义一次。函数声明由函数返回类型,函数名和形参构成。
函数重载
对不同类型的数据执行相同的一般性动作,表达相同的概念,这就用到函数重载。
C++的函数重载允许多个函数共享一个函数名,但对不同类型进行不同操作。
重载函数:函数名相同,功能类似,参数不同。例如:
void print(const int *b,const *e){…}
void print(int ia[ ],size_t size){…}
void print(const char *cp){…}
重载函数调用三种结果:
1.编译器找到一个与实参最佳匹配的函数,生成调用该函数的代码。
2.找不到任何一个函数与调用的实参匹配,编译器报告无匹配的错误信息。
3.编译器找到了多个与调用匹配的函数,而且匹配的程度一样好,此时发生二义性调用错误。
重载函数解析
作用域和存储类别
作用域
C++支持局部作用域、文件作用域、全局作用域、命名空间作用域和类作用域。
1.全局对象
在全局作用域中可以定义函数和变量,它们在程序的整个执行过程中都存在,如果没有赋值,默认为0;
2.局部对象
在函数内可以声明和定义局部对象。只在定义它的那个领域起作用。