首页 > 编程语言 >C++this指针、常函数

C++this指针、常函数

时间:2023-08-24 20:14:16浏览次数:52  
标签:调用 函数 对象 成员 C++ 属性 指针

this指针

  1. this指针的类型:类类型* const。不能被修改和赋值。

  2. 只能在成员函数的内部使用。全局函数、静态函数都不能使用this.

  3. this指针本质上其实是一个成员函数的形参(栈),是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。

  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

  5. this在成员函数的开始前构造,在成员函数的结束后清除

    6.this指针并不是对象一部分,不影响sizeof 结果,它的作用域一般在类成员函数内部。

成员函数如何区分调用它的对象-使用隐藏的this指针

1、对象的内存只存储了成员变量,没有存储成员函数指针,相当于所有的对象调用的是同一份成员函数

2、当对象调用成员函数时,编译器会自动把对象的地址传递给该成员函数,也能就是说,普通成员函数都有一个隐藏的参数,该参数名字叫做this指针 ,this指针用来接收调用对象的地址

3、this指针拿到调用对象的地址后可以直接访问该对象的成员,从而完成区分对象的任务

4、虽然this指针是隐藏定义的,但是可以显示地使用它,但不要多此一举地显示定义它

常函数

1、被const修饰了this指针的成员函数,称为常函数(只能访问)

2、当对象调用成员函数时,编译器会隐式地把对象地址传递给成员函数

3、当对象被const修饰过具有常属性,就不能直接调用普通的成员函数,因为传递的对象地址也具有了常属性,而普通成员函数的this指针参数不具备常属性,所以编译器会报错,C++编译器不允许用带常属性的指针数据给不带常属性的变量赋值

4、因此需要让成员函数中的this也具备常属性,通过const修饰变成常函数,所以const修饰的是this指针,这样就可以让具有常属性的对象调用常函数

    返回值 类名:: 成员函数(参数列表)const
    {
        //常函数
    }

5、具有常属性的对象只能调用常函数,常函数也只能调用常函数;不具备常属性的对象都可以调用

6、同名的成员函数,如果其他的参数列表完全相同,但是属性不同,也可以构成重载

7、正常来说在常函数中不能修改成员变量,除非该成员在定义时通过mutable修饰

标签:调用,函数,对象,成员,C++,属性,指针
From: https://www.cnblogs.com/ljf-0804/p/17655041.html

相关文章

  • C++静态成员和单例模式
    一、静态成员Ⅰ.什么是静态成员:被static修饰的成员变量和成员函数就叫静态成员Ⅱ.普通成员的特点:成员变量:每个类对象中都有一份属于自己的成员变量,相互之间没有关联、独立的成员函数:隐藏着一个this指针,接收调用者的地址用于区分调用者Ⅲ.静态成员的特点:静态成员变......
  • 每天一个小知识,今日知识-如何设计一个并发请求控制函数
    假如给你一个数组,里面是请求路径,如何设计一个函数去控制这些请求的并发呢?这里我们用的请求路径为https://jsonplaceholder.typicode.com/todos来模拟constreqArr=[];for(leti=1;i<=10;i++){reqArr.push(`https://jsonplaceholder.typicode.c......
  • 一些学习网站和自己写的两个计算周的函数
    toad:https://blog.csdn.net/zzpl139/article/details/127553557风控指标:https://blog.csdn.net/eroswang/article/details/117735703vintage:https://zhuanlan.zhihu.com/p/163206686风控模型:https://falbang.com/?p=350天池:https://tianchi.aliyun.com/competition/entrance/53183......
  • Ubuntu22隐藏鼠标的指针(cursor)
    目标:一段时间鼠标没有移动,则隐藏游标(cursor)1.安装unclutter-xfixes(unclutter的修复版)$sudoapt-getupdate$sudoapt-getinstallunclutter-xfixes2.启动unclutter-xfixes(一般启动)#5秒钟没有移动鼠标,则cursor消失$unclutter--timeout53.启动unclutter-xfixes(......
  • C++对象的创建和销毁过程分析
    对象的创建和销毁过程分析1、对象的创建过程①给对象划分内存空间(栈、堆)②执行初始化列表根据继承表的顺序调用父类的无参构造或有参构造通过:父类(val)调用父类的有参构造根据成员变量的定义顺序调用类类型成员的无参构造或有参构造通过:类类型成员名(val)调用类类型成员......
  • C++面向对象、类和对象、访问控制限定符
    面向对象和面向过程面向过程:关注如何解决问题,以及解决问题的步骤面向对象:关注的解决问题的"人"即"对象",以及实现能解决问题的"对象"注意:面向对象的细节的本质上还是面向过程,因此面向对象不是解决问题的捷径,而是以更高的维度去思考问题面向对象的四个特性:抽象:先找出(想象)......
  • Windows中通过C++自动添加防火墙例外规则
    在C++程序中无法直接控制防火墙警报窗口的显示,因为这是由操作系统和防火墙软件控制的。防火墙警报窗口是为了提醒用户程序正在尝试与外部网络进行通信,以确保用户意识到可能的网络活动。然而,可以通过编写C++程序在用户的系统上自动添加防火墙例外规则,从而避免防火墙警报窗口的显示......
  • 什么时候用智能指针,什么时候用普通指针
    在C++中,使用智能指针可以更方便地管理动态内存,避免了手动释放内存的繁琐操作,提高了代码的可读性和可维护性。但是智能指针并不是一种完全替代普通指针的工具,有些情况下仍然需要使用普通指针。智能指针适用于以下情况:动态内存管理:智能指针可以自动管理动态分配的内存,确保在不再......
  • golang init函数、defer函数、匿名函数、错误处理
    1.init每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用,当有全局变量跟main函数init函数同时出现的时候执行的顺序是全局函数==》init函数==》main函数packagemainimport"fmt"functest()string{ r......
  • 定义一个函数,传入一个字典和一个元组,将字典的值(key不变)和元组的值交换,返回交换后的
    知识点:zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。li=[3,4,5]t=(7,8,9)print(list(zip(li,t)))print(dict(zip(li,t)))运行截图:例1:deff(a,b):print(a)print(b)#先获取对应的元素b......