统计

  • 随笔 - 50
  • 文章 - 42
  • 评论 - 147
  • 引用 - 0

留言簿(6)

随笔分类

文章分类

Link

搜索

  •  

积分与排名

  • 积分 - 162638
  • 排名 - 161

最新评论

阅读排行榜

评论排行榜

对于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 成员函数,则是错误的。

 

返回常量引用:

 

在看一个例子:

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

 7int _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是我自己定义的一个类,声明如下

 1class 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函数内所返回的引用对象地址完全一致。


 

posted on 2008-12-04 17:08 pear_li 阅读(3386) 评论(4)  编辑 收藏 引用 所属分类: C++

评论

# re: 对于c++中常量成员函数,返回常量引用,const_cast的总结 2008-12-06 10:39 blackball

有时候我用const_cast的时候去掉const属性并没有实质性的效果,比如:
const int var = 10;
int *pt = const_cast<int*>(&var);
*pt = 20;
cout<<" "<<&var << endl;
cout<<*pt<<" "<< var<< endl;

这样输出的结果就会很奇怪,地址相同但是值不同。
这是怎么回事呢?
  回复  更多评论    

# re: 对于c++中常量成员函数,返回常量引用,const_cast的总结 2008-12-06 18:19 pear_li

@blackball
这个我觉得应该是编译器对常量优化造成的,你可以在var前冠以volatile试试,应该是没问题的
  回复  更多评论    

# re: 对于c++中常量成员函数,返回常量引用,const_cast的总结 2010-12-05 23:10 querw

returntest() 返回了一个栈内的变量, 你确定没有问题吗?
  回复  更多评论    

# re: 对于c++中常量成员函数,返回常量引用,const_cast的总结[未登录] 2013-08-16 11:21 gong

{ return (isbn rhs.isbn);}
这里是不是掉东西了?前面的isbn表示什么?
  回复  更多评论    

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理