C++ const用法详解

2023-05-16

const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。

目录

一、const的作用

二、const修饰普通类型的变量

三、const修饰指针变量

四、const参数传递和函数返回值。

五、const修饰类成员函数。

        总结

        参考文档




一、const的作用

const的作用如下表所示:

No.作用说明参考代码
1可以定义const常量const int Max = 100; 
2便于进行类型检查const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

void f(const int i)

{

        .........

}

//对传入的参数进行类型检查,不匹配进行提示

3可以保护被const修饰的东西防止意外的修改,增强程序的健壮性。

void f(const int i)

{

        i=10;//error!

}
//如果在函数体内修改了i,编译器就会报错

4可以很方便地进行参数的调整和修改同宏定义一样,可以做到不变则已,一变都变。
5为函数重载提供了一个参考

class A
{
public:
  void f(int i){......} //一个函数
  void f(int i) const {......} //上一个函数的重载
};

6可以节省空间,避免不必要的内存分配const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝

#define Pi 3.14159              //常量宏

double a=pi;          //编译期间进行宏替换,分配内存

double b=Pi;          //再进行宏替换,又一次分配内存!

......
const doulbe  Pi=3.14159;  //此时并未将Pi放入ROM中
double a=Pi;           //此时为Pi分配内存,以后不再分配!
double b=Pi;          //没有内存分配

7提高了效率编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

二、const修饰普通类型的变量

1、const修饰普通类型的变量被赋值后,其值不允许被修改。

const int  a = 7; 
a = 8;       // 错误,a 被编译器认为是一个常量,其值不允许修改。

2、const int a和intconst a两者定义的性质一样。

三、const修饰指针变量

const 修饰指针变量有以下三种情况。
(1)如果const位于 * 的左侧,const 修饰指针指向的内容,则内容为不可变量,简称左定值;

int a = 7;
int b = 8;
const int* c = &a;
*c = b; //错误:指针指向的内容不可修改
c = &b;//正确:指针可以修改

(2)如果const位于*的右侧,const 修饰指针,则指针为不可变量,简称右定向;

int a = 7;
int b = 8;
int* const c = &a;
*c = b; //正确:指针指向的内容可修改
c = &b;//错误:指针为不可变量

(3)const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。

int a = 7;
int b = 8;
const int* const  c = &a;
*c = b;//错误:指针指向的内容不可修改   
c = &b;//错误:指针为不可变量

根据上面三种情况总结出便于记忆的话:"左定值,右定向,const修饰不变量"

四、const参数传递和函数返回值。

1、const传递参数

对于 const 修饰函数参数可以分为三种情况:

(1)值传递的 const 修饰传递,传递过来的参数在函数内不可以改变。

#include<iostream>

using namespace std;

void func(const int p)
{
        cout << "p = " << p << endl;
        //++p;//错误:p值不能修改
}

int main()
{
        int a = 10;
        int b = 20;
        func(a);
        func(b);
        return 0;
}

(2)当 const 参数为指针时,可以防止指针被意外篡改。

#include<iostream>

using namespace std;
int b = 30;
void func(int* const  p)
{
    cout << "*p = " << *p << endl;
    ++*p;
    //p = &b;//错误:p不能被修改
}

int main()
{
    int a = 10;
    func(&a);
    cout << "a = " << a << endl;
    return 0;
}

(3)自定义类型的参数传递,需要临时对象复制参数,对于临时对象的构造,需要调用构造函数,比较浪费时间,因此我们采取 const 外加引用传递的方法。并且对于一般的 int、double 等内置类型,我们不采用引用的传递方式。同时,传递的对象不能被修改。

/*定义一个学生类,获取学号*/
#include<iostream>
 
using namespace std;
 
class Student
{
public:
    Student(){}
    Student(int num):number(num){}
    int get_number()const
    {
       return number;
    }
    int set_number(int num);
private:
    int number;
};

void get_student_number(const Student& stu)
{
    cout<<stu.get_number()<<endl;
    //stu.set_number(3333);//对象stu不能被修改
}

int Student::set_number(int num)
{
    this->number = num;
    return this->number;
}

int main(void)
{
    Student RF(1001);
    get_student_number(RF);
    int rf_num = RF.set_number(2222);
    cout << "rf_num = " << rf_num << endl;
    return 0;
}

2、const 修饰函数的返回值

Const 修饰返回值分三种情况。

        (1)const 修饰内置类型的返回值,修饰与不修饰返回值作用一样,因此这种写法没有意义。

const int func1()
{
    return 1;
}
 
int func2()
{
    return 2;
}

        (2)const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。

        (3)const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想让用户干什么。

        一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为const(const A test = A 实例)或某个对象的引用为const(const A& test = A实例) ,则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。

五、const修饰类成员函数。

        const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。


总结

关const一般的考点有两点:

1、const与define的区别

2、const char a,const char* a, char* const a 的含义。

参考文档

https://blog.csdn.net/Eric_Jo/article/details/4138548

https://www.cnblogs.com/Forever-Kenlen-Ja/p/3776991.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ const用法详解 的相关文章

