C++专题:const那点事儿
限定符
const是老生常谈的话题了,不管是面试还是平时工作都会经常遇到,你真的对它了解了么?我这里主要是从三个维度进行总结,并进行实例验证。
一.使用场景
- const修饰内置类型:
// 以下两种表达是等价的
const int a = 0;
int const b = 1;
a = 1; // 不允许,编译报错
b = 2; // 不允许,编译报错
- const修饰指针
int age = 1;
const int *p = &age; // 不能使用p修改其指向的内存,*p是常量
int* const q = &age; // 不能改变指针指向的位置,q是常量
int sage = 2;
p = &sage; // 允许
*p = 3; // 不允许
*q = 4; // 允许
q = &sage // 不允许
- const修饰函数
int f() const {} // 表示该函数函数不能修改成员变量的值(针对类)
const int f() {} // 表示该函数的返回值,没什么意义,函数返回值是匿名临时变量,函数调用完成会销毁,所以本质上没有什么作用
二.内存分配
- const修饰全局变量
#include <iostream>
using namespace std;
const int a = 0;
int main() {
}
汇编代码如下:
a.out: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
0000000100000fb0 _main:
100000fb0: 55 pushq %rbp
100000fb1: 48 89 e5 movq %rsp, %rbp
100000fb4: 31 c0 xorl %eax, %eax
100000fb6: 5d popq %rbp
100000fb7: c3 retq
Contents of section __text:
100000fb0 554889e5 31c05dc3 UH..1.].
Contents of section __unwind_info:
100000fb8 01000000 1c000000 00000000 1c000000 ................
100000fc8 00000000 1c000000 02000000 b00f0000 ................
100000fd8 34000000 34000000 b90f0000 00000000 4...4...........
100000fe8 34000000 03000000 0c000100 10000100 4...............
100000ff8 00000000 00000001 ........
- extern修饰const全局变量
#include <iostream>
using namespace std;
extern const int a = 888;
int main() {
}
汇编代码如下:
a.out: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
0000000100000fa0 _main:
100000fa0: 55 pushq %rbp
100000fa1: 48 89 e5 movq %rsp, %rbp
100000fa4: 31 c0 xorl %eax, %eax
100000fa6: 5d popq %rbp
100000fa7: c3 retq
Contents of section __text:
100000fa0 554889e5 31c05dc3 UH..1.].
// 区别在这,常量区,100000fa8是内存地址,78030000是字面值888
Contents of section __const:
100000fa8 78030000 x...
Contents of section __unwind_info:
100000fac 01000000 1c000000 00000000 1c000000 ................
100000fbc 00000000 1c000000 02000000 a00f0000 ................
100000fcc 34000000 34000000 a90f0000 00000000 4...4...........
100000fdc 34000000 03000000 0c000100 10000100 4...............
100000fec 00000000 00000001 ........
- const修饰局部变量
#include <iostream>
using namespace std;
int main() {
const int a = 0;
}
汇编代码如下:
a.out: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
0000000100000fa0 _main:
100000fa0: 55 pushq %rbp
100000fa1: 48 89 e5 movq %rsp, %rbp
100000fa4: 31 c0 xorl %eax, %eax
// 区别在这,局部变量是分配了内存的,将0赋值给栈中的变量(占用栈空间)
100000fa6: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
100000fad: 5d popq %rbp
100000fae: c3 retq
Contents of section __text:
100000fa0 554889e5 31c0c745 fc000000 005dc3 UH..1..E.....].
Contents of section __unwind_info:
100000fb0 01000000 1c000000 00000000 1c000000 ................
100000fc0 00000000 1c000000 02000000 a00f0000 ................
100000fd0 34000000 34000000 b00f0000 00000000 4...4...........
100000fe0 34000000 03000000 0c000100 10000100 4...............
100000ff0 00000000 00000001 ........
三.C vs C++的const
关于这个问题,之前没有了解过,查找书籍没有得到比较满意的答复,这里借用这个小哥哥的博文,自己感觉写的挺好的,学习一下,后续再验证。详情点我

浙公网安备 33010602011771号