欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

詳解C++中的this指針與常對(duì)象

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊: 次

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

Student stu; //通過(guò)Student類(lèi)來(lái)創(chuàng)建對(duì)象
Student *pStu = &stu;

[示例] 通過(guò) this 來(lái)訪問(wèn)成員變量:

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ù)和成員變量重名是沒(méi)有問(wèn)題的,因?yàn)橥ㄟ^(guò) this 訪問(wèn)的是成員變量,而沒(méi)有 this 的變量是函數(shù)內(nèi)部的局部變量。例如對(duì)于this->name = name;語(yǔ)句,賦值號(hào)左邊是類(lèi)的成員變量,右邊是 setname 函數(shù)的局部變量,也就是參數(shù)。

下面是一個(gè)完整的例子:

#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<<",成績(jī)是 "<<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;
}

運(yùn)行結(jié)果:

小明的年齡是 15,成績(jī)是 90.5
李磊的年齡是 16,成績(jī)是 80

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

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

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

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


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

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

運(yùn)行結(jié)果:

0x28ff30
0x28ff30
0x28ff10
0x28ff10

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

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

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

this 作為隱式參數(shù),本質(zhì)上是成員函數(shù)的局部變量,不占用對(duì)象的內(nèi)存,只有在發(fā)生成員函數(shù)調(diào)用時(shí)才會(huì)給 this 賦值,函數(shù)調(diào)用結(jié)束后,this 被銷(xiāo)毀。

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

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

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

在定義對(duì)象時(shí)指定對(duì)象為常對(duì)象。常對(duì)象必須要有初值,如:

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


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

定義常對(duì)象的一般形式為:

  類(lèi)名 const 對(duì)象名[(實(shí)參表列)];


也可以把const寫(xiě)在最左面:

  const 類(lèi)名 對(duì)象名[(實(shí)參表列)];

二者等價(jià)。

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

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


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

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

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

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


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

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

  mutable int count;


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

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

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

有一點(diǎn)要注意: 只能通過(guò)構(gòu)造函數(shù)的參數(shù)初始化表對(duì)常數(shù)據(jù)成員進(jìn)行初始化。如在類(lèi)體中定義了常數(shù)據(jù)成員hour:

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

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

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


因?yàn)槌?shù)據(jù)成員是不能被賦值的。

在類(lèi)外定義構(gòu)造函數(shù),應(yīng)寫(xiě)成以下形式:

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


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


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

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


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

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

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

還有一點(diǎn)要指出,常成員函數(shù)不能調(diào)用另一個(gè)非const成員函數(shù)。

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有