空洞武士笔记4
之前我们记得有这样方式传参
Vector2(2,3);
类名加括号内构造函数参数,就可以创建临时对象作为形参传递。
但是有值得注意的方面,回顾以前的知识,如果不是引用传递,会复制一份,调用复制构造函数,或者调用数值复制,
但是如果值传递的对象时临时对象,仍然会调用复制构造函数,所以我们只需要写好复制构造函数即可。
void decrease(Vector2 lalala);
但是当临时对象作为实参传递的时候,并且而且是引用传递,需要我们在形参前面加const
void add(const Vector2& LALALA);
这时候我们来看看形参的const到底有那些用处
1. 防止误修改参数
- 当你在函数内部不希望修改传入的参数时,使用
const
可以确保它的值在函数内部不会被改变。这样可以避免因意外修改参数而导致的 bug。
2. 提高代码的可读性
const
明确表明了这个参数在函数内部不会被修改,从而增强了代码的可读性。其他开发人员看到const
后,就知道这个参数在函数中是只读的。
3. 允许传递临时对象
- 对于一些传递大对象的函数,如果参数是非
const
引用,编译器不允许使用临时对象传参。但如果加了const
,则可以直接传递临时对象,避免了不必要的拷贝。 - 这里我要提一点,注意时const加&引用,俩个必须同时存在
4. 可以优化性能
- 如果传递的是引用或者指针,
const
还可以帮助编译器进行优化,减少不必要的内存操作,因为编译器知道参数不会被修改。 - 性能优化的点目前可以不需要了解
用法示例:
传值的 const
参数
void printValue(const int value) {
// value 是只读的,不能修改,且调用是值传递
std::cout << value << std::endl;
}
传引用的 const
参数
void printVector(const std::vector<int>& vec) {
// vec 是 const 引用,不能修改,而且可以传递临时对象
for (const auto& val : vec) {
std::cout << val << " ";
}
std::cout << std::endl;
}
传指针的 const
参数
void printPointer(const int* ptr) {
// ptr 指向的对象是只读的,不能修改
std::cout << *ptr << std::endl;
}
- const 类型*——指的是不能修改指针对象的值,但是能修改指针指向的对象。
- 类型* const——指的是不能修改指针指向的对象,但是可以修改指针指针对象的值。
细分:
const
值参数:防止值在函数内部被修改,例如const int value
。但由于是按值传递,函数内部修改的只是参数的副本,实际不会影响调用者传入的值。加
const
是为了表达语义,并防止在函数中误修改。const
引用参数:常用于避免拷贝大对象,并确保在函数内部不会修改参数/例如
const std::vector<int>& vec
。这样传引用避免了拷贝大对象的开销,同时防止了函数修改原始对象。const
指针参数:表示指针指向的对象是不可修改的,例如const int* ptr
。在函数内部你不能修改指针所指向的数据,但指针本身可以被修改(指向别的对象)。