一、定义变量
? ? ?1、在C语言中,分为局部const、全局const。
? ? ?2、在C语言中,局部const位于栈区,可以通过指针修改变量值;全局const位于静态全局区,无法修改,如? 果修改会发生段错误。
#include<stdio.h>
const int a = 10;
void test() {
const int m_b = 100; //伪常量。
int *p = &m_b;
*p = 200;
printf("m_b: %d\n", m_b);
}
void test1() {
int *p = &a;
*p = 200;
printf("a = %d\n", a);
}
int main()
{
test();//运行结果 a = 200,局部const变量可以通过指针修改
//test1(); //运行报错,全局const不可通过指针修改
return 0;
}
? ? ? ?3、在C++中,全局const变量同样不能修改,const修饰的局部变量加载于符号表中,无法修改,但修改不会报错,只是修改不会生效。
#include<iostream>
using namespace std;
void test() {
const int m_c = 100;
int *p = (int *)&m_c;
*p = 200;
cout <<"m_c = "<< m_c << endl;
}
int main()
{
test(); //输出结果 m_c = 100
return 0;
}
? 4、避免内存分配。
? 5、指针,有指针常量,常量指针
#include <stdio.h>
void test()
{
// 指针常量,指针不能修改,但能修改指针指向的变量的值
// 即能修改指针指向的空间中存储的数据
char aptr, bptr;
char *const ptr = &aptr;
// ptr = &bptr; 报错,指针常量不可修改指针本身
//常量指针,指针指向的空间存储的数据不可修改,但是指针本身可以修改
const char *cptr = &aptr;
cptr = &bptr;
}
int main()
{
test();
return 0;
}
二、修饰函数参数
? ? ?例如,在 func(const T &a){} 中,const的作用就是保证在这个函数中,a不能被修改
三、修饰函数返回值
? ? ? 例如,运算符重载,返回值不是作为左值存在的,不希望得到 a+b = c
class A
{
public:
const A operator+(const A &a) // 返回值并不是作为左值存在的
{
}
};
四、类中常成员函数
#include <stdio.h>
class B
{
public:
const int a = 100;
const int b = 20;
int c = 30;
void func() const // 调用类中的常成员变量
{
printf("const class B\n");
}
void func()
{
printf("class B\n");
}
};
int main()
{
B b;
b.func(); // class B
const B b1;
b1.func(); // const class B
return 0;
}
输出结果