ZhiBing's blog(码上看世界) ZhiBing's blog(码上看世界)
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)

ZhiBing Zheng

时间会回答成长
首页
  • Linux工具链

    • shell命令
  • 构建

    • CMake
    • Makefile
  • 版本管理

    • Git
    • Github
  • IDE及工具

    • vscode
    • CLion
  • 设计模式

    • 设计原则
  • 编程语言

    • C++
    • Go
    • Python
    • Shell
  • 调试

    • gdb
  • 开发者测试

    • gtest
  • 系统支撑

    • 操作系统
  • 性能优化

    • 编译优化选项
    • perf
    • valgrind
  • 容器

    • Docker
  • 微服务

    • Rancher
  • 其他
  • 随笔
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
关于
GitHub (opens new window)
  • 编程语言

    • C++

      • shared_ptr(智能指针)
      • unique_ptr
      • bind函数
      • cout
      • C++ main函数的传入参数(argc, argv)
      • GLog使用
      • signals2
      • 编译期分派
      • 成员函数的调用效率
      • 返回值优化
      • 函数调用栈
      • 空类大小
      • 指针和数组的区别
      • 遵守三五原则
      • const限定符
        • const & define & enum
        • const & 指针
        • const & 引用
        • const & 类
        • const & 函数
      • static限定符
      • virtual限定符
      • 常用的CXX_FLAGS
      • 模版之AnyType
      • 模版之编译期断言
      • 模版之变参模板
    • Go

    • Python

    • shell

    • Rust

  • 调试

  • 开发者测试

  • 系统支撑

  • 性能优化

  • 通用领域
  • 编程语言
  • C++
zhengzhibing
2022-06-16
目录

const限定符

# const 限定符

const限定符,限定变量的值不能被改变,更准确的说是不能通过这个变量去改变这个变量的值,因为有指针和引用这两个东西。

# const & define & enum

这三者都能够定义常量:

  • const:
    • 有类型检查
    • 不会改变变量的作用域
  • define:
    • 没有类型安全检查
    • 直接替换字符串
    • 作用域从定义到文件尾,这里的文件尾是预编译处理时的文件展开的文件尾,除非使用**#undef**
  • enum:
    • 有类型检查
    • 只能是整型
    • 定义一类相关的常量,enum 变量的值只能是这一类常量,安全性更高

# const & 指针

有时候很容易搞混淆,指针常量,常量指针(指向常量的指针)傻傻分不清。关键点在于要搞清楚const修饰的是谁。

int* a = nullptr;
const int* a = nullptr;
int* const a = nullptr;
const int* const a = nullptr;
1
2
3
4

对于const int* a = nullptr;,首先看const修饰的是int* a, 大家都知道a是指针,*a是a指针指向的值。那么const int* a = nullptr;就表示a指针指向的值不能通过*a去改变,不严谨的说,也就是a是指向常量的指针。a不一定要指向一个常量,编译器也不会去检查a是否真的指向的是一个常量,a也可以指向一个变量,只是不能通过*a去改变值而已。

对于int* const a = nullptr;,还是同样的思路,const修饰的是a,也就是说a的值不能改变,即a是指针常量;

那对于 const 修饰的函数入参和返回值都是如此。

# const & 引用

这里要说的不是const修饰引用表示不能通过这个引用去改变它的值,而是可以用右值来初始化const 左值引用,即const int& a = 5。5是一个亡值,不能取地址,也就无法引用它,但const修饰后,可以在数据段开辟一个值为5的无名整型量,然后a与这个整型量进行绑定。

# const & 类

类中定义的常量只能通过初始化列表的形式进行初始化或者声明立即初始化,当然,使用了static就可以在类外进行初始化了。

# const & 函数

  1. const 不能修饰非成员函数。
  2. const 修饰的成员函数不能访问非 const 成员。
  3. const 是作为函数签名的一部分。

const修饰的函数中不能访问非const变量。也就是说void Func();和void Func() const;是两个不同的函数。

#C++
上次更新: 2022/06/17, 07:22:19
遵守三五原则
static限定符

← 遵守三五原则 static限定符→

最近更新
01
HPE gen10 plus 安装ESXI 7
06-12
02
ESXI 7安装黑群晖
06-12
03
ESXI 7安装win10
06-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 ZhBing Zheng | 粤ICP备2022062743号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式