C++中的const总结.

来源:互联网 发布:2017网络电视剧排行榜 编辑:程序博客网 时间:2024/05/29 09:16

这几天看了C++编程思想,想把const的用法给总结一下:

const的几种用法如下:

一.用做值替代.

1).用来定义常量如:const int a = 10;

二.指针.

1).指 const char *p = "hello"; char const *p = "hello";这两种结果是一样的,只是形式上不一样.

const 数据,非const 指针.

2).指 char* const p= "hello"; const 指针,非const 数据. 

3).指 const char* const p = "hello"; const 指针及const 数据.

三.函数参数及返回值.

1).传递const值.例如:void f(const int i){...}

2).返回const值.例如:const int f(){...}

3).传递与返回地址.void f(const int& i){...} void f(const int* i){...} const int& f(){...) const int* f(){...} .下面有一条得记住了

// 写此函数的第一个错误方法inline const rational& operator*(const rational& lhs,                                 const rational& rhs){  rational result(lhs.n * rhs.n, lhs.d * rhs.d);  return result;}

它返回的是一个局部对象的引用.返回一个局部对象的引用。它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的。也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的。所谓生命空间,是指它们所在的函数体。当函数返回时,程序的控制离开了这个空间,所以函数内部所有的局部对象被自动销毁。因此,如果返回局部对象的引用,那个局部对象其实已经在函数调用者使用它之前被销毁了。

局部对象result在刚进入operator*函数体时就被创建。但是,所有的局部对象在离开它们所在的空间时都要被自动销毁。具体到这个例子来说,result是在执行return语句后离开它所在的空间的。所以,如果这样写:rational two = 2;  rational four = two * two;  // 同operator*(two, two)

函数调用时将发生如下事件:

1). 局部对象result被创建。2). 初始化一个引用,使之成为result的另一个名字;这个引用先放在另一边,留做operator*的返回值。3). 局部对象result被销毁,它在堆栈所占的空间可被本程序其它部分或其他程序使用。4). 用步骤2中的引用初始化对象four。

一切都很正常,直到第4步才产生了错误,借用高科技界的话来说,产生了"一个巨大的错误"。因为,第2步被初始化的引用在第3步结束时指向的不再是一个有效的对象,所以对象four的初始化结果完全是不可确定的。教训很明显:别返回一个局部对象的引用。

四.类.

1).类里面定义的const.例如:class Fred{const int size; public: Fred(int sz){...}};

2).const的对象.例如:const int i =1; const blob b(2); blob是一个类.

3).const的成员函数. 例如:class X{int i; public: X(int ii){...}; int f() const {return i;}};

原创粉丝点击