首先大概说一下const可修饰的:const用在class的外部可以修饰global或者namespace作用域中的常量,或者修饰文件,函数,或者区块作用域中被声明为static的对象。当然也可以修饰class内部的static和no-static成员变量,也可以修饰指针变量自身或者指针所指物。
1.const修饰指针
int a = 10;
const int* p = &a;//指针所指空间内容不能被修改
int const *p = &a;//指针所指空间内容不能被修改
int* const p = &a;//指针的指向不能改变
const int* const p = &a;//指针的指向和所指空间的内容都不能改变
2.const最具威力的用法是面对函数声明时的应用,在一个函数的声明中const可以和返回值,各参数,函数自身(如果是成员)产生关联。
在这里我们说一下const修饰返回值,这样可以可以降低因客户的操作草屋而造成的错误,比如:
class Rational{ .... };
const Rational operator* {const Rational& lhs, const Rational & 2hs};
在这里重载*运算符,如果返回一个const对象,可以避免发生这样的错误
(a*b) = c;
if (a*b=c)
3.cons成员函数
将const用成员函数的目的就是为了确认该成员函数可作用于const对象身上。
首先1.他们可以清楚的看到哪个函数可以改动对象哪个函数不可以改动对象2.他们使操作const对象成为可能,注意C++程序效率的 一个根本办法是以const 引用的 方式传递对象,而此技术可行的前提是,我们有const成员函数来处理const对象,即const对象调用const成员函数。
注意:两个成员函数知识常量性不同,可以构成重载!这是C++一个重要的特性
2.如果函数的返回类型是个内置类型,那么修改函数返回值从来就是不合法的行为,总是合法,传值返回对象,改动的也是对象返沪的一个副本
3.在const成员函数内不能给成员变量赋值,如果强行赋值,需要给成员加上关键字mutable;
4.非const成员函数可以调用const成员函数,const成员函数不能调用非const成员函数,看如下代码
class Textbook
{
public:
std::string Text;
const char& operator[](std::size_t position) const
{
.....
.....
return Text[position];
}
char& operator[](std::size_t position)
{
return const_cast<char&>(static_cast<const Textbook&>(*this)[position]);
}
};
在这段non-const函数调用const函数中进行了两次转型
1. 将自身*this从原始类型TextBlock&转型为const TextBlock&,使用 static_cast为*this加上const;
2. 从const operator[]的返回值中移除const,用const_cast