对于c++中常量成员函数,返回常量引用,const_cast的总结

对于c++中常量成员函数,返回常量引用,const_cast的总结

常量成员函数:

先看这个例子

bool Sales_item::same_isbn(const Sales_item &rhs) const

{ return (isbn rhs.isbn);}

蓝色的const用于修饰显示传入的形参rhs,而对于类的成员则有隐式的,而外的this指针作为形参传入,而红色部分的const正是修饰这部分参数this

const 成员函数的引入

现在,可以理解跟在Sales_item 成员函数声明的形参表后面的const 所起的作用了: const改变了隐含的this 形参的类型。在调用total.same_isbn(trans) 时,隐含的this 形参将是一个指向total 对象的const Sales_item*类型的指针。就像如下编写same_isbn 的函数体一样:

 

/   /  pseudo - code illustration of how the  implicit   this  pointer  is  used

/   /  This code  is  illegal: We may not explicitly define the  this  pointer ourselves

/   /  Note that  this   is  a pointer to  const  because same_isbn  is  a  const  member

bool  Sales_item::same_isbn( const  Sales item  * const   this  , const  Sales_item  & rhs)  const

return (this->isbn rhs.isbn);}

 

用这种方式使用const 的函数称为常量成员函数(const member function) 。由于this 是指向const 对象的指针,const 成员函数不能修改调用该函数的对象。因此,函数avg-price

和函数sarne isbn 只能读取而不能修改调用它们的对象的数据成员。

NOTE

const对象指向const的指针或引用只能用于调用其const成员函数如果尝试用它们来调用非const 成员函数,则是错误的。

 

返回常量引用:

 

在看一个例子:

 1 mycls  const &  returntest() // 定义返回值为一个常量引用
 2 {
 3       mycls my1(3);
 4       cout<<"a in the func is"<<&my1<<endl;
 5       return my1;
 6}

 7 int  _tmain( int  argc, _TCHAR *  argv[])
 8 {
 9       //测试返回引用类型
10       mycls const&str = returntest();//使用cont&接受返回值
11       //str.m_q=12;//编译报错,不可以修改const类型
12       mycls &str1=const_cast<mycls&>(str);//去掉const属性,以便修改
13       str1.m_q=12;
14       cout<<"&b="<<&str<<endl;
15       cout<<"&b="<<&str1<<endl;
16       system("pause");
17   return 0
18}

以上mycls是我自己定义的一个类,声明如下

 1 class  mycls
 2 {
 3    public:
 4        mycls(int a);
 5        char a[100000];
 6        //~mycls(void);
 7        int m_q;
 8    template <class T> inline int compare(const T &a,const T &b)
 9    {
10        if(a == b)
11            return 0;
12        else if(a > b)
13            return 1;
14        else if(a<b)
15            return -1;
16        return 0;
17    }

18    mycls& operator+(mycls a);
19    virtual int dosomething(int a);
20    virtual void doanotherthing(void);
21}
;
22
通过代码注释,我想这不难理解,用一个引用类型的返回值最大好处就是可以避免内存拷贝,注意到我的类中有一个长度为100000的char数组,我想频繁拷贝这个数组对于一下性能较低的机器还是很耗时的,这时我们返回const &类型,避免了文件的拷贝,从输出也可以看到,returntest函数内的对象地址与main函数内所返回的引用对象地址完全一致。


 

你可能感兴趣的:(对于c++中常量成员函数,返回常量引用,const_cast的总结)