在c语言中,#define宏用来定义一个常量,在程序编译时,进行文本替换,不进行类型检查而C++中的常量关键字const则可以避免这个问题,编译器实行常量展开,通过在编译时进行计算,减少运行时复杂的常量计算,而且在程序运行中,const对象可以被改变。
在c语言中,#define在头文件中,其它程序只要包含该文件便可以使用,不过在C++中const则不能这样做,C++中需要把const进行常量展开,这样就会对其进行分配内存,导致在多个cpp文件中定义而导致重复定义的错误(经过写程序测试发现没有这个问题,不知道是为什么)。但在某些情况下,C++在编译时不清楚const定义的标识符类型,就需要对其进行分配内存了,这种必须发生在定义点中,而且一旦被定义就不能改变值了。如:
- #include <iostream>
-
-
using namespace std;
-
-
const int i =100;
-
const int j= i+10;
-
long address = (long&)j;
-
char buf[j+10];
-
-
int main(){
-
-
cout << "type a character & CR"<<endl;
-
const char c = cin.get();
-
const char c2=c+'a';
-
cout << c2;
-
return 0;
-
}
临时对象
在C++中函数返回对象后或计算表达式,编译器总是创建一个临时对象,它们与其它的对象一样,创建与销毁。编译器负责管理它们,有一点很重要:它们自动都是const类型,得到它们,修改它们无疑是错误的如:
- #include <iostream>
-
-
using namespace std;
-
-
class X{
-
int i;
-
public:
-
X(int ii =0);
-
void modify();
-
};
-
-
X::X(int ii){i=ii;}
-
-
void X::modify(){i++;}
-
-
X f5(){
-
return X();
-
}
-
-
const X f6(){
-
return X();
-
}
-
-
void f7(X& x){
-
x.modify();
-
}
-
-
int main()
-
{
-
f5()=X(1);
-
//正确的,f5()返回非const对象可以被赋值
-
f5().modify();
-
f7(f5());
-
//错误,f5()返回后实际上为临时对象const类型,而f7为非const行参不能被调用
-
f6()=x(1);//错误,const为常量类型不能被赋值
-
f6().modify();//错误,const常量类型不能为修改
-
return 0;
-
}
一般const类型修饰出现在指针类型,或用户自定义类型中,这在thinking
C++中有详细描述。
阅读(1459) | 评论(0) | 转发(0) |