C++ const的使用及this指针常方法(面试最爱问的this指针)

 更新时间:2021年04月12日 08:29:30   作者:双鱼211  
这篇文章主要介绍了C++ const的使用,this指针,常方法(面试最爱问的this指针),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1. const的使用

const的使用有以下四种情况:

  • const int* p
  • int const *p
  • int* const p
  • const int* const p

我们可以通过以下图解来理解这四种情况const到底修饰的是谁:

在这里插入图片描述

当const在 “ * ” 的左边,则指向的值不能被修改
在这里插入图片描述
当const在 “ * ” 的右边,则自身不能被修改
在这里插入图片描述

2. this指针

 2.1 前言(this指针的引出)

观察如下代码,我们会发现,Date类中有Display和SetDate两个成员函数,函数体中没有关于不同对象的区分,那么当d1调用SetDate函数时,该函数是如何知道应该设置d1对象,还是设置d2对象呢?

#include<iostream>
using namespace std;
class Date
{
public:
	void DisPlay()
	{
		cout << _year <<"_"<< _month <<"_"<< _day << endl;
	}
	void SetDate(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1, d2;
	d1.SetDate(2018, 12, 15);
	d2.SetDate(2021, 4, 8);
	d1.DisPlay();
	d2.DisPlay();
	return 0;

}

为了解决上述问题,C++中引入了this指针

2.2 什么是this指针

C++编译器给每个"非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(谁调用此函数,谁就是当前对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

2.3 this指针的特性

this指针的类型:类的类型* const只能在”成员函数“的内部使用this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递this指针代表了当前对象的地址,一般情况是隐藏的

验证一:

在这里插入图片描述

此处为什么会报错呢?因为this指针一般是由编译器通过ecx寄存器自动传递的,不需要用户传递,而用户写入this指针相当于完成了编译器的工作,所以会报错


验证二:

哪种情况需要我们写入this指针呢?

在这里插入图片描述

如上图所示,我们会发现情况一,如果不使用this指针,相当于将自己赋值给自己,和私有属性中的_year,_month,_day没有关系,这样写没办法区分哪个私有属性中的哪个是参数中的,所以,只需向情况二一样,在私有成员前加是this指针即可

2.4 [面试题1] this指针存在哪?

编译器在生成程序时加入了获取对象首地址的相关代码,并把获取的相关首地址存放在寄存器ECX中(VC++编译器是放在ECX中,其他编译器有可能不同)。也就是成员函数的其他参数正常都是存放在栈中,而this指针参数存放在寄存器中

2.5 [面试题2] this指针可以为空吗?

当我们调用函数时,如果函数内部不需要使用到this指针,也就是不需要通过this指针指向当前对象并对其进行操作时,this指针可以为空(eg:在函数中什么都不放,或者随便打印一个字符串);如果调用的函数需要this指针指向当前对象,并进行操作时,this指针不能为空,否则就会发生错误(空指针引用)

3. 常方法

在一个普通成员函数后面加上const修饰,就是常成员函数

在这里插入图片描述

常方法可以访问对象中的常成员,也可以访问普通成员常方法不允许修改任何数据数据的值

意义:可以防止程序员不下心修改了成员变量的值

到此这篇关于C++ const的使用,this指针,常方法(面试最爱问的this指针)的文章就介绍到这了,更多相关C++ const的使用,this指针,常方法(面试最爱问的this指针)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ opencv利用grabCut算法实现抠图示例

    C++ opencv利用grabCut算法实现抠图示例

    这篇文章主要为大家介绍了C++ opencv利用grabCut算法实现抠图的代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C++中友元类和嵌套类使用详解

    C++中友元类和嵌套类使用详解

    友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元,所谓嵌套类,就是在类中声明的类。如下代码中,类Inner就是一个嵌套类,类Outer是外围类
    2022-08-08
  • c++中移动语义和完美转发及易错点

    c++中移动语义和完美转发及易错点

    C++ 中的移动语义和完美转发是 C++11 引入的两个重要特性,它们分别用于提高性能和灵活性,这篇文章主要介绍了c++中移动语义和完美转发,需要的朋友可以参考下
    2023-09-09
  • C语言实现选择排序、冒泡排序和快速排序的代码示例

    C语言实现选择排序、冒泡排序和快速排序的代码示例

    这篇文章主要介绍了C++中实现选择排序、冒泡排序和快速排序的代码示例,例子带有执行时间统计还可以简单看一下效率对比,需要的朋友可以参考下
    2016-04-04
  • C/C++实现发送与接收HTTP/S请求的示例代码

    C/C++实现发送与接收HTTP/S请求的示例代码

    HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议,它是一种无状态的、应用层的协议,用于在计算机之间传输超文本文档,通常在 Web 浏览器和 Web 服务器之间进行数据通信,本文给大家介绍了C/C++发送与接收HTTP/S请求,需要的朋友可以参考下
    2023-11-11
  • floyd算法实现思路及实例代码

    floyd算法实现思路及实例代码

    这篇文章主要介绍了floyd算法实现思路及实例代码,有需要的朋友可以参考一下
    2014-01-01
  • C++继承中的访问控制实例分析

    C++继承中的访问控制实例分析

    这篇文章主要介绍了C++继承中的访问控制,是面向对象程序设计中非常重要的知识点,需要的朋友可以参考下
    2014-08-08
  • 了解C++编程中指定的异常和未经处理的异常

    了解C++编程中指定的异常和未经处理的异常

    这篇文章主要介绍了C++中指定的异常和未经处理的异常,介绍了有关noexcept和terminate的作用,并结合了C++11标准的新特性,需要的朋友可以参考下
    2016-01-01
  • 详解C++如何高效利用CPU缓存

    详解C++如何高效利用CPU缓存

    高效利用CPU缓存是编写高性能C++代码的关键之一,所以这篇文章小编主要来和大家介绍一下C++如何实现高效利用CPU缓存,需要的可以参考一下
    2024-02-02
  • C调用C++代码的方法步骤

    C调用C++代码的方法步骤

    本文主要介绍了C调用C++代码的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论