栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++中的const

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++中的const

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
#include
#include

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
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 
#include 
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指向的是临时的空间
//这个过程是不显示的

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037295.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号