【转】C++编译器的修改和常成员函数的由来

来源:互联网 发布:软件安全性测试过程 编辑:程序博客网 时间:2024/06/15 09:51

转载自 skxzz

常成员函数并不是一开始就有的,它和C++的许多特性一样随着编译器的修改而引入的,这些特性通常可以提高程序的性能,却破坏了程序的一致性——产生许多看似特殊的语法。这些语法是C++特有的,常成员函数就是一个例子,java中虽然有一个叫成员函数的东西,但其实是静态函数(static),和C++的常成员函数相差很远。

常指针和常引用经常用于函数传递参数以代替传值引用,避免了大开销的拷贝构造函数。之所以是常指针和常引用是为了消除指针和引用的副作用(可能改变它的值),以达到和传值一样的效果。

但是这样引入了常对象,当传递的参数是一个对象时,他必须是常的。那么什么是常对象?常对象不是仅仅在对象前面加一个 const 就可以解决的,他是一个不改变自己成员变量的对象。这意味着不能调用这个对象的方法,除非这个方法不改变它的成员变量,而这一点是不敢保证的,特别是当一个方法的实现被隐藏,我们通常只能看见他的头文件——一个个方法的声明,而看不见他的定义。当然这个问题需要编译器来解决,但是编译器似乎走了一点弯路。

一开始编译器把常对象里的 this 指针修改为常指针(参数传递的时候改变 this ),这样就不能通过 this 指针修改这个对象了,而且对象的方法使用它的成员变量都是通过 this 指针,这样就实现了一个不能改变成员变量的常对象了。问题似乎圆满解决了,但是它存在隐患,因为一个对象并不总是常对象,他只在被当作参数传递时才是常对象,其他时候不是常的,所以不能把对象所有的方法定义为不改变成员变量的方法。当有一个可以改变成员变量的方法被调用时,编译器发现它使用常 this 指针改变成员变量时就会出错。这是程序员为了满足自己的要求,把 this 指针做了一个转化,把常 this 指针转化为变量 this 指针。这样程序就变得混乱不堪了,这时编译器只好再次改进,定义了一种常成员函数,其实非常简单,只是在函数的后面加个 const ,声明为常成员函数的方法就不能改变成员变量,其他的就可以改变。

上面的是东东王亚沙说的再加上自己的思考和整理,正确性有待考证。

原创粉丝点击