C/C++中的const的用法

2019-03-04  本文已影响0人  Jack_Cui

来说下c/c++中的const的用法。
在英语中常数的一种表达是“中的const的”,在编程中可能是借用了这个单词(我猜的哈)。代表常量,不可改变的意思,在c/c++中,const表示的也是不可改变的意思(当然我们也有一些方法来对它进行改变)。

    > class A

{
  public:
    A()
    {
    }
  private:
    static const int i;//注意必须是静态的!
};
const int A::i=3;
- 常量与数组的组合有什么特殊吗? 我们给出下面的代码:
>const int size[3]={10,20,50};
int array[size[2]];

  有什么问题吗?对了,编译通不过!为什么呢? Const可以用于集合,但编译器不能把一个集合存放在它的符号表里,所以必须分配内存。在这种情况下,const意味着“不能改变的一块存储”。然而,其值在编译时不能被使用,因为编译器在编译时不需要知道存储的内容。自然,作为数组的大小就不行了:)


  > class A

{
  public:
    A(int i=0):test[2]({1,2}) {}//你认为行吗?
  private:
    const int test[2];
};

  vc6下编译通不过,为什么呢? 关于这个问题,前些时间,自己猜想了下,给出了一下解释,大家可以看看:我们知道编译器堆初始化列表的操作是在构造函数之内,显式调用可用代码之前,初始化的次序依据数据声明的次序。初始化时机应该没有什么问题,那么就只有是编译器对数组做了什么手脚!其实做什么手脚,我也不知道,我只好对他进行猜测:编译器搜索到test发现是一个非静态的数组,于是,为他分配内存空间,这里需要注意了,它应该是一下分配完,并非先分配test[0],然后利用初始化列表初始化,再分配test[1],这就导致数组的初始化实际上是赋值!然而,常量不允许赋值,所以无法通过。 其实是不对的,正确的是:C++标准有一个规定,不允许无序对象在类内部初始化,数组显然是一个无序的,所以这样的初始化是错误的!对于他,只能在类的外部进行初始化,如果想让它通过,只需要声明为静态的,然后初始化。 这里我们看到,常量与数组的组合没有什么特殊!一切都是数组惹的祸!



- this指针是不是const类型的?
this指针是一个很重要的概念,那该如何理解她呢?也许这个话题太大了,那我们缩小一些:this指针是个什么类型的?这要看具体情况:如果在非const成员函数中,this指针只是一个类类型的;如果在const成员函数中,this指针是一个const类类型的;如果在volatile成员函数中,this指针就是一个volatile类类型的。
- const到底是不是一个重载的参考对象? (这个就是刚刚说的要再讲下的重载)
先看一下下面的例子:
  > class A
  {

  ......
  void f(int i)
  {
  ......
  }//一个函数
  void f(int i) const
  {
  ......
  }//上一个函数的重载
......
};

  上面是重载是没有问题的了,那么下面的呢?
  >class A

{
  ......
  void f(int i)
    {
    ......
    }//一个函数
  void f(const int i)
  {
    ......
  }//?????
  ......
};

  这个是错误的,编译通不过。那么是不是说明内部参数的const不予重载呢?再看下面的例子:
  > class A
{

  ......
  void f(int& )
  {
    ......
  }//一个函数
  void f(const int& )
  {
    ......
  }//?????
  ......
};

  这个程序是正确的,看来上面的结论是错误的。为什么会这样呢?这要涉及到接口的透明度问题。按值传递时,对用户而言,这是透明的,用户不知道函数对形参做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!当指针或引用被引入时,用户就会对函数的操作有了一定的了解,不再是透明的了,这时重载是有意义的,所以规定可以重载。
上一篇 下一篇

猜你喜欢

热点阅读