欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

this指針的用途:

  • 當(dāng)形參和成員變量同名時(shí),可用this指針來(lái)區(qū)分
  • 在類的非靜態(tài)成員函數(shù)中返回對(duì)象本身,可使用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;
}

輸出年齡亂碼

在這里插入圖片描述

分析

在這里插入圖片描述

光標(biāo)放在形參age上,發(fā)現(xiàn)三個(gè)age 都是灰色,系統(tǒng)認(rèn)為這個(gè)三個(gè)age 是同一數(shù)據(jù)

解決1:

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

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

};

在這里插入圖片描述

解決2:

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

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

};

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2 返回對(duì)象本身用*this

class Person
{
public:
	//1 解決名稱沖突
	Person(int age)
	{
		//this指針指向 被調(diào)用的成員函數(shù) 所屬對(duì)象
		this->age = age;
	}
	
	//2 返回對(duì)象本身用*this
	void PersonAddAge(Person &p)
	{
		this->age += p.age;
	}

	int age;

};
//1 解決名稱沖突
void test1()
{
	Person p1(18);
	cout << "p1的年齡為=" << p1.age << endl;

	//2 返回對(duì)象本身用*this
	Person p2(10);
	p2.PersonAddAge(p1);
	cout << "p2的年齡為=" << p2.age << endl;
}

在這里插入圖片描述

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

在這里插入圖片描述

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

p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
如果每次調(diào)用完畢,可以返回到p2,就可以繼續(xù)再調(diào)用PersonAddAge(p1);

//2 返回對(duì)象本身用*this
Person &PersonAddAge(Person &p)
{
	//this指向p2的指針,而*this指向的就是p2這個(gè)對(duì)象的本體
	this->age += p.age;
	return *this;
}

完整代碼

#include <iostream>
#include<string>
using namespace std;

//1 解決名稱沖突

//2 返回對(duì)象本身用*this

class Person
{
public:
	//1 解決名稱沖突
	Person(int age)
	{
		//this指針指向 被調(diào)用的成員函數(shù) 所屬對(duì)象
		this->age = age;
	}
	
	//2 返回對(duì)象本身用*this
	Person &PersonAddAge(Person &p)
	{
		//this指向p2的指針,而*this指向的就是p2這個(gè)對(duì)象的本體
		this->age += p.age;
		return *this;
	}

	int age;

};
//1 解決名稱沖突
void test1()
{
	Person p1(18);
	cout << "p1的年齡為=" << p1.age << endl;

	//2 返回對(duì)象本身用*this
	Person p2(10);
	p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
	cout << "p2的年齡為=" << p2.age << endl;
}

int main() 
{
	test1();
	return 0;
}

在這里插入圖片描述

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

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

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

#include<iostream>
using namespace std;

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

class Person
{
public:
	void showClassName()
	{
		cout << "This is Person class" << endl;
	}

	void showPersonAge()
	{
		//報(bào)錯(cuò)原因是因?yàn)閭魅氲氖强罩羔?
		cout << "age=" <<m_Age<< endl;
	}
	int m_Age;
};

void test1()
{
	Person* p = NULL;
	p->showClassName();
//	p->showPersonAge();//報(bào)錯(cuò)原因是因?yàn)閭魅氲氖强罩羔?
}

int main() 
{
	test1();
	return 0;
}

在這里插入圖片描述

//報(bào)錯(cuò)原因是因?yàn)閭魅氲氖强罩羔?/p>

if(this==NULL) return; //解決空指針出錯(cuò)

void showPersonAge()
{
	//報(bào)錯(cuò)原因是因?yàn)閭魅氲氖强罩羔?

	if(this==NULL)  return; //解決空指針出錯(cuò)

	cout << "age=" <<m_Age<< endl;
}

完整代碼

#include<iostream>
using namespace std;

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

class Person
{
public:
	void showClassName()
	{
		cout << "This is Person class" << endl;
	}

	void showPersonAge()
	{
		//報(bào)錯(cuò)原因是因?yàn)閭魅氲氖强罩羔?

		if(this==NULL)  return; //解決空指針出錯(cuò)

		cout << "age=" <<m_Age<< endl;
	}
	int m_Age;
};

