1.修饰类的数据成员
const数据成员只是在某个对象的生命周期内是常量.如果创建多个对象,那么每个对象的const数据成员可以不一样.所以,不能在类声明中初始化const数据成员.如:
class A
{
const int size = 100;// 错误
int array[size];//错误,未知的数组大小
}
const类数据成员,只能在类的构造函数的初始化列表中进行.要想建立整个类都是恒定的常量的数据,可以用类中的枚举.如:
class A
{
enum {size1 = 100, size2 = 200};
int array[size1];
}
2.只有声明为const的成员函数才能被一个const对象调用
3.在另一连接文件中引用const常量.
extern const int i
4.对于const对象,c++既允许对其进行静态初始化,也允许对其进行动态初始化.const对象具有从构造函数完成到析构函数执行之前的不变性.
5.常量与数组的组合有什么特殊吗?
我们给出下面的代码:
const int size[3]={10,20,50};
int array[size[2]];
编译通不过!为什么呢?const可以用于集合,但编译器不能把一个集合存放在它的符号表里,所以必须分配内存。在这种情况下,const意味着“不能改变的一块存储”。然而,其值在编译时不能被使用,因为编译器在编译时不需要知道存储的内容。自然,作为数组的大小就不行了
你再看看下面的例子:
class A
{
public:
A(int i=0):test[2]({1,2}) {} file://你/认为行吗?
private:
const int test[2];
};
C++标准有一个规定,不允许无序对象在类内部初始化,数组显然是一个无序的,所以这样的初始化是错误的!对于他,只能在类的外部进行初始化,如果想让它通过,只需要声明为静态的,然后初始化。
这里我们看到,常量与数组的组合没有什么特殊!一切都是数组惹的祸!
(7)什么情况下为const分配内存?
以下是我想到的可能情况,当然,有的编译器进行了优化,可能不分配内存。
A、作为非静态的类成员时;
B、用于集合时;
C、被取地址时;
D、在main函数体内部通过函数来获得值时;
E、const的 class或struct有用户定义的构造函数、析构函数或基类时;。
F、当const的长度比计算机字长还长时;
G、参数中的const;
H、使用了extern时。
(8)与static搭配会不会有问题?
假设有一个类:
class A
{
public:
......
static void f() const { ......}
......
};
我们发现编译器会报错,因为在这种情况下static不能够与const共存!因为static没有this指针,但是const修饰this指针.
(9)如何修改常量?
有时候我们却不得不对类内的数据进行修改,但是我们的接口却被声明了const,那该怎么处理呢?我对这个问题的看法如下:
1)标准用法:mutable
class A
{
public:
A(int i=0):test(i) { }
void Setvalue(int i)const { test=i; }
private:
mutable int test; file://这/里处理!
};
2)强制转换:const_cast
class A
{
public:
A(int i=0):test(i) { }
void Setvalue(int i)const
{ const_cast <int>(test)=i; }//这里处理!
private:
int test;
};
(10)最后我们来讨论一下常量对象的动态创建。
既然编译器可以动态初始化常量,就自然可以动态创建,例如:
const int* pi=new const int(10);
这里要注意2点:
1)const对象必须被初始化!所以(10)是不能够少的。
2)new返回的指针必须是const类型的。
那么我们可不可以动态创建一个数组呢?
答案是否定的,因为new内置类型的数组,不能被初始化。