常量综述(二)

            参数传递和返回值的小结:
 

void  t( int * ) {}
void  u( const   int   * p)
{
    
* p = 2 ;       // error
      int  i =* p;     // OK
      int *  p2 = p;     // error
}

const   char *  v()
{
      
return   " result of function v " ;
}

const   int *   const  w()
{
      
static   int  i;
      
return   & i;
}

int  main()
{
      
int  x = 0 ;
      
int   * ip =& x;
      
const   int   * cip =& x;
      t(ip);        
// OK
      t(cip);         // error
      u(ip);         // OK
      u(cip);        // OK
       char *  cp = v();       // error
       const   char   * ccp = v();       // OK
       int   * ip2 = w();      // error
       const   int *   const  ccip = w();       // OK
       const   int *  cip2 = w();             // OK
       * w() = 1 ;         // error
}

              函数t 可以用const和非const 指针做参数,而函数u 只能用const指针作为参数,而且编译器也不允许使用存储在const指针里的地址来建立一个非const指针。
             函数v 返回的是常量的字符数组,编译器把它储存在静态存储区里,所以返回是安全的。
             函数w 返回值要求这个指针和指针所指向的对象均为常量。首先变量i 是静态的,返回后也是有效的地址。但在后面main函数的测试里发现w的返回值可以赋给const int* ,其实这并不矛盾,因为这时w的返回值是当右值来使用的,只有当它用成左值时才会出问题,就像最后一行。
      标准参数传递:
                 在C++里面,对于用户自定义对象我们通常是按引用的方式来传递,但需要注意的一点就是,把一个临时对象传递给接受const引用的函数是可能的,但不能把一个临时对象传递给接受指针的函数。

     类里的常量:
             1.const 成员
        我们如果要在类里面建立一个数组,就需要用const代替#define设置数组大小,这时使用的const意味   着"在这个对象生命期内,它是一个常量"。然而,对这个常量来讲,每个不同的对象可以含有一个不同的值。这样就出现了一个问题,什么时候初始化这个(非static)常量,这里用到了构造函数初始化列表,它出现在函数参数表和冒号后但在构造函数主体开头的花括号前。

 

class  Hony
{
        
const   int  size;
    
public :
        Hony(
int  sz);
        
void  print();
};

Hony::Hony(
int  sz): size(sz) {}
void  Hony::print()    { cout << size << endl; }

int  main()
{
      Hony a(
1 ),b( 2 ),c( 3 );
      a.print(),b.print(),c.print();
}  

         2.编译期间类里的常量(静态常量)
      还有一种情况就是,如何让一个类有编译期间的常量成员?这里就需要用关键字static ,"不管类的对象被创建多少次,都只有一个实例",而且必须在static const 定义的地方对它初始化。

#include  < string >
class  StringStack
{
     
static   const   int  size = 100 ;
     
const   string *  stack[size];
     
int  index;
   
public :
       StringStack();
       
void  push( const   string *  s);
       
const   string *  pop();
};

     这里只给出了类的声明,不过可以看出static const 是怎么用的。

       3. 旧代码中的"enum hack"
      在旧版本C++中,不支持在类中使用static const。另外有种典型的解决办法,使用不带实例的无标记enum。

 

class  Bunch
{
         
enum  { size = 1000 ; }
         
int  i[size];
};
       这里使用的enum不占用对象的存储空间,在编译期间得到枚举值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值