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输出为30
cout << "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 引用。