C++笔记(基础)基于范围的for循环 nullptr,using关键字
基于范围的for循环
int arr[] = { 1,2,3,4,5 };
for (int num : arr) {
cout
}
使用值类型变量num遍历数组arr,num是数组元素的副本,对num修改不会影响arr本身;
for (int& num1 : arr) {
num1*=2//每个元素×2
}
因为num1是对数组元素的引用,同处一块地址,所以修改的是数组元素本身;
避免不必要的拷贝(const 引用)
若只需读取元素(不修改),且元素类型较大(如自定义类对象),建议用 const auto& 避免拷贝开销:
#includestruct LargeObject { /* 假设是一个大对象 */ };int main() {std::vector objects; // 存储大对象的容器// 用 const 引用读取,避免拷贝for (const auto& obj : objects) { // const 确保不修改,& 避免拷贝// 读取 obj 的内容...} return 0;}
适用范围
范围 for 循环可遍历以下类型的对象:
原生数组(如 int arr[5])。
实现了迭代器接口的 STL 容器(std::vector、std::list、std::map 等)。
自定义类型(需提供 begin() 和 end() 方法,返回迭代器)。
限制
不能直接获取当前元素的索引(若需索引,仍需用传统 for 循环)。
不能跳过元素或反向遍历(需用迭代器手动控制)。
遍历过程中若容器被修改(如插入 / 删除元素),可能导致未定义行为(类似迭代器失效问题)。
拷贝开销的根源
“值传递” vs “引用传递”
无论是传统 for 循环还是范围 for 循环,只要是通过 “值传递” 获取元素(即不使用 &),就会产生拷贝
nullptr(关键字)
与 NULL 的区别
在C++ 中, NULL 通常被定义为 0 或((void*)0)
当使用 NULL 时,可能会在某些情况下导致重载函数匹配错误,
因为 0 可能被解释为整数而不是指针。
而 nullptr 有明确的空指针类型,能避免这种二义性,使代码更清晰、安全。
nullptr也会进行隐式转换,它可以转换为任何指针类型,
但是会有优先级的存在,所以在有重载函数调用时,不会报错
兼容性:nullptr 可隐式转换为任何指针类型(包括类成员指针),但不能转换为整数类型:
int* p1 = nullptr; // 正确:nullptr → int*
char* p2 = nullptr; // 正确:nullptr → char*
int x = nullptr; // 错误:不能转换为 int
using
using跟typedef作用相同
using INT = int;等价于typedef int INT;
模板别名:
例如, template using Vec = std::vector;
定义了 Vec 作为 std::vector 的模板别名,使用时可以像 Vec v;
这样定义一个 int 类型的向量。