const常规用法
- 如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。
char greeting[] ="Hello";
char* p= greeting; \\ non-const pointer,non-const data
const char* p =greeting; \\ non-const pointer,const data
char* const p = greeting; \\ const pointer,non-const data
const char* const p = greeting; \\const pointer,const data
- STL迭代器系以指针为根据塑模出来,所以迭代器的作用就像个T指针。声明迭代器为const就像声明指针为const一样(即声明一个T const 指针),表示这个迭代器不得指向不同的东西,但它所指的东西的值是可以改动的。如果希望迭代器所指的东西不可被改动(即希望STL模拟一个const T* 指针),你需要的是const_iterator:
vector<int>vec;
const vector<int>::iterator iter = vec.begin(); //iter的作用像个T* const
*iter =10; //没问题,改变iter所指物
++iter; // 错误,iter是const
vector<int>:: const_iterator cIter = vec.begin(); //cIter的作用像个const T*
*cIter =10; //错误,*cIter是const
++cIter; //没问题,改变cIter
const修饰函数时
观察如下代码:
#include <iostream>
using namespace std;
class A
{
int v;
A(int vv):v(vv) { }
// 在下面补充完struct
const A* getPointer() const{
return this;
}
};
int main()
{
const A a(10);
const A * p = a.getPointer();
cout << p->v << endl;
return 0;
}
一、概念
当const在函数名前面的时候修饰的是函数返回值,在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。修饰谁,谁就不能发生修改!
二、原理:
我们都知道在调用成员函数的时候编译器会将对象自身的地址作为隐藏参数传递给函数,在const成员函数中,既不能改变this所指向的对象,也不能改变this所保存的地址,this的类型是一个指向const类型对象的const指针。
具体示例:
一个函数名字后有const,这个函数必定是成员函数,也就是说普通函数后面不能有const修饰,如:int print( ) const {…} 这个函数必定为成员函数,即在类里面定义的函数。
在一个类里定义了一个const成员函数后,则此函数不能修改类中的成员变量,如果定义了一个类的const对象(非const对象可以调用const成员函数和非const成员hanshu ),它只能调用类中的const成员函数,如:
class text{
public:
void print_const(void) const { cout<<"hello"<<endl;} //有const修饰
void print(void) {cout<<"hello"<<endl;} //没有const修饰
void getk(void) const {k=5; } //错误,有const修饰,不能修改k的值,
private:
int k;
};
const text a;
int main()
{
a.print(); //错误,const对象只能调用
a.printf_const(); //正确
}
// void print() const {} 和 void print() {} 是重载函数,假如对象为const,则调用void print () const成员函数,如果为非const,则调用void print() ;
class text{
public:
void print(void) const {cout<<"hello_const"<<endl;}
void print(void) {cout<<"hello"<<endl;}
};
const text a;
int main()
{
a.print(); //屏幕输出 hello_const 假如对象a 定义为 text a,则输出 hello
return 0;
}