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指针)内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

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

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

  • C++中的const的使用详解

     C++中的const的使用详解 const在c/c++中还是会经常出现的,并且如果不理解const会在编程出现的错误而不知所措,无法理解.下面从几个角度简要理解const的内容,应该还是蛮有用的. const与指针类型 const int*p = NULL; 和int const*p = NULL;是等价的.因为const都在" * "的前面,其实是以*为标志的. 1. int x = 3; const int *p = &x; // p = &y;正确 , //*p

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

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

  • c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 复制代码 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 ... ... 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛出错误信息.如果该信息提示6.65这里有错误,Ok如果你运气好你正好记得或者程序简单一眼能找到6.65表示什么,如果程序很复杂,而且报出6.65的文件是引用该文件,不记得,那么你会困惑这是什么?或许会花大

  • 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++中const的使用详解

    Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的. 1.定义常量(1)const修饰变量,以下两种定义形式在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的. TYPE const ValueName = value;      const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声

  • 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和SetD

  • C语言中const与指针使用方法总结

    C语言中const与指针使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 总结: * const 值不能改变,指向可改变 const * 值能改变,指向不可改变 const * const 都不能改变 实例代码: #include <stdio.h> int main(int argc, const char * argv[]) { // 1 可改

  • C++深入探究类与对象之对象模型与this指针使用方法

    目录 C++对象模型和this指针 1 成员变量和成员函数分开存储 2 this指针概念 3 空指针访问成员函数 4 const修饰成员函数 C++面向对象的三大特性为:封装.继承.多态 C++认为万事万物都皆为对象,对象上有其属性和行为 例如: ​ 人可以作为对象,属性有姓名.年龄.身高.体重…,行为有走.跑.跳.吃饭.唱歌… ​ 车也可以作为对象,属性有轮胎.方向盘.车灯…,行为有载人.放音乐.放空调… ​ 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类 C++对象模型和th

  • Go语言的方法接受者类型用值类型还是指针类型?

    概述 很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下. 何时使用值类型 1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型). 2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存给 slice,使用值类型. 3.如果接受者是一个小的数组或者原生的值类型结构体类型(比如 time.Time 类

  • 总结C/C++面试中可能会碰到的字符串指针题

    前言 不知道大家有没有这种体会,很多面试题看似简单,却需要深厚的基本功才能给出完美的解答.企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分.读者可从本文看到 strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次.此外,还有一些面试题考查面试者敏捷的思维能力. 分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的

  • Java中的this指针使用方法分享

    Java中, 一般来说this指针指的是当前正在访问的这段代码的对象 ,但是如果在内部类中需要使用外部类中的对象,这时就需要使用外部类的类名进行限定. 这种方式在Android开发中也比较常见 . @Author: twlkyao package twlkyao; public class A { public A() { Inner inner = new Inner(); inner.outer(); // call the inner class's outer method. this.

  • C++智能指针读书笔记

    最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. C++通过一对运算符 new 和 delete 进行动态内存管理,new在动态内存中

  • 五个经典链表OJ题带你进阶C++链表篇

    目录 反转单链表 返回链表中间节点的位置 合并两个有序链表 判断链表中是否有环 判断环形链表进入的节点 反转单链表 题目1:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表. 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 题目来源:力扣 思路一: 翻转指针方向,首先我们要有三个指针,这个就不展示代码了,逻辑过程如下: 思路二:头插方法,我们把每个节点拿下来进行头插实现!代码实现如下: struct ListNode* reverseList

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

    指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. 复制代码 代码如下: Time t1(10,12,15),t2;Time * const ptr1=&t1;ptr1=&t2; 定义指向对象的常指针的一般形式为 类名    *    const    指针变量=对象地址; 注意应该在定义指针变量时使之初始化 指向对象的常指针变量的值不能被改变,即始终指向同一个对象,但可以改变其所指向对象中的数据成员(非const型)的值. 往

  • 指针与const限定符的使用分析

    const限定符和指针结合起来常见的情况有以下几种. (1)指向常量的指针 const int *a; int const *a; 这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但a可以改写,所以a++是允许的. 指针指向的内容不变,但是指针本身是可以变的. (2)常指针 int * const a; a是一个指向int型的const指针,*a是可以改写的,但a不允许改写. 指针本身是不可以变的,但是指针指向的内容是可以变的.

随机推荐