const对象和成员函数
用户定义类型和内部类型一样,都可以定义const对象,比如
const Hony h(3);
对于const成员函数,就是告诉编译器该成员函数可以为一个const对象所调用,当然非const对象也能调用。然而这就出现个问题怎么声明const成员函数,这里用了个新的语法形式,把修饰符const放在函数参数表的后面。
{
int i;
public :
X( int ii);
int f() const ; // const成员函数
};
X::X( int ii):i(ii) {}
int X::f() const { return i; }
int main()
{
X x1( 10 );
const X x2( 20 );
x2.f();
}
注意,关键字const必须用同样的方式出现在定义里。const成员函数就认为在这个函数里面不会修改任何数据成员,所以它满足const对象的意义。但是对于普通的成员函数就没有这个假定,这时const对象调用这种函数就会出错。而且规定const对象只能调用const成员函数。
按位const和按逻辑const
按位const意思是对象中的每个字节都是固定的,所以对象的每个位映像从不改变。
按逻辑const意思是,虽然整个对象从概念上讲是不变的,但是可以以成员为单位改变。
对于第一种,有两种方法可以改变成员数据,一是"强制转换常量性",二是用C++的关键字const_cast<typeid>
{
int i;
public :
Y();
void f() const ;
};
Y::Y() { i = 0 ; }
void Y::f() const
{
i ++ ; // error
((Y * ) this ) -> i ++ ; // OK 强制转换常量性
(const_cast < Y *> ( this )) -> i ++ ; // C++中支持的常量安全转换
}
int main()
{
const Y y1;
y1.f();
}
不过这两个办法都是隐藏在类里面的,用户无法看到数据的改变。对于第二种按逻辑const,需要改变的数据成员使用关键字mutable,以指定一个特定的数据成员可以在一个const对象里面被改变。
{
int i;
mutable int j;
public :
Z():
void f() const ;
};
Z::Z():i( 0 ),j( 0 ) {}
void Z::f() const
{
i ++ ; // error
j ++ ; // OK
}
int main()
{
Z z1;
z1.f();
}
volatile
这是C++关于常量的另一个关键字,volatile的意思是"在编译器认识的范围外,这个数据可以被改变"。它告诉了编译器不要做出有关该数据的任何假定,尤其是优化方面的。但这个关键字现在用的很少,主要是多线程,分布式程序里面会起作用。
结语:
关于C++中常量的概念这里就全部讲完了,希望对大家有一定的帮助。在写大点的程序时,类里常量的作用会慢慢体现出来的,不过很多还是语法层面上的东西,记住了就没太多的问题了。常量本质含义还是很基础的:程序运行开始后(或者编译后)就不能改变的变量。