码迷,mamicode.com
首页 > 其他好文 > 详细

const

时间:2015-01-26 19:32:19      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

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++标准有一个规定,不允许无序对象在类内部初始化,数组显然是一个无序的,所以这样的初始化是错误的!对于他,只能在类的外部进行初始化,如果想让它通过,只需要声明为静态的,然后初始化。
      这里我们看到,常量与数组的组合没有什么特殊!一切都是数组惹的祸!

 

6.什么情况下为const分配内存?
      以下是我想到的可能情况,当然,有的编译器进行了优化,可能不分配内存。
      A、作为非静态的类成员时;
      B、用于集合时;
      C、被取地址时;
      D、在main函数体内部通过函数来获得值时;
      E、const的 class或struct有用户定义的构造函数、析构函数或基类时;。
      F、当const的长度比计算机字长还长时;
      G、参数中的const;
      H、使用了extern时。

 

7.与static搭配会不会有问题?
      假设有一个类:
      class A
      {
      public:
      ......
      static void f() const { ......}
      ......
      };
      我们发现编译器会报错,因为在这种情况下static不能够与const共存!因为static没有this指针,但是const修饰this指针.

 

8.如何修改常量?
      有时候我们却不得不对类内的数据进行修改,但是我们的接口却被声明了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; 
};

 

9.最后我们来讨论一下常量对象的动态创建
      既然编译器可以动态初始化常量,就自然可以动态创建,例如:
      const int* pi=new const int(10);
      这里要注意2点:
      1)const对象必须被初始化!所以(10)是不能够少的。
      2)new返回的指针必须是const类型的。
      那么我们可不可以动态创建一个数组呢?答案是否定的,因为new内置类型的数组,不能被初始化。


const

标签:

原文地址:http://my.oschina.net/lmw/blog/371952

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!