您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么在C++中使用this指針和空指針,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
C++通過提供特殊的對象指針,this指針,解決上述問題。this指針指向被調用的成員函數所屬的對象
this指針是隱含每一個非靜態成員函數內的—種指針
this指針不需要定義,直接使用即可
this指針的用途:
當形參和成員變量同名時,可用this指針來區分
在類的非靜態成員函數中返回對象本身,可使用return this
#include <iostream> using namespace std; class Person { public: Person(int age) { age = age; } int age; }; //1 解決名稱沖突 void test1() { Person p1(18); cout << "p1的年齡為=" << p1.age << endl; } int main() { test1(); return 0; }
輸出年齡亂碼
分析
光標放在形參age上,發現三個age 都是灰色,系統認為這個三個age 是同一數據
解決1:
將成員變量和形參書寫是上加m_區分
class Person { public: Person(int age) { m_Age = age; } int m_Age; };
解決2:
this指針指向 被調用的成員函數 所屬對象
class Person { public: //1 解決名稱沖突 Person(int age) { //this指針指向 被調用的成員函數 所屬對象 this->age = age; } int age; };
class Person { public: //1 解決名稱沖突 Person(int age) { //this指針指向 被調用的成員函數 所屬對象 this->age = age; } //2 返回對象本身用*this void PersonAddAge(Person &p) { this->age += p.age; } int age; }; //1 解決名稱沖突 void test1() { Person p1(18); cout << "p1的年齡為=" << p1.age << endl; //2 返回對象本身用*this Person p2(10); p2.PersonAddAge(p1); cout << "p2的年齡為=" << p2.age << endl; }
現在想要年齡后面繼續累加,出錯
函數test1()是void無返回值型,調用完畢就不能再調用了
p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
如果每次調用完畢,可以返回到p2,就可以繼續再調用PersonAddAge(p1);
//2 返回對象本身用*this Person &PersonAddAge(Person &p) { //this指向p2的指針,而*this指向的就是p2這個對象的本體 this->age += p.age; return *this; }
完整代碼
#include <iostream> #include<string> using namespace std; //1 解決名稱沖突 //2 返回對象本身用*this class Person { public: //1 解決名稱沖突 Person(int age) { //this指針指向 被調用的成員函數 所屬對象 this->age = age; } //2 返回對象本身用*this Person &PersonAddAge(Person &p) { //this指向p2的指針,而*this指向的就是p2這個對象的本體 this->age += p.age; return *this; } int age; }; //1 解決名稱沖突 void test1() { Person p1(18); cout << "p1的年齡為=" << p1.age << endl; //2 返回對象本身用*this Person p2(10); p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1); cout << "p2的年齡為=" << p2.age << endl; } int main() { test1(); return 0; }
C++中空指針也是可以調用成員函數的,但是也要注意有沒有用到this指針
如果用到this指針,需要加以判斷保證代碼的健壯性
#include<iostream> using namespace std; //空指針調用成員函數 class Person { public: void showClassName() { cout << "This is Person class" << endl; } void showPersonAge() { //報錯原因是因為傳入的是空指針 cout << "age=" <<m_Age<< endl; } int m_Age; }; void test1() { Person* p = NULL; p->showClassName(); // p->showPersonAge();//報錯原因是因為傳入的是空指針 } int main() { test1(); return 0; }
//報錯原因是因為傳入的是空指針
if(this==NULL) return; //解決空指針出錯
void showPersonAge() { //報錯原因是因為傳入的是空指針 if(this==NULL) return; //解決空指針出錯 cout << "age=" <<m_Age<< endl; }
完整代碼
#include<iostream> using namespace std; //空指針調用成員函數 class Person { public: void showClassName() { cout << "This is Person class" << endl; } void showPersonAge() { //報錯原因是因為傳入的是空指針 if(this==NULL) return; //解決空指針出錯 cout << "age=" <<m_Age<< endl; } int m_Age; }; void test1() { Person* p = NULL; p->showClassName(); p->showPersonAge();//報錯原因是因為傳入的是空指針 } int main() { test1(); return 0; }
常函數:
·成員函數后加const后我們稱為這個函數為常函數
.常函數內不可以修改成員屬性
·成員屬性聲明時加關鍵字mutable后,在常函數中依然可以修改
常對象:
·聲明對象前加const稱該對象為常對象
·常對象只能調用常函數
解決方法:
成員屬性聲明時加關鍵字mutable,在常函數中才可以修改
mutable int m_B;//特殊變量,即使在常函數中,也可修飾這個值,加關鍵字mutable
//常函數 class Person { public: //this指針的本質是指針常量,指針的指向是不可以修改的 //const Person *const this; //在成員函數后面加const,修飾的是this指向,讓指針指向的值也不可以修改 void showPerson() const { // m_A = 100; //常函數內不可以修改成員屬性 // this->m_A = 100; // this = NULL; m_B = 100; //成員屬性聲明時加關鍵字mutable,在常函數中才可以修改 } int m_A; mutable int m_B;//特殊變量,即使在常函數中,也可修飾這個值,加關鍵字mutable };
const Person p;//在對象前加const變常對象
//常對象 void test2() { const Person p;//在對象前加const變常對象 // p.m_A = 100;//報錯 p.m_B = 100;//m_B是特殊值,在常對象下也可以修改 //常對象只能調用常函數 p.showPerson(); // p.func();//常對象不可以調用普通成員函數,因為普通成員函數可以修改屬性 }
完整代碼
#include<iostream> using namespace std; //常函數 //常對象 class Person { public: //this指針的本質是指針常量,指針的指向是不可以修改的 //const Person *const this; //在成員函數后面加const,修飾的是this指向,讓指針指向的值也不可以修改 void showPerson() const { // m_A = 100; //常函數內不可以修改成員屬性 // this->m_A = 100; // this = NULL; m_B = 100; //成員屬性聲明時加關鍵字mutable,在常函數中才可以修改 } void func() { } int m_A; mutable int m_B;//特殊變量,即使在常函數中,也可修飾這個值,加關鍵字mutable }; //常函數 void test1() { Person p; p.showPerson(); } //常對象 void test2() { const Person p;//在對象前加const變常對象 // p.m_A = 100;//報錯 p.m_B = 100;//m_B是特殊值,在常對象下也可以修改 //常對象只能調用常函數 p.showPerson(); // p.func();//常對象不可以調用普通成員函數,因為普通成員函數可以修改屬性 } int main() { test1(); return 0; }
上述內容就是怎么在C++中使用this指針和空指針,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。