LOADING

加载过慢请开启缓存 浏览器默认开启

const的常用场景

空洞武士笔记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——指的是不能修改指针指向的对象,但是可以修改指针指针对象的值。

细分:

  1. const 值参数:防止值在函数内部被修改,例如 const int value

    但由于是按值传递,函数内部修改的只是参数的副本,实际不会影响调用者传入的值。加 const 是为了表达语义,并防止在函数中误修改。

  2. const 引用参数:常用于避免拷贝大对象,并确保在函数内部不会修改参数/

    例如 const std::vector<int>& vec。这样传引用避免了拷贝大对象的开销,同时防止了函数修改原始对象。

  3. const 指针参数:表示指针指向的对象是不可修改的,例如 const int* ptr。在函数内部你不能修改指针所指向的数据,但指针本身可以被修改(指向别的对象)。