【转】C++编译器的修改和常成员函数的由来
来源:互联网 发布:软件安全性测试过程 编辑:程序博客网 时间:2024/06/15 09:51
常成员函数并不是一开始就有的,它和C++的许多特性一样随着编译器的修改而引入的,这些特性通常可以提高程序的性能,却破坏了程序的一致性——产生许多看似特殊的语法。这些语法是C++特有的,常成员函数就是一个例子,java中虽然有一个叫成员函数的东西,但其实是静态函数(static),和C++的常成员函数相差很远。
常指针和常引用经常用于函数传递参数以代替传值引用,避免了大开销的拷贝构造函数。之所以是常指针和常引用是为了消除指针和引用的副作用(可能改变它的值),以达到和传值一样的效果。
但是这样引入了常对象,当传递的参数是一个对象时,他必须是常的。那么什么是常对象?常对象不是仅仅在对象前面加一个 const 就可以解决的,他是一个不改变自己成员变量的对象。这意味着不能调用这个对象的方法,除非这个方法不改变它的成员变量,而这一点是不敢保证的,特别是当一个方法的实现被隐藏,我们通常只能看见他的头文件——一个个方法的声明,而看不见他的定义。当然这个问题需要编译器来解决,但是编译器似乎走了一点弯路。
一开始编译器把常对象里的 this 指针修改为常指针(参数传递的时候改变 this ),这样就不能通过 this 指针修改这个对象了,而且对象的方法使用它的成员变量都是通过 this 指针,这样就实现了一个不能改变成员变量的常对象了。问题似乎圆满解决了,但是它存在隐患,因为一个对象并不总是常对象,他只在被当作参数传递时才是常对象,其他时候不是常的,所以不能把对象所有的方法定义为不改变成员变量的方法。当有一个可以改变成员变量的方法被调用时,编译器发现它使用常 this 指针改变成员变量时就会出错。这是程序员为了满足自己的要求,把 this 指针做了一个转化,把常 this 指针转化为变量 this 指针。这样程序就变得混乱不堪了,这时编译器只好再次改进,定义了一种常成员函数,其实非常简单,只是在函数的后面加个 const ,声明为常成员函数的方法就不能改变成员变量,其他的就可以改变。
上面的是东东王亚沙说的再加上自己的思考和整理,正确性有待考证。
- 【转】C++编译器的修改和常成员函数的由来
- 常成员函数和mutable的恩恩怨怨
- 常对象及常成员及静态数据成员和静态成员函数的学习内容。
- 常对象 常成员函数 的关系
- 常成员函数的使用
- c++初级 之 类的“嵌套” 及 常成员函数和常数据成员
- 类中的常成员函数的使用和定义
- 常对象成员和常成员函数
- 有关C++中的常对象,常成员函数,常数据成员,常引用的认识
- 常成员:常数据成员和常成员函数
- 用conat修饰的类成员——常成员函数、常成员数据、常引用
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- C++ 常成员函数和常对象以及this指针的重要理解
- const 修饰的常函数成员
- 关于C++类的常成员函数
- 常成员函数返回指针的类型
- 重载成员函数的常成员函数版本
- 常成员函数:Const类限定的成员函数
- struts2自定义拦截器实现的分析说明附带代码
- ajax在线聊天室(一)
- MFC 多文档
- Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。在配置连接池时需要注意的有三点
- 黑马程序员训练营--字符串类String的使用
- 【转】C++编译器的修改和常成员函数的由来
- 值传递/地址传递/引用传递的区别【转】
- ProgramExample
- Sql Server三范式的理解
- wince的bin结构
- Run-Time Check Failure #0
- tcpdump抓包并保存成cap文件
- 从程序员到CTO所要培养的六种能力
- 转】C++默认参数与函数重载