随机推荐

  • pugixml使用笔记

    https pugixml org docs manual html dom tree pugixml官方使用手册 1 创建xml文件信息 例如 xff1a pugi xml document xmldoc pugi xml node de
  • QQ情话糖果情话内容获取并保存

    1 下载夜神模拟器 xff0c 打开应用商店下载xposed和qq xff0c xposed里面安装trustmealready 2 打开模拟器里面的wifi设置代理 xff0c 电脑fiddler抓包 设置代理方法 1 电脑打开fiddl
  • Qscrollarea去除边框的办法

    1 代码去除 QScrollArea是派生于QFrame xff0c 如果设置QFrame的FrameShape值为NoFrame那么就可以实现边框去除 ui gt scrollArea gt setFrameShape QFrame No
  • 简单VS问题 VS2017 文件高级保存选项显示设置

    在用VS2015的时候可以在文件 文件高级保存选项中 但是在VS2017中 xff0c 这个功能不见了 xff0c 按下面方法就可以给弄出来了 1 工具 自定义 xff1b 2 点击 命令 标签 xff1b 3 在上方单选区选中 菜单栏 x
  • Qt程序启动画面播放(gif与swf两种动画格式)

    学习Qt有一段时间了 xff0c 发现一个小问题 xff0c 网上关于Qt的资料或者总结性的学习及应用文章有点少 比如 xff0c Qt完整的API xff0c 程序运行之前的启动画面如何按理想效果播放等 xff0c 每次想在项目中添加一些
  • 自己总结的QT相关资料和网址汇总

    QT官网 xff1a http www qt io download QT项目源码 xff1a http download qt io QT编程指南 xff1a https lug ustc edu cn sites qtguide QTD
  • QT程序异常结束 处理方式

    运行几个网上的程序都出现如下程序异常结束 xff0c 感觉没有任何错误 xff0c 所以就去网上搜索解决方案 xff1a 很多人都说是 xff1a 1 环境问题 2 要不就是编译器选择不符 3 还有就是有的人是在动态编译的时候提示缺少一些d
  • 【Windows版】CMake安装教程

    一 参考资料 windows 43 cmake 43 mingw 搭建c c 43 43 开发环境 二 步骤 1 官网下载CMake安装包 CMake官网 2 解压安装包 D 360Downloads Software CMake cmak
  • GNSS入门2-RTD, RTK,精度

    2 1 RTD vs RTK RTD xff08 Real Time Differential xff09 xff1a 实时码 xff08 C A码 P码 xff09 相位差分技术 xff0c 流动站与基站距离需小于100km xff0c
  • 关于嵌入式开发的C语言基础总结

    一 位操作 C语言支持的6种位操作符如下 xff1a 1 不改变其他位的值的状况下 xff0c 对某几个位进行设值 方法 xff1a 先对需要设置的位用 amp 操作符 xff08 对应位 amp 0 xff09 进行清零操作 xff0c
  • STM32 ASSERT断言机制

    调试代码经常会有跑崩的时候 xff0c 当整机调试是出问题特别让人崩溃 xff0c 断言机制能很好的定位由于参数错误导致的系统异常的情况 在代码重要的代码区 xff0c 添加断言 xff0c 相当于对出入参数做了预判操作 xff0c 当参数
  • 舵机抖动的原因分析

    舵机抖动 舵机在很多场合都会用到 xff0c 比如航模 云台等 但有时候舵机会莫名的出现抖动 xff0c 最近我也遇到了这个问题 xff0c 花了两天的时间终于解决了 舵机抖动的原因主要有以下几点 xff1a 1 电源电压不足 xff1a
  • ubuntu系统python实现串口通信

    我使用的是USB TTL串口 xff0c 下面是测试之前的一些准备工作 span class token function ls span dev span class token comment 查看设备 xff0c 插拔串口设备注意有没
  • __FILE__,__func__,__LINE__用法举例

    C语言中 xff0c FILE func LINE 常用于logout xff0c 打trace xff0c debug调试 注意 xff1a 其使用不需要定义 xff0c FILE 指示当前文件名 func 指示当前函数名 LINE 指示
  • STM32 串口超时中断+DMA接收不定长数据 比 空闲中断(IDLE)更加灵活、稳定(一)

    前言 xff1a 最近项目有使用串口接收大段不定长GPS数据的需求 xff0c 调试了很久 xff0c 终于找到一个比较好的解决办法 我觉得这个项目需求 xff08 高波特率 大段数据 不定长 xff09 十分典型 xff0c 所以在这里记
  • STM32串口通信(基于缓冲区)

    一 串口的初始化和中断设置 1 初始化GPIO xff1a 根据手册的8 1 11节 xff0c 我们可以找到下表 xff1a 在全双工的模式下 xff0c 发送引脚需要设置为推挽复用输出 xff0c 接收引脚则设置为浮空输入或带上拉的输入
  • STM32与C#上位机串口通信示例

    1 概述 串口通信是一种非常常用的通信方式 xff0c 本文首先介绍了串口硬件和协议的相关内容 xff0c 然后给出一个STM32与C 上位机通过串口通信的示例 2 串口介绍 参考这份文档 3 通信协议 为了方便数据传输 xff0c 定义了
  • 【转】23个常用的VSCode快捷键(动图演示)

    尽管我们经常使用 VS Code中的许多快捷方式 xff0c 但是我们有可能会忘记它们 这里用可视化制作了一些GIF xff0c 以便更好地记住它们 xff0c 希望对你有所帮助 VSCode中的每个命令也可以通过使用CTRL 43 SHI
  • HI3531编码h.264文件播放偏慢分析随笔

    现象 xff1a 编码h 264文件播放时 xff0c 无论帧率是30fps还是60fps xff0c 播放器显示帧率为25 fps 探索过程 xff1a cat proc umap venc 显示得知 xff0c 编码的的确是30fps和
  • C++ const用法详解

    const 是C 43 43 中常用的类型修饰符 常类型是指使用类型修饰符const说明的类型 xff0c 常类型的变量或对象的值是不能被更新的 目录 一 const的作用 二 const修饰普通类型的变量 三 const修饰指针变量 四