const的思考[4]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 hustli 的 blog

           void f(int i) const {......} file://上一个函数的重载
            ......
          };
        上面是重载是没有问题的了,那么下面的呢?
         class a
         {
           ......
           void f(int i)       {......} file://一个函数
           void f(const int i) {......} file://?????
            ......
         };
         这个是错误的,编译通不过。那么是不是说明内部参数的const不予重载呢?再看下面的例子:
        class a
         {
           ......
           void f(int& )       {......} file://一个函数
           void f(const int& ) {......} file://?????
            ......
         };
         这个程序是正确的,看来上面的结论是错误的。为什么会这样呢?这要涉及到接口的透明度问题。按值传递时,对用户而言,这是透明的,用户不知道函数对形参做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!当指针或引用被引入时,用户就会对函数的操作有了一定的了解,不再是透明的了,这时重载是有意义的,所以规定可以重载。
   (8)什么情况下为const分配内存?
        以下是我想到的可能情况,当然,有的编译器进行了优化,可能不分配内存。
        a、作为非静态的类成员时;
        b、用于集合时;
        c、被取地址时;
        d、在main函数体内部通过函数来获得值时;
        e、const的 class或struct有用户定义的构造函数、析构函数或基类时;。
        f、当const的长度比计算机字长还长时;
        g、参数中的const;
        h、使用了extern时。
        不知道还有没有其他情况,欢迎高手指点:)       
   (9)临时变量到底是不是常量?
        很多情况下,编译器必须建立临时对象。像其他任何对象一样,它们需要存储空间而且必须被构造和删除。区别是我们从来看不到编译器负责决定它们的去留以及它们存在的细节。对于c++标准草案而言:临时对象自动地成为常量。因为我们通常接触不到临时对象,不能使用与之相关的信息,所以告诉临时对象做一些改变有可能会出错。当然,这与编译器有关,例如:vc6、vc7都对此作了扩展,所以,用临时对象做左值,编译器并没有报错。
   (10)与static搭配会不会有问题?
        假设有一个类:
        class a
        {
         public:
             ......
             static void f() const { ......}
             ......
         };
         我们发现编译器会报错,因为在这种情况下static不能够与const共存!
         为什么呢?因为static没有this指针,但是const修饰this指针,所以...
     (11)如何修改常量?
          有时候我们却不得不对类内的数据进行修改,但是我们的接口却被声明了const,那该怎么处理呢?我对这个问题的看法如下:
           1)标准用法:mutable
              class a
              {
               public:
                      a(int i=0):test(i)        { }
                      void setvalue(int i)const { test=i; }
               private:

本文关键:const
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top