c++ this指针

这篇具有很好参考价值的文章主要介绍了c++ this指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

this指针介绍:

c++中成员变量和成员函数分开存储,每一个非静态成员函数只会有一个实例,多个同类型对象共用这一个成员函数。那么代码怎么区分哪个对象调用自己呢?this指针由此应运而生。

c++通过提供对象指针,this指针。this指针指向被调用的成员函数所属的对象,当创建一个对象时,编译器会初始化一个this指针,指向创建的的对象,this指针并不存储在对象内部,而是作为所有非静态成员函数的参数。this指针不需要定义,直接使用即可。

当写下如此代码时

void Person::setName(string name) {
	_name = name;
}
string Person::getName() {
	return _name;
}

当创建对象per时,编译器会初始化一个this指针指向对象per,通过per调用成员函数setName()和getName()时,编译器会将this指针作为两个函数的参数,编译后的代码可以表现为如下形式。下面代码演示的过程是隐含的,由编译器完成。

void Person::setName(Person* this, string name) {
	this->_name = name;
}
string Person::getName(Person* this) {
	return this->_name;
}

this指针的用途

(1)防止成员变量和成员函数的形参重名带来的异常

void Person::setName(string name) {
	this->name = name;
}

如果不用this指针,编译器在赋值时无法区分成员变量和形参,如下会产生异常

void Person::setName(string name) {
	name = name;
}

(2)如果类的成员函数返回值为一个对象,则可以用return *this返回对象本身(需要引用的方式传回);

#include <iostream>
using namespace std;
#include<string>
class Person {
public:
	string name;
public:
	void setName(string name);
	string getName();
	Person& test(Person &person1);
};
void Person::setName(string name) {
	this->name = name;
}
string Person::getName() {
	return this->name;
}
Person& Person::test(Person &person1) {
	this->name += person1.name;
	cout << "this:" << this << endl;
	return *this;
}
int main() {
	Person person1;
	person1.setName("张三");
	Person person2;
	person2.setName("李四");
	cout << "调用person2.test(person1)传回的对象的地址:" << &(person2.test(person1)) << endl;
	cout << "person2的对象地址:" << &person2 << endl;
	cout << person2.getName();
	return 0;
}

c++ this指针

 如果不用引用的方式传回,传回的就不是person2了,传回的是复制品

关于this指针的一些问题

当this指针为空时,有一个问题需注意

#include <iostream>
using namespace std;
#include <string>
class Person {
public:
	string name;
public:
	void f();
	void setName(string name);
};
void Person::f() {
	cout << "调用f(),没用到this指针是可以正常调用的" << endl;
}
void Person::setName(string name) {
	this->name = name;//无法正常调用,因为this指针为空,读取访问异常
}
int main() {
	Person *person = NULL;
	person->f();//可以正常调用
	person->setName("张三");//无法正常调用
}

当我们声明了Person *person = NULL后,person对象在调用函数时,this指针会指向person,this这时为空,在使用this的时候就有异常,改进如下

void Person::setName(string name) {
	if(this!=NULL){
	this->name = name;
	}
}

跳过此行代码不执行。。。文章来源地址https://www.toymoban.com/news/detail-438287.html

到了这里,关于c++ this指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++静态变量成员函数和全局函数的区别

    静态成员函数和全局函数在某些方面是相似的,但它们有一些关键的区别。 静态成员函数是与类相关联的函数,但它们不依赖于特定的类实例 。这意味着它们可以 在没有类实例的情况下被调用 ,并且没有隐含的this指针。静态成员函数可以通过类名直接调用,例如: 静态成

    2024年02月08日
    浏览(48)
  • 【C++练习】普通方法+利用this 设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义一下成员函数

    设置一个矩形类(Rectangle), 包含私有成员长(length)、 宽(width), 定义成员函数:         void set_ len(int l);  //设置长度         设置宽度void set_ wid(int w);          获取长度: int get len();          获取宽度: int get _wid);          显示周长和面积: void show();   

    2024年02月11日
    浏览(28)
  • c++中static静态成员变量和静态成员函数、explcit和隐式类型转换、友元函数()详解

    声明为 static 的类成员 称为 类的静态成员 ,用 static 修饰的 成员变量 ,称之为 静态成员变量 ;用 static 修饰 的 成员函数 ,称之为 静态成员函数 。 静态成员变量一定要在类外进行初始化   静态成员 为 所有类对象所共享 ,不属于某个具体的对象,存放在静态区   静态成

    2024年02月04日
    浏览(38)
  • c++(8.23)类,this指针,构造函数,析构函数,拷贝构造函数

    设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象 p1,设计这两个类的构造函数、析构函数和拷贝构造函数。

    2024年02月11日
    浏览(26)
  • C++ list类成员函数介绍

    目录 🤔list模板介绍: 🤔特点: 🤔list内存结构图解: 🤔 list的成员函数: 😊list构造函数: 🔍代码示例: 🔍运行结果: 😊list赋值函数: 🔍代码实例: 🔍运行结果: 😊list判断函数: 🔍代码实例: 运行结果: 😊 list的删除和插入 🔍代码实例: 运行结果: 😊

    2024年02月07日
    浏览(29)
  • C++共享之道:用extern实现源文件变量与类成员函数的巧妙共享

    概述: 在C++中,使用`extern`可实现在源文件之间共享变量与类成员函数。通过声明变量或类在头文件中,再在一个源文件中定义,其他源文件通过`extern`引用,促使模块化、可维护的代码组织。 在C++中, extern 可用于在源文件之间共享变量。它告诉编译器某个变

    2024年03月24日
    浏览(46)
  • java中this的内存原理以及成员变量和局部变量

    区分局部变量和成员变量 eg: 代表所在方法调用者的地址值 代表所在方法调用者的地址值: 此时main方法里面的调用者是s,s记录的地址值是001;this的本质是方法调用者的地址值,所以this指向的地址值是001。 this的内存原理: 解析: 等号的右边name出发了就近原则,表示setN

    2024年02月04日
    浏览(39)
  • c++类开发的第三篇(讲明白友元函数和this指针)

    c++实现了 封装 , 数据 和 处理数据的操作(函数) 是分开存储的。 c++中的 非静态数据成员 直接内含在类对象中,就像c语言的struct一样。 成员函数并不会出现在对象中,而是作为类的一部分存储在代码段中,需要通过对象或对象指针进行调用。成员函数可以访问类的所有成员

    2024年02月21日
    浏览(35)
  • 【C++】STL——queue的介绍和使用、queue的push和pop函数介绍和使用、queue的其他成员函数

    queue的介绍   1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。   2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入

    2024年02月06日
    浏览(29)
  • 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    🔥 个人主页 : Forcible Bug Maker 🔥 专栏 : C++ 目录 前言 什么是面向对象? 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 最早的C++版本(C with classes)中,最先加上的就是类的机制,它构成了面向对象编程(OOP)的

    2024年04月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包