• 【C++】C++ 类中的 this 指针用法 ① ( C++ 类中的 this 指针引入 | this 指针用法 | 代码示例 )






    一、C++ 类中的 this 指针




    1、C++ 类中的 this 指针引入


    在 C++ 类中 , this 指针 是一个特殊的指针 , 由系统自动生成 , 不需要手动声明定义 , 在类中的每个 非静态成员函数 中 , 都可以调用 this 指针 ;

    this 指针 是指向 调用对象 自身 的指针 , 也就是调用 该成员函数 的 实例对象 的 内存地址 ;

    由于 this 指针只能在 非静态成员函数内部使用 , 因此 this 指针是类内部使用的指针 , 使用 this 可以访问 实例对象 中 的所有 公有 public / 保护 protected / 私有 private 成员 ;


    2、C++ 类中的 this 指针用法


    C++ 类中的 this 指针用法 :

    • 使用 this 作为指针 : 在 非静态成员函数 中 , 直接使用 this 作为 本实例对象 的指针 ;
    this
    
    • 1
    • 使用 this-> 访问成员变量 : 在 非静态成员函数 中 , 直接使用如下语法 , 访问 本实例对象 中的 非静态成员变量 ;
    this->成员变量名
    
    • 1
    • *使用 (this). 访问成员变量 : 在 非静态成员函数 中 , 直接使用如下语法 , 访问 本实例对象 中的 非静态成员变量 ; 先获取指针指向的数据 然后访问数据中的成员变量 ;
    (*this).成员变量名
    
    • 1

    在 C++ 类中 , 定义了 成员变量 age 和 height , 在 构造函数 中进行初始化 , 可以使用 this-> age 访问 age 成员变量 , 使用 this->height 访问 height 成员变量 ;

    在下面的代码中 , 参数名称也是 age 和 height , 与 成员变量名称重名了 , 使用 this 指针可以有效区分 函数参数 与 成员变量 重名的问题 ;

    使用 代码 this->age = age; 为 age 变量赋值 , this->age 是成员变量 , age 是函数的参数 ;


    示例代码 :

    class Student
    {
    public:
    	// 带参构造函数
    	Student(int age, int height)
    	{
    		this->age = age;
    		this->height = height;
    		cout << "执行 Student 的构造函数" << endl;
    	}
    
    	void print() {
    		// this 指针隐式传递
    		std::cout << "age: " << age << std::endl;
    		// 通过指针 访问成员变量
    		std::cout << "this->age: " << this->age << std::endl;
    		// 先获取指针指向的数据 然后访问数据中的成员变量
    		std::cout << "(*this).age: " << (*this).age << std::endl;
    	}
    
    public:
    	int age;		// 年龄
    	int height;		// 身高
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3、完整代码示例


    在下面的代码中 ,

    构造函数 Student(int age, int height) 的 参数名为 age 和 height ,

    成员变量为 int age 和 int height ,

    public:
    	int age;		// 年龄
    	int height;		// 身高
    
    • 1
    • 2
    • 3

    正好 , 成员变量名称 与 参数名相同 , 这里使用 this 关键字 , 可以解决名称冲突的问题 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    class Student
    {
    public:
    	// 带参构造函数
    	Student(int age, int height)
    	{
    		this->age = age;
    		this->height = height;
    		cout << "执行 Student 的构造函数" << endl;
    	}
    
    	~Student()
    	{
    		cout << "执行 Student 的析构函数" << endl;
    	}
    
    	void print() {
    		// this 指针隐式传递
    		std::cout << "age: " << age << std::endl;
    		// 通过指针 访问成员变量
    		std::cout << "this->age: " << this->age << std::endl;
    		// 先获取指针指向的数据 然后访问数据中的成员变量
    		std::cout << "(*this).age: " << (*this).age << std::endl;
    	}
    
    public:
    	int age;		// 年龄
    	int height;		// 身高
    };
    
    int main() {
    	
    	// 调用有参构造函数 创建 Student 实例对象
    	Student s(18, 180);
    
    	cout<< "s.age" << s.age << " , s.height" << s.height << endl;
    
    	s.print();
    	
    
        // 控制台暂停 , 按任意键继续向后执行
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    执行结果 :

    执行 Student 的构造函数
    s.age18 , s.height180
    age: 18
    this->age: 18
    (*this).age: 18
    请按任意键继续. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

  • 相关阅读:
    vmware centos7虚拟机出现 Generating /run/initramfs/rdsosreport.txt 问题?
    如何加快发明专利的审查时间
    【雷达检测】基于复杂环境下的雷达目标检测技术附Matlab代码
    微信小程序&会议OA-登录获取手机号流程&登录-小程序&导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)
    当生成式AI遇到业务流程管理,大语言模型正在变革BPM
    企企通:数字化浪潮下,企业如何利用间接采购策略,实现降本增效?
    Spring 源码阅读 04:BeanFactory 初始化
    Unreal&LatentAction的能与不能
    get和post的区别
    如何创建springboot项目
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133252002