亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解C++中的this指針與常對象

 更新時間:2015年09月17日 14:47:02   投稿:goldensun  
這篇文章主要介紹了詳解C++中的this指針與常對象,是C++入門學習中的基礎知識,需要的朋友可以參考下

C++ this指針詳解
this 是C++中的一個關鍵字,也是一個常量指針,指向當前對象(具體說是當前對象的首地址)。通過 this,可以訪問當前對象的成員變量和成員函數(shù)。
所謂當前對象,就是正在使用的對象,例如對于stu.say();,stu 就是當前對象,系統(tǒng)正在訪問 stu 的成員函數(shù) say()。
假設 this 指向 stu 對象,那么下面的語句中,this 就和 pStu 的值相同:

Student stu; //通過Student類來創(chuàng)建對象
Student *pStu = &stu;

[示例] 通過 this 來訪問成員變量:

class Student{
private:
  char *name;
  int age;
  float score;
public:
  void setname(char *);
  void setage(int);
  void setscore(float);
};
void Student::setname(char *name){
  this->name = name;
}
void Student::setage(int age){
  this->age = age;
}
void Student::setscore(float score){
  this->score = score;
}

本例中,函數(shù)參數(shù)和成員變量重名是沒有問題的,因為通過 this 訪問的是成員變量,而沒有 this 的變量是函數(shù)內部的局部變量。例如對于this->name = name;語句,賦值號左邊是類的成員變量,右邊是 setname 函數(shù)的局部變量,也就是參數(shù)。

下面是一個完整的例子:

#include <iostream>
using namespace std;
class Student{
private:
  char *name;
  int age;
  float score;
public:
  void setname(char *);
  void setage(int);
  void setscore(float);
  void say();
};
void Student::setname(char *name){
  this->name = name;
}
void Student::setage(int age){
  this->age = age;
}
void Student::setscore(float score){
  this->score = score;
}
void Student::say(){
  cout<<this->name<<"的年齡是 "<<this->age<<",成績是 "<<this->score<<endl;
}
int main(){
  Student stu1;
  stu1.setname("小明");
  stu1.setage(15);
  stu1.setscore(90.5f);
  stu1.say();
  
  Student stu2;
  stu2.setname("李磊");
  stu2.setage(16);
  stu2.setscore(80);
  stu2.say();
  return 0;
}

運行結果:

小明的年齡是 15,成績是 90.5
李磊的年齡是 16,成績是 80

對象和普通變量類似;每個對象都占用若干字節(jié)的內存,用來保存成員變量的值,不同對象占用的內存互不重疊,所以操作對象A不會影響對象B。

上例中,創(chuàng)建對象 stu1 時,this 指針就指向了 stu1 所在內存的首字節(jié),它的值和 &stu1 是相同的;創(chuàng)建對象 stu2 時,this 等于 &stu2;創(chuàng)建對象 stu3 時也一樣。

我們不妨來證明一下,給 Student 類添加一個成員函數(shù),輸出 this 的值,如下所示:

void Student::printThis(){
  cout<<this<<endl;
}


然后在 main 函數(shù)中創(chuàng)建對象并調用 printThis:

Student stu1, *pStu1 = &stu1;
stu1.printThis();
cout<<pStu1<<endl;
Student stu2, *pStu2 = &stu2;
stu2.printThis();
cout<<pStu2<<endl;

運行結果:

0x28ff30
0x28ff30
0x28ff10
0x28ff10

可以發(fā)現(xiàn),this 確實指向了當前對象的首地址,而且對于不同的對象,this 的值也不一樣。

幾點注意:
this 是常量指針,它的值是不能被修改的,一切企圖修改該指針的操作,如賦值、遞增、遞減等都是不允許的。
this 只能在成員函數(shù)內部使用,其他地方?jīng)]有意義,也是非法的。
只有當對象被創(chuàng)建后 this 才有意義,因此不能在 static 成員函數(shù)中使用,后續(xù)會講到。
this 到底是什么

實際上,this 指針是作為函數(shù)的參數(shù)隱式傳遞的,它并不出現(xiàn)在參數(shù)列表中,調用成員函數(shù)時,系統(tǒng)自動獲取當前對象的地址,賦值給 this,完成參數(shù)的傳遞,無需用戶干預。

this 作為隱式參數(shù),本質上是成員函數(shù)的局部變量,不占用對象的內存,只有在發(fā)生成員函數(shù)調用時才會給 this 賦值,函數(shù)調用結束后,this 被銷毀。

