关于c++中const


      默认情况下,const对象被设定为仅在文件内有效。当多个文件中出现同名const变量时,其实等同于在不同文件中分别定义了独立的变量。如果想子多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。

const的引用

与普通引用不同,对常量的引用不能被用作修改他所绑定的对象。引用本身即不可更改,所以不存在类似指针顶层与地层const的问题。对const的引用可能引用一个并非const的对象。

const int ci=1024;
const int &r1=ci;   //正确:引用及其对象都是常量
r1=42;              //错误:r1是对常量的引用
int &r2=ci;         //错误:师徒让一个非常量引用指向一个常量对象。

指针和const

如果关键字const出现在星号左边,表示被指物是常量;反之,指针自身是常量。

1.指向常量的指针(底层const)不能用于改变其所指对象的值。

const double pi=3.14;//pi不能改变
const double *ptr =&pi//正确
*ptr=42;//错误,不能给*ptr赋值。

2.常量指针(顶层const)必须被初始化。当执行对象的拷贝操作时,拷入和考出对象必须具有相同的底层const自个,或者两个对象数据类型必须能够转换。

3.声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。在constepr声明中如果定义了一个指针,限定符consteptr仅对指针有效,与指针所指对象无关。

const int *p=nullptr;
constexpr int *q=nullptr;//相当于int * const q=nullptr;
STL迭代器

STL迭代器是以指针为根据塑模出来的,所以迭代器的作用就像个T*指针。声明迭代器为const就想声明指针为const一样(即声明一个T* const指针),表示这个迭代器不得指向不同的东西,但它所指的东西的值是可以改动的。如果希望STL模拟一个const T*指针,需要的是const_iterator。

vector<int> vec;
const vector<int>::iterator iter=vec.begin();//T* const
*iter=10    //正确
++iter;     //错误
vector<int>::const_iterator citer=vec.begin();//const T*
*citer=10; //错误
++citer;   //正确

const成员函数

成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象。因为this总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中的地址。

将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。常量对象以及常量对象的引用或指针都只能调用常量成员函数。

两个成员函数如果只是常量性不同,可以被重载。如果只是参数的常量性不同,不可重载。const函数调用non_const不可取。当const和non_const成员函数有着实质等价实现时,令non_const调用const版本可避免代码重复。

class TextBlock{
public:
……
const char& operator[](size_t position) const{
……
……
return text[position];
}
char& operator[](size_t position){
return const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);//先添加const属性,再移除。
}
……
};




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章