1、const概述
const单词字面意思为常数,不变的。它是c/c++中的一个关键字,是一个限定符,它用来限定一个变量不允许改变,它将一个对象转换成一个“常量”。
2、C/C++中的const的区别
2.1、C中的const
C语言中的const是一个只读变量,既然是变量那么就会给const分配内存,并且在中const是一个全局只读变量,C语言中const修饰的只读变量是外部连接。
2.2、 C++中的const
在C++中,一个const不必创建内存空间。一般说来,如果一个const仅仅用来把一个名字用一个值代替(就像使用#define一样),那么该存储局空间就不必创建。如果取一个const地址, 或者把它定义为extern,则会为该const创建内存空间。
C++中的const默认内部链接 ,extern可提高作用域使C++中的const作为外部链接(C++中其他的标识符一般默认为外部连接)。
C语言代码——内部外部展示
// 内部
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
extern const int a; //告诉编译器在a在外部
printf("a = %d \n ", a);
system("pause");
return EXIT_SUCCESS;
}
//外部
const int a = 10; //C语言中默认const是外部链接
C++代码——内部外部展示
//内部
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main(){
extern const int a;
cout << a << endl;
system("pause");
return EXIT_SUCCESS;
}
//外部
//const int a;此代码在C++中是无法使用的,因为const在C++中默认为内部链接
//所以我们需要在前面加extern以扩展const作用域
extern const int a = 10; //C++中的const默认内部链接 ,extern提高作用域
C++——const空间分配展示
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//1、const取地址 会分配临时内存
//2、extern 编译器也会给const变量分配内存
void test01() {
const int m_A = 10;
int *p = (int *)&m_A;
}
//3、 用普通变量初始化 const 的变量,会分配内存
void test02() {
int a = 10;
const int b = a;
int *p = (int *) &b;
*p = 20;
cout << "b = " << b << endl;
}
//4、 自定义数据类型加const也会分配内存
struct Role {
string m_Name ; //姓名
int m_Age;
};
void test03() {
const Role r1;
Role *p = (Role *)&r1;
p->m_Name = "胡桃";
(*p).m_Age = 16;
cout << "姓名: " << r1.m_Name << " 年龄: " << r1.m_Age << endl;
}
int main() {
//test02();
test03();
system("pause");
return EXIT_SUCCESS;
}
3、C++对C语言的加强之const
我不太会用文字表示C++对C语言const的加强,请看以下代码和其注释
C语言代码
const int A = 10; //全局变量,受到保护,不可以改
void test()
{
//A = 100;
const int B = 20; // 常变量(伪常量)
//B = 100;//不可直接修改
int * p = (int *)&B;//可以用指针修改,修改后p和B的值都为10
*p = 10;
printf("*p = %d , B = %d \n", *p, B);// p = 10 B = 10
//int arr[B]; 不可以初始化数组
}
因为,C语言中,const修饰的变量是常变量,会分配内存,所以指针修改后都会进行改变。
C++代码
const int A = 10; //全局变量,受到保护,不可以改
void test()
{
const int B = 20; //真正的常量
//B = 100;//不可直接修改
int * p = (int *)&B; //用指针修改后,p的值改变,B的值不变
*p = 10;
cout << "*p = " << *p << endl;//p = 10
cout << "B = " << B << endl;//B = 10
int arr[B]; //可以初始化数组
}
因为,C++中,const修饰的变量是真常量,不会分配内存,在用指针修改的时,会分配一临时内存,所以修改后只有*p值改变,B的值不会改变。
void text{
const int B = 20;
int * p = (int *)&B;
*p = 10;
}
——————其转变过程如下——————
int LinShi = B; //LinShi有空间
int *p = (int*)&LinShi;//*p指向的是临时的空间
//这个过程是不显示的