C++ this指针和空指针的具体使用

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码那么问题是:这—块代码是如何区分那个对象调用自己的呢?

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;
}

参考:黑马程序员
哔哩哔哩 黑马程序员

到此这篇关于C++ this指针和空指针的具体使用的文章就介绍到这了,更多相关C++ this指针和空指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++编程指向成员的指针以及this指针的基本使用指南

    指向成员的指针 指向成员的指针的声明是指针声明的特例.使用以下序列来声明它们: [storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier] qualified-name ::* [cv-qualifiers] identifier [= & qualified-name :: member-name]; 声明说明符: 可选存储类说明符. 可选 const 和/或 volatile 说明符. 类型说明符:类型的名

  • C++基础之this指针与另一种“多态”

    一.引入定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数. 一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量.而对于同一个类的每一个对象,都是共享同一份类函数.对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成员变量是哪个对象的.这种用于对成员变量归属对像进行区分的东西,就叫做this指针.事实上它就是对象的地址,这一点从反汇编出来的代码可以看到. 二.分析1.测试代码: 复制代码 代码如

  • C++中this指针用法详解及实例

    C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法. this指针概览 C++中,每个类 对应了一个对象,每个对象指向自己所在内存地址的方式即为使用this指针.在类中,this指针作为一个变量通过编译器隐式传递给非暂存(non-static)成员函数.因为this指针不是对象本身,因此sizeof函数并不能用于确定this指针所对应的对象大小.this指针的具体类型与具体对象的类型

  • C++ 中的this指针详解及实例

    C++ this 指针详解 学习 C++ 的指针既简单又有趣.通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的. 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. this指针是类的一个自动生成.自动隐蔽的私有成员,它存在于类的非静态成员中,指向被调用函数所在的对象. 全局仅有一个this指针,当一个对

  • C/C++静态类和this指针详解及实例代码

     C/C++静态类和this指针详解 1.静态类 C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问. class CBook{ public: static double price;//需要通过类外来进行初始化 } int main(void){ CBook book; book.price;//通过对象来访问 CBook::price//通过类名来访问 return 0; } 静态成员变量 对应静态成员有以下几点需要注意: (1)静态数据成员可以是当前类的类型,而其他数据成员

  • C++中this指针的理解与作用详解

    01 C++ 程序到 C 程序的翻译 要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码 class Car { public: int m_price; // 成员变量 void SetPrice(int p) // 成员函数 { m_price = p; } }; int main() { Car car; car.SetPrice(20000); // 给car对象m_price成员变量赋值 return 0; } C 语言是没有类定义的class关键词,

  • 深度理解c++中的this指针

    1.this指针,就是一个指向当前对象的指针.我们知道,定义出一个类,它在内存中是不占空间的,只有定义了该类类型的对象时,系统就会为该对象分配一段存储空间,这段空间里只存储成员变量,对于成员函数,是存放在代码区的.(复习:内存分为5大区:静态区.常量区.栈.堆.代码区).下边给出一个日期类,通过这个实例,深度理解this指针. #define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; class Date { public:

  • C++中this指针的用法及介绍

    this指针只能在一个类的成员函数中调用,它表示当前对象的地址.下面是一个例子:   复制代码 代码如下: void Date::setMonth( int mn )     {      month = mn; // 这三句是等价的      this->month = mn;      (*this).month = mn;     } 1. this只能在成员函数中使用.全局函数,静态函数都不能使用this.实际上,成员函数默认第一个参数为T* const register this.如:

  • 详解C++中的this指针与常对象

    C++ this指针详解 this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址).通过 this,可以访问当前对象的成员变量和成员函数. 所谓当前对象,就是正在使用的对象,例如对于stu.say();,stu 就是当前对象,系统正在访问 stu 的成员函数 say(). 假设 this 指向 stu 对象,那么下面的语句中,this 就和 pStu 的值相同: Student stu; //通过Student类来创建对象 Student *pStu = &s

  • C++ this指针和空指针的具体使用

    每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码那么问题是:这-块代码是如何区分那个对象调用自己的呢? C++通过提供特殊的对象指针,this指针,解决上述问题.this指针指向被调用的成员函数所属的对象 this指针是隐含每一个非静态成员函数内的-种指针 this指针不需要定义,直接使用即可 this指针的用途: 当形参和成员变量同名时,可用this指针来区分 在类的非静态成员函数中返回对象本身,可使用return this 一.this指针 1 this指针解

  • C语言 野指针与空指针专篇解读

    一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的). 说明:指针变量也是变量,是变量就可以任意赋值.但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域). 注:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题. 代码示例: int a = 100; int *p; p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义 p = 0x12345

  • C语言基础野指针与空指针示例分析

    目录 一:野指针 1.1 :野指针的成因 2.1 :规避野指针 1. 初始化指针 2. 避免指针越界 3 避免返回局部变量的地址 4. 开辟的指针释放后置为NULL 5. 养成良好的编程习惯 二:空指针 一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的). 说明:指针变量也是变量,是变量就可以任意赋值.但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域). 注:野指针不会直接引发错误

  • 解析C语言中空指针、空指针常量、NULL & 0的详解

    什么是空指针常量(null pointer constant)?[6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant. 这里告诉我们:0.0L.'\0'.3 - 3.0 * 17 (它们都是"integer constant expression")以及 (void*

  • C语言的空类型指针,空指针,野指针详解

    目录 空类型指针-void* 空指针-NULL 野指针 造成野指针的原因 1.指针未初始化 2.指针越界访问 3.指针指向的空间已经释放 避免野指针 总结 空类型指针-void* void是空类型,void*是空类型指针,又叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进行解引用,必须强制类型转换成相应的指针类型,才能进行解引用操作. 空指针类型: 作为函数形参类型,可以接收任意类型的指针: 作为函数返回值类型,在函数外面,将其强制类型转换为相应的指针类型

  • 函数指针与指针函数的学习总结

    函数指针是指向函数的指针,指针函数是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑.各位能否讲的详细点呢? (1) float(**def)[10]   def是什么?(2) double*(*gh)[10]   gh是什么?(3) double(*f[10])()   f是什么?(4) int*((*b)[10])    b是什么?这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? ======================解答:   (1) def是一个指针, 指向的对象

  • C语言中各类指针的用法(小结)

    一.指针的大小 二.野指针和空指针 #include <stdio.h> int main(void) { int a = 6; int* p; p = a;//把a的值赋给指针变量p,p为野指针,这样做不会出现啥问题,但是没什么意义 p = 0x456;//为指针变量p赋值,p为野指针,这样做不会出现啥问题,但是没什么意义 *p = 100;//操作野指针指向未知区域,内存会出问题,报错. return 0; } 但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量(

  • C++ STL 四种智能指针的用法详解

    0.前言 C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr.unique_ptr.shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr.虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述.shared_ptr 和 weak_ptr 则是

  • C++的指针,引用和STL详解

    目录 指针.引用 指针 引用 STL STL中六大组件 常用容器用法介绍 vec.front(),vec.back()    返回vector的首尾元素 重载运算符 总结 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间 一个对象a,它有值和地址:运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,通过该对象的地址,来访问存储空间中的值. 指针.引用 指针 类型名 * 指针变量名: 每个变量都被存放在从某个内存地址(以字节为单位)开始的若干个字节中:"指针",也称作&

  • 详解C语言的void*空指针

    目录 void的应用 空指针类型(void*) 总结 在C语言中,void称为无类型,相应的void*称为无类型指针或者空指针类型. void的应用 对函数返回值的限定. 例如void func(int);该函数没有返回值.对函数参数类型的限定. 例如int func(void);该函数没有参数,不允许接收参数. 空指针类型(void*) 空指针类型的变量void* pvoid;可以指向任意类型的数据,任何类型的指针也可以直接赋值给空指针类型的变量. #include <stdio.h> in

随机推荐