常函数及其由来
1. this鋪墊
首先,我們先要了解在c++中的面向對象編程中,當我們調用成員函數時,實際上實在替某個對象調用它。若果mem_function指向對象中的某個成員,則它隱式地指向調用該函數的對象的成員。
成員函數通過名為this的額外的隱式參數來訪問調用它的那個對象。當我們調用一個成員函數時,用請求該函數的對象地址初始化this。編譯器負責把對象的地址傳遞給成員函數的隱式參數this,可以等價地認為編譯器將該調用重寫成了如下形式:
Class name::mem_funtcion(&object name)
??? 1
其中,調用該函數時傳入了對象的地址。
在成員函數內部,可以直接調用函數的對象的成員,而無須通過成員訪問運算符來做到這一點,因為this所指的正是這個對象。任何對類成員的直接訪問都被看作this的隱式引用。比如:當使用Person類的對象p.get_name()函數返回姓名時,return name實際上做的是return this->name。
需要注意的是,this總是指向“這個”對象,所以this是一個常量指針,不允許改變this中所保存的地址。
2. 引入const函數
接下來,我們看看是如何引入const成員函數的。
const函數的函數列表后會出現const關鍵字,其作用是修改隱式this指針的類型。
默認情況下,this的類型是指向類類型不是常量的常量指針,相當于int * const p,即p指向的對象不是常量,但是p中保存的地址是常量,在這里,就是this所指向的對象不是常量,this中的地址是常量。因此,this所遵循的初始化規則使得我們不能將this綁定到一個常量對象上,即我們不能在一個常量對象上調用普通成員函數,因為此時在一個常量對象上調用普通函數時,傳入的this指向非常量,即說明要將一個常量對象付給一個非常量指針,這是違反規則常量使用規則的。
為了能夠讓常對象能夠使用對象中的函數,就需要設計一些特殊的函數供常對象使用,此時,常函數應運而生。通過將成員函數的參數列表之后加上const關鍵字,使得被隱式傳入的this所指向的對象為常對象,即使得this的類類型為常量指針,一邊能夠指向常對象。作用相當于:
String Class_name:: mem_function(const class_name *const this)
??? 1
雖然不允許顯示定義自己的this指針,但是這樣的偽代碼有助于理解隱式的this指針是如何使用的。
以上所定義的函數就為常函數。
————————————————
版權聲明:本文為CSDN博主「塔樓」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_28915885/article/details/79054374
總結
- 上一篇: C++ 中的this指针详解及实例
- 下一篇: 7.1.2 定义改进的Sales_dat