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

关于C++关键字const的记录

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

关于C++关键字const的记录

目录

一  头文件里的const

二  const的使用

普通变量:

指针

 指向const的指针

const指针

赋值和类型检查


说明:为什么标题是关于C++ const的记录,而不是C/C++关于const的记录.这是因为C语言的const和C++的const是有点区别的.

至于什么区别,用一句话来说就是: C++中的const默认认为是内部连接,也就是说const仅在const被定义过的文件里才是可见的,而在连接时不能被其他编译单元看到.C语言的const默认认为时外部连接.

这里主要讨论C++的const,C语言的const等需要的时候在仔细研究研究.

一  头文件里的const

默认的定义const,编译器是不会给const创建存储空间的,但有两个例外:

  • 使用extern声明为外部连接
  • 取const地址

这两种情况编译器会给const分配内存空间.

二  const的使用

普通变量:
void testConst()
{
	const int i = 100;
	const int j = i + 10;
	const int *addr = &j;
	char buf[j + 10];

	std::cout << "i = " << i << std::endl;
	std::cout << "j = " << j << std::endl;
	std::cout << "j addr = " << addr << std::endl;
	std::cout << "*j addr = " << *addr << std::endl;
	std::cout << "buff sizeof = " << sizeof(buf) << std::endl;
}

输出:

 变量addr存储的是j的地址,所以*addr其实就是j,这两个是等价的,至于buf 的大小是120,是因为j=110,再加10就是120了.

指针

 指向const的指针

 注意:这里有个注意点,就是指向const的指针和下面的const指针是两回事.

const的读法:定义指针的技巧是在标识符的开始处读它,并从里向外读.

demo:

const int *u;

首先明确一下u是一个指针,所以*u是不可以分离的.然后就是按照上面的技巧,在标识符(const)开始读它."u是一个指针,它指向const int".这里不需要初始化,因为u可以指向任何标识符(也就是说,它不是一个const),但是它指向的值是不能被改变的(指向的值是const).

int const *v; 这个怎么读?

首先明确v是一个指针,所以*v是一个整体.然后按照读法,在标识符开始处读它,并从里向外.

"v是一个指针,它指向const的int的普通指针".

即,const又把int结合在一起,效果与前面定义的一样.两个定义是一样的,这一点容易让人混淆.为了使程序具有可读性,应该坚持使用第一种.

const指针

使指针本身成为一个const指针,必须把const标明的部分放在*右边:

demo:

int d =1;

int * const w;

这个的读法:"w是一个指针,它指向int的const指针";因为指针本身现在是const指针,编译器要求给它一个初始值,这个值在指针生命周期内不变.然而要改变它锁指向的值是可以改变的:

*w = 2;

如果想地址和值都不能改变应该这怎么做.

int d = 1;

const int * const x = &d; 或者

int const * const x2 = &d;

赋值和类型检查
  1. 可以把一个非const对象的地址赋值给一个const指针.
  2. 不能把一个const对象的地址赋值给一个非const指针.(当然,总能用类型转换强制进行这样的赋值,但是这是一个不好的习惯,因为这样就打破了对象的const属性以及const提供的安全性)
	int d = 1;
	const int * const w = &d;
	int* x = (int*)w;
	std::cout << "d = " << d << std::endl;
	std::cout << "w = " << *w << std::endl;
	std::cout << "x = " << *x << std::endl;

如果:

int* x = w; 这样是错误的,因为违反了第二条.但是使用强制类型转换就可以了.

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

版权所有 (c)2021-2022 MSHXW.COM

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