effective c++中const的理解

方紫涵 2014-03-13 04:40:59
const char& operator[] (std::size_t position) const //问下前面的那个const有什么用阿 ?去掉的话会error: invalid initialization of reference of type ‘char&’ from expression of type ‘const char’ ,这个error里面const char是怎么来的 ?

   
class TextBlock {
public:
...
const char& operator[] (std::size_t position) const
{return text[position];}
char& operator[] (std::size_t position)
{return text[position];}
private:
std::string text;
}

TextBlock tb("Hello");
std::cout << tb[0];

const TextBlock ctb("World");
std::cout << ctb[0];
...全文
478 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zephyr3d 2014-03-18
  • 打赏
  • 举报
回复
原则上成员函数具有const修饰表示的意义是这个函数不会修改该类实例的内存,如果该类有指针成员,指针所指向的内存不属于该类的实例则没有这个限制。如果有成员允许在const修饰下被改变那么需要用volatile修饰。const成员函数返回类成员的非const引用表示可以修改该成员的值,和const函数意义矛盾,是不能通过编译的。
parachutes30 2014-03-16
  • 打赏
  • 举报
回复
string::operator[]返回了const char &。然后你的函数return时,char & = const char &出错。
ultimater 2014-03-14
  • 打赏
  • 举报
回复
这个const定义只读函数,此函数里不能修改自身的属性。
赵4老师 2014-03-14
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
方紫涵 2014-03-14
  • 打赏
  • 举报
回复
引用 14 楼 jerry_dqh 的回复:
对于const函数,如果返回值为引用,则必须返回Const引用 ,如果返回的是指针或者一般值,就不需要了。
好像和9楼的代码矛盾哦。
方紫涵 2014-03-14
  • 打赏
  • 举报
回复
引用 10 楼 buyong 的回复:
因为std::string的元素,不能转换为char&返回,只能是const char&
引用 14 楼 jerry_dqh 的回复:
对于const函数,如果返回值为引用,则必须返回Const引用 ,如果返回的是指针或者一般值,就不需要了。
我比较同意这两个说法。 这两个answer哪个是对的呢?
方紫涵 2014-03-14
  • 打赏
  • 举报
回复
恩,在条款28中有对这个问题的解释,可以看 P125
feihuadao 2014-03-14
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
const对象不能调用non-const成员函数。
这是规定。 2,非const对象能调用const成员函数。 3,const对象的成员变量不可修改,也就是说成员变量本身已经有const属性。而const对象只能调用const成员函数,所以const成员函数只能返回const成员变量。 4,const成员函数如果不是返回的成员变量,则返回值不必要加const。 5,const变量能给非const变量赋值,返回来不行。 同意二楼。
方紫涵 2014-03-14
  • 打赏
  • 举报
回复
引用 16 楼 xwhbwas2008 的回复:
引用 14 楼 jerry_dqh 的回复:
对于const函数,如果返回值为引用,则必须返回Const引用 ,如果返回的是指针或者一般值,就不需要了。
好像和9楼的代码矛盾哦。
我看错了,I agree with jerry_dqh Thanks
心是菩提树 2014-03-14
  • 打赏
  • 举报
回复
引用 15 楼 xwhbwas2008 的回复:
[quote=引用 10 楼 buyong 的回复:] 因为std::string的元素,不能转换为char&返回,只能是const char&
引用 14 楼 jerry_dqh 的回复:
对于const函数,如果返回值为引用,则必须返回Const引用 ,如果返回的是指针或者一般值,就不需要了。
我比较同意这两个说法。 这两个answer哪个是对的呢?[/quote] 后面的正确
心是菩提树 2014-03-14
  • 打赏
  • 举报
回复
引用 8 楼 xwhbwas2008 的回复:
[quote=引用 6 楼 mujiok2003 的回复:] const对象不能调用non-const成员函数。
这个是解释 const char& operator[] (std::size_t position) const 后面的const的吧? //问下前面的那个const有什么用阿 ? [/quote] const函数限定不能修改自身,如果你要返回一个一般引用,估计编译器会认为可以对其修改,与const函数矛盾。 不返回引用就行了
碼上道 2014-03-13
  • 打赏
  • 举报
回复
对于const函数,如果返回值为引用,则必须返回Const引用 ,如果返回的是指针或者一般值,就不需要了。
zhcosin 2014-03-13
  • 打赏
  • 举报
回复
你自己动下脑筋嘛,函数后面有 const,整体都不能修改,还能修改局部么?
waterSStreaming 2014-03-13
  • 打赏
  • 举报
回复
在这里的确不是局部变量,是成员变量。 参考[url=http://www.cplusplus.com/reference/string/string/operator[]/]这里[/url],可以看到string的索引操作符有两个重载,

char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
一个返回值和函数本身都不是const修饰的,另一个的返回值和函数本身都是const修饰的。
buyong 2014-03-13
  • 打赏
  • 举报
回复
char text[100]; 就是char数组,和std::string不一样
buyong 2014-03-13
  • 打赏
  • 举报
回复
因为std::string的元素,不能转换为char&返回,只能是const char&
waterSStreaming 2014-03-13
  • 打赏
  • 举报
回复
引用 7 楼 xwhbwas2008 的回复:
引用 3 楼 waterSStreaming 的回复:
在这个函数里,返回的值本身是一个函数的局部变量,如果不加const,该变量的生命周期在函数返回时就会结束,也就是说在不加const的情况下,返回的是一个局部变量的地址,而该地址所指的值在函数调用结束后指向的是一个无效的值;加了const之后,使该局部变量的作用域扩展了,从而在返回后仍可以正常访问
返回值不是local 吧?是member

#include <iostream>
#include <cstring>

using namespace std;

class TextBlock {  
    public: 
		TextBlock(string s)
		{
			strcpy(text, s.c_str());;
		}
        char operator[] (std::size_t position) const  
        {
			return text[position];
		}  
        char& operator[] (std::size_t position)  
        {
			return text[position];
		}  
    private:  
        char text[100];  
};

int main()
{
    TextBlock tb("Hello");  
    std::cout << tb[0];  
       
    const TextBlock ctb("World");  
    std::cout << ctb[0];  

	return 0;
}
这段程序可以正常执行,请看看有什么区别吧
方紫涵 2014-03-13
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
const对象不能调用non-const成员函数。
这个是解释 const char& operator[] (std::size_t position) const 后面的const的吧? //问下前面的那个const有什么用阿 ?
方紫涵 2014-03-13
  • 打赏
  • 举报
回复
引用 3 楼 waterSStreaming 的回复:
在这个函数里,返回的值本身是一个函数的局部变量,如果不加const,该变量的生命周期在函数返回时就会结束,也就是说在不加const的情况下,返回的是一个局部变量的地址,而该地址所指的值在函数调用结束后指向的是一个无效的值;加了const之后,使该局部变量的作用域扩展了,从而在返回后仍可以正常访问
返回值不是local 吧?是member
mujiok2003 2014-03-13
  • 打赏
  • 举报
回复
const对象不能调用non-const成员函数。
加载更多回复(5)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