揭秘const的神奇之处

简介: 当我们提到const时,通常会想到它作为常量的用途。然而,实际上它的最大魅力在于可以修饰函数的参数和返回值。在本文中,我将为您揭开关于const的一些秘密。

目录

前言

  1. 用const修饰函数的参数
    • 参数为输出类型的情况
    • 参数采用指针传递方式
    • 参数采用值传递方式
  2. 用const修饰函数的返回值
    • 返回值为指针传递方式的情况
    • 返回值为值传递方式的情况

总结

前言

当我们提到const时,通常会想到它作为常量的用途。然而,实际上它的最大魅力在于可以修饰函数的参数和返回值。在本文中,我将为您揭开关于const的一些秘密。

一. 用const修饰函数的参数

  1. 如果参数是输出类型,不论采用何种传递方式,都无法用const修饰,否则参数将失去输出功能。const仅适用于输入参数。

    如果输入参数采用“指针传递”的方式,那么在参数上加const修饰可以防止意外地改动指针指向的内存单元,从而起到保护作用。

    void someFunction(const int *source, int *destination) {
         
        // 使用const修饰的source指针,不能通过source指针改变内容
        // destination指针没有const修饰,可以改变指向的内存内容
    }
    
  2. 如果还想保护指针本身,还可以声明指针本身为常量,防止该指针的值被改变。

    void test3() {
         
        int n = 10;
        int m = 20;
        int *const p = &n; // p是一个常量指针,不能改变其指向的地址
        *p = 20; // 可以通过p指针改变n的值
        p = &m; // 错误,不能改变常量指针的值
    }
    

二. 用const修饰函数的返回值

  1. 如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针(除非强制转型)。

    const int* someFunction() {
         
        // ...
    }
    
    void test() {
         
        const int* ptr = someFunction(); // 合法,因为someFunction返回的指针是const int*
        *ptr = 10; // 错误,不能通过ptr来修改指向的内容
    }
    
  2. 如果函数采用“值传递”的方式,在一般情况下有余函数会把返回值拷贝到外部临时存储单元,所以加const修饰没意义。

    但当函数以值传递方式返回自定义的数据类型、返回引用或者返回指针时,有人会把函数当左值使用,为防止此种错误发生,可以使用const来修饰返回值。

请注意以上示例代码中的注释,它们解释了const在不同情况下的作用。在编写代码时,根据实际需要使用const来保护数据和指针的不可修改性,有助于提高代码的可靠性和可读性。

总结:

const关键字在C语言中用于指定变量或指针的不可修改性,可以应用于函数的参数和返回值。在本文中,我们讨论了const在函数参数和返回值中的使用。

在函数参数方面,我们了解到:

  • const不能用于输出类型的参数,因为它们需要能够在函数内部被修改以传递结果。
  • 对于采用指针传递方式的参数,可以使用const修饰来防止意外修改指针所指向的内存内容,从而提高代码的安全性。
  • 可以使用const修饰指针本身,将其声明为常量,从而保护指针本身的值不被修改。

在函数返回值方面,我们了解到:

  • 如果函数返回一个指针传递的值,并将其用const修饰,那么返回值(即指针)的内容不能被修改,只能赋给使用const修饰的同类型指针。
  • 对于采用值传递方式的函数返回值,一般情况下不需要使用const修饰,因为返回值会被拷贝到外部临时存储单元,不会影响原始值。

最后,使用const关键字可以增加代码的可靠性和可读性,防止意外的数据修改和指针误用。在编写函数时,根据函数的实际需求来合理地应用const修饰,有助于编写更安全和健壮的代码。​

相关文章
C++ --- error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”
C++ --- error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”
300 0
|
3月前
|
编译器
【Bug记录】C2662:不能将this指针从const转换为非const
【Bug记录】C2662:不能将this指针从const转换为非const
|
5月前
|
JavaScript
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
|
6月前
const的定义和使用解析
const的定义和使用解析
|
6月前
|
安全 编译器 Linux
【C++中的const函数】何时与如何正确声明使用C++ const函数(二)
【C++中的const函数】何时与如何正确声明使用C++ const函数
61 0
|
6月前
|
C++
无法将参数1从“const char [6]”转换为“char *”的解决方法
无法将参数1从“const char [6]”转换为“char *”的解决方法
|
6月前
|
C++
C++引用与const
C++引用与const
|
C++ Windows
VS2019错误:_main已经在.obj中定义,找到一个或多个重定义符号
VS2019错误:_main已经在.obj中定义,找到一个或多个重定义符号
1792 0
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
【C++】 --- 如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
141 0
map使用const char*作为key值查找注意事项
map使用const char*作为key值查找注意事项