最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ this指針和空指針的具體使用

 更新時間:2021年04月28日 10:27:02   作者:小猿筆記  
這篇文章主要介紹了C++ this指針和空指針的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

C++通過提供特殊的對象指針,this指針,解決上述問題。this指針指向被調用的成員函數(shù)所屬的對象

this指針是隱含每一個非靜態(tài)成員函數(shù)內的—種指針
this指針不需要定義,直接使用即可

this指針的用途:

  • 當形參和成員變量同名時,可用this指針來區(qū)分
  • 在類的非靜態(tài)成員函數(shù)中返回對象本身,可使用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上,發(fā)現(xiàn)三個age 都是灰色,系統(tǒng)認為這個三個age 是同一數(shù)據(jù)

解決1:

將成員變量和形參書寫是上加m_區(qū)分

class Person
{
public:
	Person(int age)
	{
		m_Age = age;
	}
	int m_Age;

};

在這里插入圖片描述

解決2:

this指針指向 被調用的成員函數(shù) 所屬對象

class Person
{
public:
	//1 解決名稱沖突
	Person(int age)
	{
		//this指針指向 被調用的成員函數(shù) 所屬對象
		this->age = age;
	}
	int age;

};

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2 返回對象本身用*this

class Person
{
public:
	//1 解決名稱沖突
	Person(int age)
	{
		//this指針指向 被調用的成員函數(shù) 所屬對象
		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;
}

在這里插入圖片描述

現(xiàn)在想要年齡后面繼續(xù)累加,出錯

在這里插入圖片描述

函數(shù)test1()是void無返回值型,調用完畢就不能再調用了

p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
如果每次調用完畢,可以返回到p2,就可以繼續(xù)再調用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指針指向 被調用的成員函數(shù) 所屬對象
		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;
}

在這里插入圖片描述

二、空指針調用成員函數(shù)

C++中空指針也是可以調用成員函數(shù)的,但是也要注意有沒有用到this指針

如果用到this指針,需要加以判斷保證代碼的健壯性

#include<iostream>
using namespace std;

//空指針調用成員函數(shù)

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;

//空指針調用成員函數(shù)

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修飾成員函數(shù)

常函數(shù):
·成員函數(shù)后加const后我們稱為這個函數(shù)為常函數(shù)
.常函數(shù)內不可以修改成員屬性
·成員屬性聲明時加關鍵字mutable后,在常函數(shù)中依然可以修改

常對象:
·聲明對象前加const稱該對象為常對象
·常對象只能調用常函數(shù)

在這里插入圖片描述

在這里插入圖片描述

解決方法:
成員屬性聲明時加關鍵字mutable,在常函數(shù)中才可以修改
mutable int m_B;//特殊變量,即使在常函數(shù)中,也可修飾這個值,加關鍵字mutable

//常函數(shù)
class Person
{
public:
	//this指針的本質是指針常量,指針的指向是不可以修改的
	//const Person *const this;
	//在成員函數(shù)后面加const,修飾的是this指向,讓指針指向的值也不可以修改
	void showPerson() const
	{
	//	m_A = 100; //常函數(shù)內不可以修改成員屬性
	//	this->m_A = 100;
	//	this = NULL;
		m_B = 100; //成員屬性聲明時加關鍵字mutable,在常函數(shù)中才可以修改
	}

	int m_A;
	mutable int m_B;//特殊變量,即使在常函數(shù)中,也可修飾這個值,加關鍵字mutable
};

const Person p;//在對象前加const變常對象

//常對象
void test2()
{
	const Person p;//在對象前加const變常對象
//	p.m_A = 100;//報錯
	p.m_B = 100;//m_B是特殊值,在常對象下也可以修改

	//常對象只能調用常函數(shù)
	p.showPerson();
//	p.func();//常對象不可以調用普通成員函數(shù),因為普通成員函數(shù)可以修改屬性
}

完整代碼

#include<iostream>
using namespace std;

//常函數(shù)
//常對象

class Person
{
public:
	//this指針的本質是指針常量,指針的指向是不可以修改的
	//const Person *const this;
	//在成員函數(shù)后面加const,修飾的是this指向,讓指針指向的值也不可以修改
	void showPerson() const
	{
	//	m_A = 100; //常函數(shù)內不可以修改成員屬性
	//	this->m_A = 100;
	//	this = NULL;
		m_B = 100; //成員屬性聲明時加關鍵字mutable,在常函數(shù)中才可以修改
	}

