一起来学习C++中类的this指针以使用

目录
  • 一,this指针的注意点
    • 错误用例:
  • 二,this指针存在哪里
  • 三,this指针的面试坑题
  • 总结

c++的类中,非静态的成员函数都有一个隐藏的this指针,在函数体中所以的成员变量都是通过this指针来访问的。但是this指针是对用户是透明的,用户不需要显示的给this指针传参,编译时会自动接收参数。

,this指针的注意点

  • 调用成员函数时,不可以显示给this指针传参
  • 定义成员函数时,不能显示的声明this指针
  • 在成员函数内部,可以显示的使用this指针

用一个日期类,来讲述this指针的注意点:

class Date
{
 public:
 void Print()
 {
  cout<<_year<<"/"<<_month<<"/"<<_day<<endl;
 }
 Date (int year,int month,int day)
 {
  _year=year;
  _month=month;
  _day=day;
 ]
 private:
 int _year;
 int _month;
 int _day;
}

以上就是一个日期类了,在类里面我定义了一个成员函数Print,这里要讲一下,在类中定义一个成员函数可能会被看成内联函数,想这么简单一个Print 函数一般是会别看成内联函数的。

其实这个成员函数还可以写成这样:

void Print()
{
 cout<<this->_year<<"/"<<this->_month<<"/"<<this->day<<endl;
}

这样写有点画蛇添足的感觉,但是方便大家看,在成员函数中每个成员变量的访问都里离不开this指针。这个this指针隐藏在函数形参的头一位,也就是Print(Date * this)。

比如我要调用这个成员函数:

int main()
{
 Date s1(2022,2,28);
 Date s2(2022,3,1);
 s1.Print();
 s2.Print();
}

运行结果如下:

可以看到,调用结果是符合预期的,Print函数中是利用this指针来区分对象的。

错误用例:

(1)

int main()
{
 Date s1(2022,2,28);
 s1.Print(&s1);
}

不可以显示的给this指针传参,虽然我们知道this指针存在,但是我们不可以给this指针传参,就当潜规则吧。

(2)

void Date::Print(Date* this);

成员函数的声明以及定义都不能有this指针,这样做不行的,可以想想设计者的初心,他是嫌弃老是传地址麻烦,所以搞了一个隐藏的this指针,你再给函数传参或者定义函数时给this指针,不是多此一举嘛。

二,this指针存在哪里

this指针是成员函数第一个隐藏的指针形参,一般存在栈中。但是也是由编译器决定的,有的就存在寄存器中。

三,this指针的面试坑题

class A
{
public:
 void PrintA()
 {
 cout<<_a<<endl;
 }
 void Show()
 {
 cout<<"Show()"<<endl;
 }
private:
 int _a;
};
int main()
{
 A* p = nullptr;
 p->PrintA();
 p->Show();
 }

问:以上程序可以运行嘛?会崩溃嘛?崩溃在哪里?

这是对空指针解引用导致的内存问题,所以程序崩溃了,this指针可以为空,但是不能对空指针解引用,函数PrintA中,cout<<_a<;可以写成cout<< this -> _a<; 讲到这大家应该懂了。

还有一点那么Show函数有问题嘛?没问题,因为不存在对this的解引用。

