1.基础知识
2.变量和基本类型
指针和引用
、
空指针
const
const的引用
引用和指向const引用
只有这两种引用吗?
左值和右值
左值:左值是指可以出现在赋值运算符左边的对象,代表着一个可以定位和修改的内存位置。你可以通过左值来访问和修改内存中的某个值。左值具有持久性,通常是变量或者可以取得地址的对象。
int a = 10; a = 20; // a是一个左值
右值:右值是指不能出现在赋值运算符左边的表达式。右值代表的是临时值,通常是计算结果或者字面值,它不一定指向一个固定的内存位置。右值通常没有持久性,不能获取地址,生命周期通常非常短。
int x = 10; // 10 是纯右值 int y = x + 5; // x + 5 是纯右值
指针、指向常量的指针、常量指针、指向常量的常量指针
int a = 10; int b = 20; // 普通指针 int* ptr1 = &a; *ptr1 = 30; // 修改 a 的值 // 指向常量的指针 const int* ptr2 = &a; // *ptr2 = 40; // 错误:不能通过 ptr2 修改 a ptr2 = &b; // 可以修改 ptr2 的地址 // 常量指针 int* const ptr3 = &a; *ptr3 = 50; // 可以通过 ptr3 修改 a // ptr3 = &b; // 错误:不能修改 ptr3 的地址 // 指向常量的常量指针 const int* const ptr4 = &a; // *ptr4 = 60; // 错误:不能通过 ptr4 修改 a // ptr4 = &b; // 错误:不能修改 ptr4 的地址
顶层const和底层const
int a = 10; const int b = 20; // 顶层const:指针本身是常量 int* const p1 = &a; // p1的地址不能变,但*p1可以变 *p1 = 30; // 合法 // p1 = &b; // 非法,p1是顶层const // 底层const:指针指向的对象是常量 const int* p2 = &b; // *p2不能变,但p2的地址可以变 p2 = &a; // 合法 // *p2 = 40; // 非法,p2是底层const // 顶层const + 底层const const int* const p3 = &b; // p3的地址和*p3都不能变 // p3 = &a; // 非法 // *p3 = 50; // 非法
3.字符串、向量和数组
vector
1.不能用for循环向vector对象添加元素
2. 不能用下标添加元素,通过push_back语句
3.vector和string对比
(1)本质都为动态数组,但是vector可以存储任意类型元素,string只能存储字符类型。
(2)二者都支持动态内存分配,可自动调整内存大小,元素超过容量时都会分配更大的内存块,并将原有数据复制过去。
(3)具有相似的成员函数,支持拷贝、赋值、运算。string提供了字符串独有的操作。
(4)都支持迭代器。(迭代器规则:begin()
:指向容器的第一个元素;end()
:指向容器中最后一个元素的下一个位置(即“末尾后”的位置,不指向有效元素)。
if(s.begin!=s.end)//确保s非空
4.迭代器
凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。