C/C++语言中const的用法

摘要:
指向const的指针表示它指向的地址处的值不能通过使用此指针来更改。特别强调的是,不能通过使用此指针来更改此指针。对于内部数据类型的输入参数,不要将“值传递”方法更改为“常量引用传递”。

1. const 在C和C++中的区别

C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所以在C++中const修饰的量可以用在数组的定义中。

而在C中,const是一个不能被改变的普通变量,既然是变量,就要占用存储空间,所以编译器不知道编译时的值.而且,数组定义时的下标必须为常量.

在C语言中: const int size; 这个语句是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间.

但在C++中这样写是不正确的.

C++中const默认是内部连接,如果想在C++中达到以上的效果,必须要用extern关键字. C++中,const默认使用内部连接.而C中使用外部连接.

内连接:编译器只对正被编译的文件创建存储空间,别的文件可以使用相同的表示符或全局变量.C/C++中内连接使用static关键字指定.

外连接:所有被编译过的文件创建一片单独存储空间.一旦空间被创建,连接器必须解决对这片存储空间的引用.全局变量和函数使用外部连接.通过extern关键字声明,可以从其他文件访问相应的变量和函数. C++中,是否为const分配空间要看具体情况. 如果加上关键字extern或者取const变量地址,则编译器就要为const分配存储空间.

C++中定义常量的时候不再采用define,因为define只做简单的宏替换,并不提供类型检查.

2.const指针和指向const的指针

在C语言中const指针表示该指针是一个常量,一旦进行初始化完成之后就无法改变它指向的位置。指向const的指针说明使用这个指针无法改变其指向的地址处的值,特别强调的一点是使用这个指针不能够改变。言外之意就是说,可以通过其他的方式改变。

比如:char ch='c';

const char *ptr=&ch;

*ptr='a';//这样做是不允许的

ch='a';//这样做完全可以,并且*ptr的值也是'a'

下面是从网上摘抄的对const不错的总结

const用法小结:
const最常用的就是定义常量,除此之外,它还可以修饰函数的参数、返回值和函数的定义体。
1. const修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。
const 只能修饰输入参数:
如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
将“const &”修饰输入参数的用法总结如下:
(1)对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
(2)对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
2. const 修饰函数的返回值
如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数
const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();

如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。
3. const修饰成员函数
关于Const函数的几点规则:
a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的

免责声明:文章转载自《C/C++语言中const的用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇读书笔记之:C++Primer 第4版(ch1214)比NotePad++更好的文本代码(C#)编辑器Sublime Text下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

从函数或方法返回内存 C++快速入门35

从函数或方法返回内存 让编程改变世界 Change the world by program 从函数或方法返回内存 动态内存的另一个常见用途是让函数申请并返回一个指向内存块的指针。掌握这个技巧很重要,尤其是在你打算使用由别人编写的库文件时。 如果不知道这个技巧,就只能让函数返回一个简单的标量值,如整型、浮点型或字符型。 换句话说,它既不能...

[CF]Codeforces Round #528 Div.2

Div.2还是稳定四题啊,E题还是没得办法,就争取四题再快点吧。 A(签到) 题意:写下s的第一个字符,在最右边写下s的第二个字符,在最左边写下s的第三个字符,以此类推生成字符串t,给出t,求s 找规律即可,写的还是有点慢,A题尽量控制在五分钟之内。 00:09 1A #include <bits/stdc++.h> using name...

C++学习之路 : class练习

需求: 1.作业:写一个Date类 a) 数据成员:year/month/day ok b) 提供两个构造函数 ok c) 实现功能setDate设置日期 ok d) 把时间设定为今天 setToday(); ok e) toString() 打印格式:2009/7/31 ok f) toFormatString:对于月份采用英文 September 19...

算法与数据结构(二):链表

上一篇简单的开了一个头,简单介绍了一下所谓的时间复杂度与空间复杂度,从这篇开始将陆陆续续写一下常用的数据结构:链表、队列、栈、树等等。 链表当初是我在学校时唯一死磕过的数据结构,那个时候自己还算是一个好学生,虽然上课没怎么听懂,但是课后还是根据仔细调试过老师给的代码,硬是自己给弄懂了,它是我离校时唯一能够写出实现的数据结构,现在回想起来应该是它比较简单,算...

C语言返回函数指针函数的示例代码

#include <stdio.h>#include <string.h> int CE(char *c, char *e){ if (strcmp(c, "你好") == 0) { strcpy(e, "Hello "); return 1; } strcmp(e, "S...

复杂的数据类型3 C++快速入门09

复杂的数据类型3 让编程改变世界 Change the world by program “走后门” —— 利用指针改变值 温故而知新: 创建变量时,系统将分配一些内存块用来保存它们的值; 每个内存块拥有一个独一无二的地址; 变量的地址可以用 &variablename 语法来取得;(注:& 我们称为 ”取地址” 操作符)...

最新文章