我们将PrintA函数屏蔽掉,看运行结果:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++this指针详情

    还是Stock股票这个类,假设我们要实现一个方法,比较一下当前股票和传入的股票, 返回价格高的那个股票.在我们实现的时候,会遇到一点问题. const Stock & Stock::topVal(const Stock &s) const {     if (s.total_val > total_val) {         return s;     }else {         return ????;     } } 这段代码当中有一些问题,我们一个一个来说. 首先说函数签

  • C++使用模板类实现链式栈

    本文实例为大家分享了C++使用模板类实现链式栈的具体代码,供大家参考,具体内容如下 一.实现程序: 1.Stack.h #ifndef Stack_h #define Stack_h template <class T> class Stack { public: Stack(){}; // 构造函数 void Push(const T x); // 新元素进栈 bool Pop(); // 栈顶元素出栈 virtual bool getTop(T &x) const = 0; //

  • C++使用模板实现单链表(类外实现)

    本文实例为大家分享了C++使用模板实现单链表的具体代码,供大家参考,具体内容如下 这一篇可以和上一篇点击打开链接 模板实现单链表进行对比 看类外实现和类内实现的区别 代码: #include <iostream> using namespace std; template<typename T> class CLink { public: class Node; CLink();//无参的构造函数 void InsertHead(T data);//头插 void InsertTa

  • C++ 中this指针的用途详解

    目录 1.区分形参和变量同名时: 2.return *this返回函数本身 总结 先说结论: 1.形参和变量同名时,可用this指针来区分 2.在类的非静态成员函数中返回本身,可用return *this 1.区分形参和变量同名时: #include <iostream> using namespace std; class Person { public: Person(int age) { age = age; } int age; }; void test01() { Person p1

  • C++对象模型和this指针详解

    目录 对象模型 一. 二. 三. 四. 五. this指针 一. 二. 总结 对象模型 成员变量和成员函数分开存储 一. 只有非静态成员变量才属于类的对象上 空对象占用字节为1 class Person { }; void test01() { Person p; cout << "size of = " << sizeof(p) << endl; } int main() { test01(); system("pause");

  • C++ 类模板、函数模板全特化、偏特化的使用

    一.类模板全特化.偏特化 #pragma once #include <iostream> #include <map> template <typename T, typename U> class TC { public: TC() { std::cout << "泛化版本构造函数" << std::endl; } void funtest() { std::cout << "泛化版本成员函数&quo

  • 一起来学习C++中类的this指针以使用

    目录 一,this指针的注意点 错误用例: 二,this指针存在哪里 三,this指针的面试坑题 总结 c++的类中,非静态的成员函数都有一个隐藏的this指针,在函数体中所以的成员变量都是通过this指针来访问的.但是this指针是对用户是透明的,用户不需要显示的给this指针传参,编译时会自动接收参数. 一,this指针的注意点 调用成员函数时,不可以显示给this指针传参 定义成员函数时,不能显示的声明this指针 在成员函数内部,可以显示的使用this指针 用一个日期类,来讲述this指

  • 学习二维动态数组指针做矩阵运算的方法

    本文分享了利用二维动态数组指针做矩阵运算的实现代码. 1. 头文件 // juzhen 2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdlib.h" #include "windows.h" #define OK 0 #define NG -1 typedef struct mat { int nRow

  • C语言清楚了解指针的使用

    目录 前言 字符指针 指针数组 数组指针 函数指针 前言 经过了指针的初步学习,我们了解了指针有以下特点: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间. 2. 指针的大小是固定的4/8个字节(32位平台/64位平台). 3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限. 4. 指针的运算. 今天将要从各种不同的指针的角度切入,使得我们对指针的了解更加深入. 字符指针 我们现在已经学会下面的这种指针的使用了: int main() { char

  • C语言实现图书管理系统

    目前为止跟着学校进度学习C语言大概半年左右,基础学习只学到了指针,学得非常浅.说实话,起初对C语言的印象---只是一个学习计算机语言的敲门砖,对具体C语言如何应用等,非常迷茫.直到大一下半学期的高级语言设计课程之后,试过dos运行的图形化界面的完整小程序,才发现C语言的魅力. ok,废话不多说了,下面是我第二节课的作品----C语言的图书管理系统.一个简单的小程序.并非纯原创,是基于网络搜索到的"学生管理系统"改编而成的.通过直接浏览.修改一个完整的代码,我的收获颇丰.我认为这样比枯燥

  • python的json中方法及jsonpath模块用法分析

    本文实例讲述了python的json中方法及jsonpath模块用法.分享给大家供大家参考,具体如下: 什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与后台之间的数据交互. json模块中方法的学习 其中类文件对象的理解: 具有read()或者write()方法的对象就是类文件对象,比如f = open("a.txt",

  • C语言实现删除某一个数组值的方法

    目录 1.前言 2.删除数组中的元素 1.前言 在家里闲着还是闲着,这几天见证了Python各种数据结构的强大.Python中的数据类型如:列表.元组.字典等都具有其的特点.列表无需要设定其的长度,我们可以随机插入元素,同时元素的类型也是随意的. 或许这就是面向对象语言的强大,C语言做为面向过程的语言自然没有如同Python一般强大的功能.学习C语言不会指针和结构体确实玩不出什么东西,就例次CCF考试的字符串处理题使用C语言难度都很大,但是使用诸如C++一样面向对象的语言都是能轻而易举地解决问题

  • C语言实现简单图书管理系统

    目前为止跟着学校进度学习C语言大概半年左右,基础学习只学到了指针,学得非常浅.说实话,起初对C语言的印象---只是一个学习计算机语言的敲门砖,对具体C语言如何应用等,非常迷茫.直到大一下半学期的高级语言设计课程之后,试过dos运行的图形化界面的完整小程序,才发现C语言的魅力. ok,废话不多说了,下面是我第二节课的作品----C语言的图书管理系统.一个简单的小程序.并非纯原创,是基于网络搜索到的"学生管理系统"改编而成的.通过直接浏览.修改一个完整的代码,我的收获颇丰.我认为这样比枯燥

  • javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)

    关于javascript中类的继承可以参考阮一峰的Blog<Javascript继承机制的设计思想>,说的很透. 一.在javascript中实例化遇到的问题: 下面用<javascript高级程序设计>中的例子来做说明,假如现在定义了一个car的对象,它是Object类的实例.像下面这样的: 复制代码 代码如下: var oCar=new Object(); oCar.color = "red"; oCar.doors = 4; oCar.mpg = 23;

  • 深入学习C语言中的函数指针和左右法则

    通常的函数调用     一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用MyFun(10);函数 return 0; } void MyFun(int x) //这里定义一个MyFun函数 { printf("%d\n",x); } 这个MyFun函数是一个无返回值的函数,它并不完成

  • 关于《C和指针》的学习笔记

    有了之前的基础,此文只是把一些以前没有注意到的和值得学习的知识做一个记录. 第一章 作者认为使用#if 0 .... #endif比用/*和*/好,因为后者不能嵌套.但是对于//并没有说明. 第二章 三字母词,用两个问号加一个符号表示另一个符号,比较类似于转义字符.查阅了一些资料,它的使用与编译器有关,了解即可,防止字符串常量被错误的解释. 复制代码 代码如下: ??( ==> [ ??< ==> { ??= ==> # ??) ==> ] ??> ==> } ?

随机推荐