	void func()
	{

	}

	int m_A;
	mutable int m_B;//特殊變量,即使在常函數(shù)中,也可修飾這個值,加關鍵字mutable
};
//常函數(shù)
void test1()
{
	Person p;
	p.showPerson();
}

//常對象
void test2()
{
	const Person p;//在對象前加const變常對象
//	p.m_A = 100;//報錯
	p.m_B = 100;//m_B是特殊值,在常對象下也可以修改

	//常對象只能調用常函數(shù)
	p.showPerson();
//	p.func();//常對象不可以調用普通成員函數(shù),因為普通成員函數(shù)可以修改屬性
}
int main() 
{
	test1();
	return 0;
}

參考:黑馬程序員
嗶哩嗶哩 黑馬程序員

到此這篇關于C++ this指針和空指針的具體使用的文章就介紹到這了,更多相關C++ this指針和空指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于C語言實現(xiàn)掃雷游戲

    基于C語言實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++運算符重載與多繼承及二義性詳解

    C++運算符重載與多繼承及二義性詳解

    繼友元知識過后,就到了今天的C++運算符重載的內容了,運算符重載是C++里比較重要的內容。這篇博文不會一下子講完各種運算符重載,因為太多了了也不好吸收掌握,所以運算符重載我準備分多次記錄和分享,那么接下來進入正文
    2022-11-11
  • C++時間戳轉化操作實例分析【涉及GMT與CST時區(qū)轉化】

    C++時間戳轉化操作實例分析【涉及GMT與CST時區(qū)轉化】

    這篇文章主要介紹了C++時間戳轉化操作,結合實例形式分析了C++時間戳轉換與顯示操作的原理與具體實現(xiàn)技巧,涉及GMT與CST時區(qū)轉化,需要的朋友可以參考下
    2017-05-05
  • C++詳解使用floor&ceil&round實現(xiàn)保留小數(shù)點后兩位

    C++詳解使用floor&ceil&round實現(xiàn)保留小數(shù)點后兩位

    這篇文章主要介紹了C++使用floor&ceil&round實現(xiàn)保留小數(shù)點后兩位的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • C語言浮點型數(shù)據(jù)在內存中的存儲方式詳解

    C語言浮點型數(shù)據(jù)在內存中的存儲方式詳解

    任何數(shù)據(jù)在內存中都是以二進制的形式存儲的,例如一個short型數(shù)據(jù)1156,其二進制表示形式為00000100 10000100,下面這篇文章主要給大家介紹了關于C語言浮點型數(shù)據(jù)在內存中的存儲方式,需要的朋友可以參考下
    2023-03-03
  • C語言實現(xiàn)三子棋

    C語言實現(xiàn)三子棋

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)三子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • QT Creator配置Kit的實現(xiàn)示例

    QT Creator配置Kit的實現(xiàn)示例

    本文主要介紹了使用Qt5.12.12與VS2022時,因MSVC編譯器版本不匹配及Windows SDK缺失導致配置錯誤的問題解決,感興趣的可以了解一下
    2025-07-07
  • C語言實現(xiàn)航空訂票系統(tǒng)課程設計

    C語言實現(xiàn)航空訂票系統(tǒng)課程設計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)航空訂票系統(tǒng)課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言手撕一個Hash表(HashTable)實例代碼

    C語言手撕一個Hash表(HashTable)實例代碼

    哈希表(HashTable)是一種非常重要的數(shù)據(jù)結構,它可以在常量時間內進行插入、查找和刪除操作,下面這篇文章主要給大家介紹了關于C語言手撕一個Hash表(HashTable)的相關資料,需要的朋友可以參考下
    2023-03-03
  • C++深入分析回顧函數(shù)重載

    C++深入分析回顧函數(shù)重載

    C++ 允許多個函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading),借助重載,一個函數(shù)名可以有多種用途
    2022-06-06

最新評論

翼城县| 洱源县| 司法| 凤山县| 丹凤县| 靖边县| 阿克| 称多县| 乐业县| 丹东市| 西安市| 永春县| 阜新| 洮南市| 察雅县| 灵宝市| 定安县| 绥芬河市| 辽源市| 普宁市| 怀来县| 晋城| 大邑县| 石棉县| 荔波县| 高雄县| 昌平区| 龙江县| 金乡县| 普定县| 翁源县| 登封市| 天柱县| 安吉县| 新乡市| 敖汉旗| 都江堰市| 万山特区| 大竹县| 长治市| 大关县|