C中const和C++中const区别

上传人:飞*** 文档编号:50959783 上传时间:2018-08-11 格式:PDF 页数:11 大小:72.77KB
返回 下载 相关 举报
C中const和C++中const区别_第1页
第1页 / 共11页
C中const和C++中const区别_第2页
第2页 / 共11页
C中const和C++中const区别_第3页
第3页 / 共11页
C中const和C++中const区别_第4页
第4页 / 共11页
C中const和C++中const区别_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《C中const和C++中const区别》由会员分享,可在线阅读,更多相关《C中const和C++中const区别(11页珍藏版)》请在金锄头文库上搜索。

1、C 中 const 和 C+中 const 区别Author ByteChen Dennis Ritchie 不可否认, C 语言是一种非常成功、让人喜欢的语言(我本人就非常喜欢 C 语言),但是不可避免的,C 语言中存在一些让人匪夷所思东西。只读变量int *pa = *pa = 20;printf(“%dn“,*pa);编译器并不会像你想的那样会报错,有时候会有一个警告,有什么可能连警告都没有。你运行时才发现,a 的值已经被改掉了。关键字 const 并不能把变量变成常量!在一个符号前面加上限定符 const 只是表示不能被赋值,换句话说,它的值对这个符号来说是只读的 ,但是并不能防止通过

2、程序的内部(或者说外部)的方法来修改这个值。所在 C 语言中被 const 修饰的变量只是一个只读的变量而已。如:const int n = 100;int an; (C 不提倡这样写,可以用宏代替)但是在 C+中不是这样的,在C+中被 const 的修饰毫无疑问是常量,它的值在编译时就被确定了。const int a = 10;int *pa = *pa = 20;printf(“%dn“,*pa);上面代码在 C+中是错误的,肯定会出现编译错误。而下面代码在 C+中是很普遍的。const int n = 100;int an;而且这样的表达是很普遍的很值得提倡的表示法(C+中不提倡使用宏,

3、宏可以被常量、内联函数替代)。在 C+中的 const 属性是可以被去掉的,通过const_cast 就可以强转掉。你试过这样的代码吗?#include using namespace std;int main()const int a = 10;const int *pa = int* pb = const_cast(pa);*pb = 20;cout using namespace std; int main() const int a = 1; const int b = 2;int array a + b = 0;for (int i = 0; i int main() int i;

4、const int a = 1; const int b = 2;int array a + b = 0; for (i = 0; i #include “header.h“ using namespace std; int main() cout #include “header.h“ using namespace std; void print() cout #include “header.h“ int main() printf(“in test1:%dn“,test); test2.c #include #include “header.h“ void print() printf

5、(“in test2:%dn“,test); 错误消息 : test3 fatal error LNK1169: 找到一个或多个多重定义的符号 test3 error LNK2005: _test 已经在 test1.obj 中定义 3. C+ 中, 是否为 const 分配空间要看具体情况 . 如果加上关键字 extern 或者取 const 变量地址 , 则编译器就要为 const 分配存储空间 . 4. C+ 中定义常量的时候不再采用define, 因为 define 只做简单的宏替换, 并不提供 类型检查 . 看到 const 关键字, C+程序员首先想到的可能是const 常量。这可

6、不是良好的 条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。 const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。 const 是 constant 的缩写, “恒定不变” 的意思。被 const 修饰的东西都受到强制 保护,可以预防意外的变动, 能提高程序的健壮性。 所以很多 C+程序设计书籍 建议: “Use const whenever you need ” 。1.用 const 修饰函数的参数如果参数作输出用, 不论它是什么数据类型, 也不论它采用“指针传递”还是“引 用传递” ,都不能加 const 修饰,否则该参数将失去输出功能。 c

7、onst 只能修饰输 入参数: 如果输入参数采用 “指针传递”,那么加 const 修饰可以防止意外地改动该指针, 起到保护作用。 例如 StringCopy 函数: void StringCopy(char *strDestination, const char *strSource); 其中 strSource 是输入参数, strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。 如果输入参数采用“值传递” ,由于函数将自动产生临时变量用于复制该参数, 该输入参数本来就无需保护,所

8、以不要加const 修饰。 例如不要将函数 void Func1(int x) 写成 void Func1(const int x)。同理不要将函数 void Func2(A a) 写成 void Func2(const A a) 。其中 A 为用户自定义的数据类型。 对于非内部数据类型的参数而言,象 void Func(A a) 这样声明的函数注定效率比 较底。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的 构造、复制、析构过程都将消耗时间。 为了提高效率, 可以将函数声明改为void Func(A 如下语句将出现编译错误: char *str = GetString();

9、 正确的用法是 const char *str = GetString(); 如果函数返回值采用“值传递方式” ,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰没有任何价值。 例如不要把函数 int GetInt(void) 写成 const int GetInt(void)。 同理不要把函数 A GetA(void) 写成 const A GetA(void),其中 A 为用户自定义的 数据类型。 如果返回值不是内部数据类型, 将函数 A GetA(void) 改写为 const A / 赋值函数 ; A a, b, c; / a, b, c 为 A 的对象a = b =

10、 c; / 正常的链式赋值 (a = b) = c; / 不正常的链式赋值,但合法 如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上 例中,语句a = b = c 仍然正确,但是语句(a = b) = c 则是非法的。3. const 成员函数 任何不会修改数据成员 (即函数中的变量 )的函数都应该声明为const 类型。如果 在编写 const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员 函数,编译器将指出错误, 这无疑会提高程序的健壮性。 以下程序中,类 stack 的 成员函数 GetCount 仅用于计数,从逻辑上讲GetCount 应

11、当为 const 函数。编 译器将指出 GetCount 函数中的错误。 class Stack public: void Push(int elem); int Pop(void); int GetCount(void) const; / const 成员函数 private: int m_num; int m_data100; ; int Stack:GetCount(void) const + m_num; / 编译错误,企图修改数据成员m_num Pop(); / 编译错误,企图调用非const 函数 return m_num; const 成员函数的声明看起来怪怪的:const 关键

12、字只能放在函数声明的尾部, 大概是因为其它地方都已经被占用了。 关于 Const 函数的几点规则:a. const 对象只能访问 const 成员函数 ,而非 const对象可以访问任意的成员函数, 包括 const成员函数 . b. const对象的成员是不可修改的 ,然而 const 对象通过指针维护的对象却是可以 修改的 . c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译 时,以是否修改成员数据为依据,进行检查 . e. 然而加上 mutable 修饰符的数据成员 ,对于任何情况下通过任何手段都可修改, 自然此时的 const成员函数是可以修改它的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号