正因為 this 是參數(shù),表示對象首地址,所以只能在函數(shù)內部使用,并且對象被實例化以后才有意義。

C++常對象及其成員
C++雖然采取了不少有效的措施(如設private保護)以增加數(shù)據(jù)的安全性,但是有些數(shù)據(jù)卻往往是共享的,人們可以在不同的場合通過不同的途徑訪問同一個數(shù)據(jù)對象。有時在無意之中的誤操作會改變有關數(shù)據(jù)的狀況,而這是人們所不希望出現(xiàn)的。

既要使數(shù)據(jù)能在一定范圍內共享,又要保證它不被任意修改,這時可以使用const,即把有關的數(shù)據(jù)定義為常量。
常對象

在定義對象時指定對象為常對象。常對象必須要有初值,如:

  Time const t1(12,34,46); //t1是常對象


這樣,在所有的場合中,對象t1中的所有成員的值都不能被修改。凡希望保證數(shù)據(jù)成員不被改變的對象,可以聲明為常對象。

定義常對象的一般形式為:

  類名 const 對象名[(實參表列)];


也可以把const寫在最左面:

  const 類名 對象名[(實參表列)];

二者等價。

如果一個對象被聲明為常對象,則不能調用該對象的非const型的成員函數(shù)(除了由系統(tǒng)自動調用的隱式的構造函數(shù)和析構函數(shù))。例如,對于例9.7中已定義的Time類,如果有

  const Time t1(10,15,36); //定義常對象t1
  t1.get_time( ); //企圖調用常對象t1中的非const型成員函數(shù),非法


這是為了防止這些函數(shù)會修改常對象中數(shù)據(jù)成員的值。

不能僅依靠編程者的細心來保證程序不出錯,編譯系統(tǒng)充分考慮到可能出現(xiàn)的情況,對不安全的因素予以攔截?,F(xiàn)在,編譯系統(tǒng)只檢查函數(shù)的聲明,只要發(fā)現(xiàn)調用了常對象的成員函數(shù),而且該函數(shù)未被聲明為const,就報錯,提請編程者注意。

引用常對象中的數(shù)據(jù)成員很簡單,只需將該成員函數(shù)聲明為const即可。如:

  void get_time( ) const ; //將函數(shù)聲明為const


這表示get_time是一個const型函數(shù),即常成員函數(shù)。

常成員函數(shù)可以訪問常對象中的數(shù)據(jù)成員,但仍然不允許修改常對象中數(shù)據(jù)成員的值。有時在編程時有要求,一定要修改常對象中的某個數(shù)據(jù)成員的值,ANSI C++考慮到實際編程時的需要,對此作了特殊的處理,對該數(shù)據(jù)成員聲明為mutable,如:

  mutable int count;


把count聲明為可變的數(shù)據(jù)成員,這樣就可以用聲明為const的成員函數(shù)來修改它的值。
常對象成員

可以將對象的成員聲明為const,包括常數(shù)據(jù)成員和常成員函數(shù)。

1) 常數(shù)據(jù)成員
其作用和用法與一般常變量相似,用關鍵字const來聲明常數(shù)據(jù)成員。常數(shù)據(jù)成員的值是不能改變的。

有一點要注意: 只能通過構造函數(shù)的參數(shù)初始化表對常數(shù)據(jù)成員進行初始化。如在類體中定義了常數(shù)據(jù)成員hour:

  const int hour; //聲明hour為常數(shù)據(jù)成員

不能采用在構造函數(shù)中對常數(shù)據(jù)成員賦初值的方法,下面的做法是非法的:

  Time::Time(int h){
    hour=h;
  } // 非法


因為常數(shù)據(jù)成員是不能被賦值的。

在類外定義構造函數(shù),應寫成以下形式:

  Time::Time(int h):hour(h){} //通過參數(shù)初始化表對常數(shù)據(jù)成員hour初始化


常對象的數(shù)據(jù)成員都是常數(shù)據(jù)成員,因此常對象的構造函數(shù)只能用參數(shù)初始化表對常數(shù)據(jù)成員進行初始化。


2) 常成員函數(shù)
前面已提到,一般的成員函數(shù)可以引用本類中的非const數(shù)據(jù)成員,也可以修改它們。如果將成員函數(shù)聲明為常成員函數(shù),則只能引用本類中的數(shù)據(jù)成員,而不能修改它們,例如只用于輸出數(shù)據(jù)等。如

  void get_time( ) const ; //注意const的位置在函數(shù)名和括號之后


