Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493466
  • 博文数量: 72
  • 博客积分: 1851
  • 博客等级: 上尉
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 17:50
文章分类

全部博文(72)

文章存档

2013年(1)

2012年(17)

2011年(51)

2010年(3)

分类: C/C++

2011-03-19 16:08:06

    在c语言中,#define宏用来定义一个常量,在程序编译时,进行文本替换,不进行类型检查而C++中的常量关键字const则可以避免这个问题,编译器实行常量展开,通过在编译时进行计算,减少运行时复杂的常量计算,而且在程序运行中,const对象可以被改变。

    在c语言中,#define在头文件中,其它程序只要包含该文件便可以使用,不过在C++const则不能这样做,C++中需要把const进行常量展开,这样就会对其进行分配内存,导致在多个cpp文件中定义而导致重复定义的错误(经过写程序测试发现没有这个问题,不知道是为什么)。但在某些情况下,C++在编译时不清楚const定义的标识符类型,就需要对其进行分配内存了,这种必须发生在定义点中,而且一旦被定义就不能改变值了。如:

  1. #include <iostream>

  2. using namespace std;

  3. const int i =100;
  4. const int j= i+10;
  5. long address = (long&)j;
  6. char buf[j+10];

  7. int main(){

  8.         cout << "type a character & CR"<<endl;
  9. const char c = cin.get();
  10. const char c2=c+'a';
  11. cout << c2;
  12. return 0;
  13. }

临时对象

C++中函数返回对象后或计算表达式,编译器总是创建一个临时对象,它们与其它的对象一样,创建与销毁。编译器负责管理它们,有一点很重要:它们自动都是const类型,得到它们,修改它们无疑是错误的如:

  1. #include <iostream>

  2. using namespace std;

  3. class X{
  4. int i;
  5. public:
  6.  X(int ii =0);
  7. void modify();
  8. };

  9. X::X(int ii){i=ii;}

  10. void X::modify(){i++;}

  11. X f5(){
  12.    return X();
  13. }

  14. const X f6(){
  15.   return X();
  16. }

  17. void f7(X& x){
  18.   x.modify();
  19. }

  20. int main()
  21. {
  22.   f5()=X(1);
  23. //正确的,f5()返回非const对象可以被赋值
  24.   f5().modify();
  25.   f7(f5());
  26. //错误,f5()返回后实际上为临时对象const类型,而f7为非const行参不能被调用
  27.   f6()=x(1);//错误,const为常量类型不能被赋值
  28.   f6().modify();//错误,const常量类型不能为修改
  29.   return 0;
  30. }

一般const类型修饰出现在指针类型,或用户自定义类型中,这在thinking C++中有详细描述。

阅读(1466) | 评论(0) | 转发(0) |
0

上一篇:组合算法

下一篇:编译,安装linux内核

给主人留下些什么吧!~~