Z03 C++中const的通常用法

来源:互联网 发布:软件项目管理论文 编辑:程序博客网 时间:2024/06/03 19:32

1、指针与const

可以用两种不同的方式将const关键字用于指针。第一种方法是让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值。第二种方法是将指针本身声明为常量,这样可以防止改变指针指向的位置。

1)指针指向一个常量对象

#include <iostream>using namespace std;int main(void){int age = 29;const int * pt = &age;*pt = 30; //注意:第8行,程序报错,不能给常量赋值cout << "age: " << age << endl;system("pause");return 0;}
说明:程序中pt指向const int(此处为29),因此不能用pt来修改这个值。但是,pt的声明并不意味着它指向的实际上就是一个常量,而只是意味着对于pt而言,这个值是常量,可以通过修改age变量来修改age的值,如下所示:
#include <iostream>using namespace std;int main(void){int age = 29;const int * pt = &age;age = 30;//注意:第8行,程序不会报错。cout << "age: " << age << endl;system("pause");return 0;}
说明:C++中const变量的地址可以赋给const变量的指针,此时age的值既不能通过age变量修改也不能通过pt来修改,如下所示:

#include <iostream>using namespace std;int main(void){const int age = 29;const int * pt = &age;age = 30;//注意:第8行,程序报错,const变量的地址可以赋给const变量的指针。cout << "age: " << age << endl;system("pause");return 0;}
使用const的理由:

  • 可以避免由于无意间修改数据而导致的编译错误;
  • 使用const使得函数能够处理const和非const实参,否则将只能接受非const数据。如果条件允许,应将指针形参声明为指向const的指针。
2)指针本身声明为常量
#include <iostream>using namespace std;int main(void){int age = 29;const int * pt = &age;int height = 30;pt = &height;cout << *pt << endl;//注意:*pt输出为30cout << "age: " << age << endl;system("pause");return 0;}
说明:开始时pt指向const int使得pt不能修改age的值,但是如上程序不能防止修改pt的值,当pt为&height时,*pt的值为30,即此时pt不能修改height的值。

若使pt的值也不能改变,应使用下面声明,此时pt的值不能改变切pt指向的值也不能改变:

#include <iostream>using namespace std;int main(void){int age = 29;const int *  const pt = &age; //使用这种结构int height = 30;pt = &height;//注意:第9行,程序报错cout << "age: " << age << endl;system("pause");return 0;}


2、为何将const用于返回类型的引用

const free_throws& accumulate(free_throws& target, const free_throws& source)
说明:返回类型使用const引用后不允许给accumulate()类似赋值操作,如下所示

accumulate(参数1, 参数2) = four; //不允许修改accumulate()


3、const为类成员函数

const Stack land = Stack("ABC")land.show();
说明:对于类Stack声明为const后,第二行show()的原型为void show()代码会编译错误,因为show()的代码无法确保调用对象不被修改。要保证不出现错误,则一种方法是将const加载show()函数后面,如下所示:

void show() const;

原理如下:

a、当类对象时const时表示对象不能修改,而当其调用成员函数时non-const时,成员函数表明可以修改对象。两者发生矛盾,所以不予许出现这种现象;

b、如果当成员函数的const和non-const版本同时存在,const object只能调用const member functions,non-const object 只能调用non-const member functions。


4、this指针的const用法

const Stock& topval(const Stock& s) const;
说明:程序中类为Stock,topval()为比较两个Stock对象,其中第一个const为返回const引用,第二个const表明,该函数不会修改被显式地访问的对象 s。最后一个const表明,该函数不会修改被隐式地访问的对象 this。因此返回类型为第一个const 引用。