首页 > 编程语言 > 详细

C++的const操作符

时间:2014-01-31 15:36:39      阅读:659      评论:0      收藏:0      [点我收藏+]

1.C语言中定义一个符号常量可以用宏定义实现

# define MIN 5

宏定义的缺陷是仅仅对常量做简单的替换,有时会出现预料之外的结果,如# define MIN(x)  x*x  x设为(2+3)会得到13,而不是25

C++中可以用const修饰符来定义常量,const比宏定义常量更加安全。

下面的例子展示了宏定义和const的不同,

int x=5;

# define T x+x

# define M T-T

M的值将为10

而用const定义常量const int T=x+x;const M=T-T; 

M的值将为0

2.const 修饰符与指针

1)指向常量的指针

const <类型名> *指针名;如:  const int *t=&x;这种指针可以修改自己的指向,但它指向的内容*t不能修改。

2)常指针

<类型名> *const <指针名>

int t=4;int *const p=&t;这种指针不能改变指向,但可以改变指向的内容

3)指向常量的常指针

const <类型名> *const <指针名>

int x=5;const int *const=&x;

这种指针不能改变指向,也不能改变指向的内容

下面是代码:

# include <iostream>
using namespace std;
int main()
{
const int x=4;
const int *p1=&x;  //指向常量的指针
cout<<*p1<<endl;
int a=5;
p1=&a;
cout<<*p1<<endl;
//*p=5;          //p为指向常量的指针,指向的内容不能修改
const int *const p2=&x;//指向常量的常指针
//p2=&a;         //p2的指向和内容都不能改变
int *const p3=&a;  //p3为常指针
int b=6;
//p3=&b;     //p3的指向不能改变
cin.get();
return 0;
}


 

3.const与迭代器

1const_iteratorconst迭代器的区别

const_iteroator指向某个容器元素,可以修改其指向,即指向其它元素,但不能改变指向的内容,const迭代器可以改变指向的内容,但不能改变其指向,有点类似于常指针。

下面是代码:

vector<int> v(10,1);

vector <int>::const_iterator iter()=v.begin();

iter++;   //正确

*iter=2;  //错误

const vector<int> ::iterator iter1=v.begin();

iter1++;  // 错误

*iter1=2//正确

(2) const_itearatoriterator都可以用来遍历容器的元素,const_iterator可以用于const或非const容器,iterator只用于非const容器。

3)在泛型算法中有的算法只能接受iterator类型的迭代器,如果将const_iterator传入会报错,为了将const_iterator转换为iterator,const_cast操作符无法完成这个转换,解决办法是用 distanceadvance函数,具体办法是:
vector <int> v(10,1);

Vector <int>::iterator it;

Vector <int>::const_iterator iter;

it=v.begin();

advance(it,distance<vector<int>::const_iterator>)(it,iter);

4.const 用于函数的重载

1)类中的成员函数可以用const进行重载,对象调用这个函数,非const对象将调用非const版本的函数,而const对象调用const版本的函数。

下面是代码:

# include <iostream>
using namespace std;
class A
{
public:
A(int i):x(i){}
void show(){cout<<"not const"<<endl;}
void show() const {cout<<"const"<<endl;}
private:
	int x;
};
int main()
{
A a(1);
a.show();      //普通对象调用非const版本的函数
const A b(2);  //常对象调用常成员函数
b.show();
cin.get();
return 0;
}

常成员函数show()只能访问而不能修改类中的变量(mutable变量除外)。

上面还讲到了常对象const A a,常对象只能调用常成员函数。

2)以下两个函数不能实现重载:

f(char*)f(const char *),因为如果把char *类型的变量传入形参时,会有二义性的问题。

5.const用于函数的形参

int f(const int x) ;这个函数传入的实参可以是const类型,也可以是非const类型,在函数f中,x的值不能被改变

int f(const int * x) ;形参为指向常量的指针,指向的内容不能改变

int f(int *const x);形参为常指针,指向不可变

int (const A& a);形参为A类型的引用,这样可以避免复制、修改对象,从而有提高效率并且保护对象的作用。

6.const也可以用于修饰函数的返回值,此时函数的返回值可以相应地赋值给一个const类型的变量。


 

C++的const操作符

原文:http://blog.csdn.net/u011608357/article/details/18862961

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!