详解C/C++中const关键字的用法及其与宏常量的比较
|
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
const int * fun2() //调用时 const int *pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针内容不可变。
c.int* const fun3() //调用时 int * const pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针本身不可变。
const int fun1() //这个其实无意义,因为参数返回本身就是赋值。
6.修饰类相关 (1)用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。
class A
{
public:
A(int x) : a(x) // 正确
{
//a = x; // 错误
}
private:
const int a;
};
(2)const修饰成员函数 用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量,也不能调用类中任何非const成员函数。一般写在函数的最后来修饰。
class A
{
public:
int& getValue() const
{
// a = 10; // 错误
return a;
}
private:
int a; // 非const成员变量
};
a. const成员函数不被允许修改它所在对象的任何一个数据成员。 b. const成员函数能够访问对象的const成员,而其他成员函数不可以。 (3)const修饰类对象/对象指针/对象引用 用const修饰的类对象表示该对象为常量对象,该对象内的任何成员变量都不能被修改。对于对象指针和对象引用也是一样。 因此不能调用该对象的任何非const成员函数,因为对非const成员函数的调用会有修改成员变量的企图。
class A
{
public:
void funcA() {}
void funcB() const {}
};
int main
{
const A a;
a.funcB(); // 正确
a.funcA(); // X
const A* b = new A();
b->funcB(); // 正确
b->funcA(); // X
}
(4)在类内重载成员函数
class A
{
public:
void func() {}
void func() const {} // 重载
};
另外,const数据成员只在某个对象生存期内是常量,而对整个类而言是可变的,因为类可以创建多个对象,不同对象的const数据成员值可以不同。
class A
{
public:
A(int size)
: _size(size) // 正确
{}
private:
const int _size;
};
A a(10); //对象a的_size值为10
A b(20); //对象b的_size值为20
那么,怎样才能建立在整个类中都恒定的常量呢?用枚举常量。
class A
{
public:
enum{SIZE1 = 10,SIZE2 = 20};//枚举常量
private:
int arr1[SIZE1];
int arr2[SIZE2];
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。但缺点是隐含数据类型是只能整数,最大值有限,且不能表示浮点数。 7.修饰全局变量 (编辑:网站开发网_安阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


