this指標和空指標
- 一、this指標
- 1 this指標解決名稱沖突
- 2 回傳物件本身用*this
- 二、空指標呼叫成員函式
- 三、const修飾成員函式
在上一篇文章中,我們知道,C++中成員變數和成員函式是分開存盤的
每一個非靜態成員函式只會誕生一份函式實體,也就是說多個同型別的物件會共用一塊代碼那么問題是:這—塊代碼是如何區分那個物件呼叫自己的呢?
C++通過提供特殊的物件指標,this指標,解決上述問題,this指標指向被呼叫的成員函式所屬的物件
this指標是隱含每一個非靜態成員函式內的—種指標
this指標不需要定義,直接使用即可
this指標的用途:
*·當形參和成員變數同名時,可用this指標來區分
·在類的非靜態成員函式中回傳物件本身,可使用return this

一、this指標
1 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;
};



2 回傳物件本身用*this
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修飾成員函式
常函式:
·成員函式后加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;
}
參考:黑馬程式員
嗶哩嗶哩 黑馬程式員
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281012.html
標籤:其他
上一篇:Linux-信號的捕捉-信號的阻塞-volatile關鍵字
下一篇:j-Interop連接64位系統的WMI獲取資訊報錯:java.lang.ArrayIndexOutOfBoundsException: 16