void test1()
{
	Person* p = NULL;
	p->showClassName();
	p->showPersonAge();//報(bào)錯(cuò)原因是因?yàn)閭魅氲氖强罩羔?
}

int main() 
{
	test1();
	return 0;
}

在這里插入圖片描述

三、const修飾成員函數(shù)

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

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

在這里插入圖片描述

在這里插入圖片描述

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

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

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

const Person p;//在對(duì)象前加const變常對(duì)象

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

	//常對(duì)象只能調(diào)用常函數(shù)
	p.showPerson();
//	p.func();//常對(duì)象不可以調(diào)用普通成員函數(shù),因?yàn)槠胀ǔ蓡T函數(shù)可以修改屬性
}

完整代碼

#include<iostream>
using namespace std;

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

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

	void func()
	{

	}

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

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

	//常對(duì)象只能調(diào)用常函數(shù)
	p.showPerson();
//	p.func();//常對(duì)象不可以調(diào)用普通成員函數(shù),因?yàn)槠胀ǔ蓡T函數(shù)可以修改屬性
}
int main() 
{
	test1();
	return 0;
}

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)打印虛函數(shù)表的地址

    C++實(shí)現(xiàn)打印虛函數(shù)表的地址

    對(duì)于存在虛函數(shù)的類,如何打印虛函數(shù)表的地址,并利用這個(gè)虛函數(shù)表的地址來(lái)執(zhí)行該類中的虛函數(shù)呢,下面小編就來(lái)和大家一起簡(jiǎn)單聊聊吧
    2023-07-07
  • C++ OpenCV制作黑客帝國(guó)風(fēng)格的照片

    C++ OpenCV制作黑客帝國(guó)風(fēng)格的照片

    這篇文章主要介紹了如何通過C++ OpenCV制作出黑客帝國(guó)風(fēng)格的照片,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,需要的可以參考一下
    2022-01-01
  • 淺談c語(yǔ)言中類型隱性轉(zhuǎn)換的坑

    淺談c語(yǔ)言中類型隱性轉(zhuǎn)換的坑

    下面小編就為大家?guī)?lái)一篇淺談c語(yǔ)言中類型隱性轉(zhuǎn)換的坑。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-08-08
  • C++的optional用法實(shí)例詳解

    C++的optional用法實(shí)例詳解

    編程中我們可能會(huì)遇到要處理可能為空的變量,比如說(shuō)容器,基本類型,或者說(shuō)對(duì)象實(shí)例,下面通過實(shí)例代碼介紹C++的optional用法,感興趣的朋友一起看看吧
    2024-02-02
  • C語(yǔ)言實(shí)現(xiàn)將字符串轉(zhuǎn)換成整數(shù)

    C語(yǔ)言實(shí)現(xiàn)將字符串轉(zhuǎn)換成整數(shù)

    這篇文章主要為大家詳細(xì)介紹了如何用C語(yǔ)言寫一個(gè)函數(shù),把字符串轉(zhuǎn)換成整數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • c++ 網(wǎng)絡(luò)庫(kù)asio的優(yōu)勢(shì)

    c++ 網(wǎng)絡(luò)庫(kù)asio的優(yōu)勢(shì)

    這篇文章主要介紹了c++ 網(wǎng)絡(luò)庫(kù)asio的優(yōu)勢(shì),幫助大家更好的利用c++開發(fā)服務(wù)端程序,感興趣的朋友可以了解下
    2020-10-10
  • C++實(shí)現(xiàn)五子棋游戲

    C++實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++中淺拷貝與深拷貝的詳解及其作用介紹

    C++中淺拷貝與深拷貝的詳解及其作用介紹

    這篇文章主要介紹了C++中淺拷貝與深拷貝的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言找出數(shù)組中的特定元素的算法解析

    C語(yǔ)言找出數(shù)組中的特定元素的算法解析

    這篇文章主要介紹了C語(yǔ)言中找出數(shù)組中特定元素的算法解析,包括找出數(shù)組中兩個(gè)只出現(xiàn)一次的數(shù)字的方法,需要的朋友可以參考下
    2016-03-03
  • Qt實(shí)現(xiàn)簡(jiǎn)易秒表設(shè)計(jì)

    Qt實(shí)現(xiàn)簡(jiǎn)易秒表設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)簡(jiǎn)易秒表設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論