日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++this指针的用途

發布時間:2023/12/4 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++this指针的用途 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

this指針的用途:
1.當形參和成員變量同名時,可用this指針來區分。
2.在類的非靜態成員函數中返回對象本身,可使用return *this

每一個非靜態成員函數只會誕生一份函數實例,也就是說多個同類型的對象會共用一塊代碼,那么問題是:
這一塊代碼是如何區分哪個對象調用自己的呢?

C++通過提供特殊的對象指針,this指針解決上述問題。

對象p1,p2,p3都要調用這個函數,怎么區分是誰調用的呢?
用this指針解決這個問題

this指針指向被調用的成員函數所屬的對象
簡單來說,誰調用這個函數,this指針就指向誰。

1.this指針是隱含每一個非靜態成員函數內的一種指針。
2.this指針不需要定義,直接使用即可。

1、解決名稱沖突:
現在讓我們看一下名稱沖突問題:

#include <iostream> using namespace std;class Person {public:Person(int age) {age = age;}int age;};//1.解決名稱沖突void test01() {Person p1(18);cout << "p1的年齡為:" << p1.age << endl;} //2.返回對象本身用*thisint main() {test01();return 0; }

結果為0,如果你用的編譯器是vs,結果應該是亂碼,我用的是Dev-C++。

編譯器會認為這3個age是同一個age,跟你這個屬性age不是一回事,所以我們從來沒有給這個屬性age進行賦值操作。

解決方法:
1.成員屬性和我們傳入的形參名稱不要同名。
2.使用this指針。

如何使用this指針呢?
代碼如下:

#include <iostream> using namespace std;class Person {public:Person(int age) {//this指針指向的是被調用成員函數所屬對象this->age = age;}int age;};//1.解決名稱沖突void test01() {Person p1(18);cout << "p1的年齡為:" << p1.age << endl;} //2.返回對象本身用*thisint main() {test01();return 0; }


此時編譯器就這樣認為了,所以就解決了這個問題。

2、返回對象本身用*this
首先先看這樣一段代碼:

#include <iostream> using namespace std;class Person {public:Person(int age) {this->age = age;}int age;void PersonADDAge(Person &p) {this->age += p.age;}};//1.解決名稱沖突//void test01() { // Person p1(18); // cout << "p1的年齡為:" << p1.age << endl; // //} //2.返回對象本身用*thisvoid test02() {Person p1(10);Person p2(10);p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年齡為:" << p2.age << endl;}int main() { // test01();test02();return 0; }

我們的目的是讓p2加3次p1的年齡,想要的p2年齡返回結果為40,可編譯器報錯,這是為什么呢?


因為我們第一次調用PersonADDAge這個函數后,返回的是void,所以就不能再調用這個PersonADDAge函數了,那如果我們可以讓第一次調用這個函數后的返回值仍然是p2,那就可以再次調用這個函數,那我們要如何實現呢?
使用this指針。

代碼如下:

#include <iostream> using namespace std;class Person {public:Person(int age) {this->age = age;}int age;//如果要返回本體,要用引用的方式返回。Person &PersonADDAge(Person &p) {this->age += p.age;//this指向p2的指針,而*this指向的就是p2這個對象本體。return *this;}};//1.解決名稱沖突//void test01() { // Person p1(18); // cout << "p1的年齡為:" << p1.age << endl; // //} //2.返回對象本身用*thisvoid test02() {Person p1(10);Person p2(10);//鏈式編程思想p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年齡為:" << p2.age << endl;}int main() { // test01();test02();return 0; }

此時的結果就是40了。
那為什么要用引用呢?
引用指向本身內存,不用引用就是拷貝了,而拷貝指向另一個內存。

這里返回的不是指針或者引用,因為前面加了,所以返回的是p2本體。*


這個時候我們把這個引用刪除,看看結果又是多少?
結果為:20

為什么呢?

因為此時返回的是一個拷貝的數據,每一次返回都是一個新的對象。

所以最后就第一次調用對真正的p2產生影響,所以結果為20

總結

以上是生活随笔為你收集整理的C++this指针的用途的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。