const是函數(shù)類型的一部分,在聲明函數(shù)和定義函數(shù)時都要有const關鍵字,在調用時不必加const。常成員函數(shù)可以引用const數(shù)據(jù)成員,也可以引用非const的數(shù)據(jù)成員。const數(shù)據(jù)成員可以被const成員函數(shù)引用,也可以被非const的成員函數(shù)引用。具體情況可以用下表表示。

那么怎樣利用常成員函數(shù)呢?
如果在一個類中,有些數(shù)據(jù)成員的值允許改變,另一些數(shù)據(jù)成員的值不允許改變,則可以將一部分數(shù)據(jù)成員聲明為const,以保證其值不被改變,可以用非const的成員函數(shù)引用這些數(shù)據(jù)成員的值,并修改非const數(shù)據(jù)成員的值。
如果要求所有的數(shù)據(jù)成員的值都不允許改變,則可以將所有的數(shù)據(jù)成員聲明為const,或將對象聲明為const(常對象),然后用const成員函數(shù)引用數(shù)據(jù)成員,這樣起到“雙保險”的作用,切實保證
如果已定義了一個常對象,只能調用其中的const成員函數(shù),而不能調用非const成員函數(shù)(不論這些函數(shù)是否會修改對象中的數(shù)據(jù))。這是為了保證數(shù)據(jù)的安全。如果需要訪問對象中的數(shù)據(jù)成員,可將常對象中所有成員函數(shù)都聲明為const成員函數(shù),但應確保在函數(shù)中不修改對象中的數(shù)據(jù)成員。

不要誤認為常對象中的成員函數(shù)都是常成員函數(shù)。常對象只保證其數(shù)據(jù)成員是常數(shù)據(jù)成員,其值不被修改。如果在常對象中的成員函數(shù)未加const聲明,編譯系統(tǒng)把它作為非const成員函數(shù)處理。

還有一點要指出,常成員函數(shù)不能調用另一個非const成員函數(shù)。

相關文章

  • C++?Boost?Spirit精通教程

    C++?Boost?Spirit精通教程

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++中stack容器的使用

    C++中stack容器的使用

    本文主要介紹了C++中stack容器的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細介紹了Windows安裝配置C/C++,OpenSSL開發(fā)環(huán)境配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C語言?指針數(shù)組進階詳解

    C語言?指針數(shù)組進階詳解

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • C++中的atoi?函數(shù)簡介

    C++中的atoi?函數(shù)簡介

    這篇文章主要給大家分享的是C++中的atoi?函數(shù)的簡單介紹,在?stdlib.h?中?atoi?函數(shù),可用于將?char?字符串轉為?int?整數(shù)類型,集體的語法操作請參考下面文章的詳細內容
    2021-11-11
  • C++中類的構造函數(shù)初始值列表解讀

    C++中類的構造函數(shù)初始值列表解讀

    這篇文章主要介紹了C++中類的構造函數(shù)初始值列表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言格式化輸入輸出函數(shù)詳解

    C語言格式化輸入輸出函數(shù)詳解

    本文給大家分享的是c語言中2個格式化輸入輸出的函數(shù)printf()和scanf()的使用方法的說明及其組合方式的表單,非常詳細,推薦給大家,希望對大家能夠有所幫助。
    2015-03-03
  • C語言用遞歸函數(shù)對素數(shù)進行判斷流程

    C語言用遞歸函數(shù)對素數(shù)進行判斷流程

    素數(shù)判斷是編程語言學習過程中一個老生常談的話題,而它的實現(xiàn)也有多種算法,包括經(jīng)典的試除法(以及試除法的幾種優(yōu)化),進階的素數(shù)表篩選法,埃拉托斯特尼篩法和歐拉篩法(以及它們的優(yōu)化)等。對以上算法感興趣的朋友們,不妨搜索“素數(shù)判斷的N種境界”來學習了解
    2022-09-09
  • C語言計算大數(shù)階乘的方法

    C語言計算大數(shù)階乘的方法

    這篇文章主要為大家詳細介紹了C語言計算大數(shù)階乘的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++繼承類成員訪問權限修飾符詳解

    C++繼承類成員訪問權限修飾符詳解

    這篇文章主要為大家介紹了C++繼承類成員訪問權限修飾符,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評論