首页 > 其他分享 >this指针

this指针

时间:2023-04-28 11:44:43浏览次数:26  
标签:void month year Print day 指针

1. this指针的概念与特性

this指针概念

首先来看一个例子

#include <iostream>
using namespace std;

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;     // 年   
	int _month;    // 月
	int _day;      // 日
};
int main()
{
	Date d1, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2023, 4, 28);
	d1.Print();
	d2.Print();
}

d1和d2调用的是相同的成员函数, 因为成员函数Print是存储在公用代码段而不是对象中

那么, 为什么它们最后打印的结果不同 ?

实际上d1和d2在调用成员函数Print时, 向Print函数隐含传递了对象的地址, Print成员函数会有一个名为this指针的形参来接收, 最后通过this指针打印

下面具体看一下编译器做了什么

#include <iostream>
using namespace std;

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print() // 3. void Print(Date* this) 
	{
		cout << _year << "-" << _month << "-" << _day << endl;
		// 4. cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
	}
private:
	int _year;     // 年   
	int _month;    // 月
	int _day;      // 日
};
int main()
{
	Date d1, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2023, 4, 28);
	d1.Print();
	// 1. d1.Print(&d1); 传递对象d1的地址
	d2.Print();
	// 2. d2.print(&d2); 传递对象d2的地址
}

1. 对象d1,d2在调用成员函数时都会隐式的传递各自对象的地址

2. Print成员函数根据类创建this指针 

3. 使用this指针调用其对象中的成员变量

所以因为this指针的存在, 最后打印出的结果不同, 这些东西都是编译器自动生成的, 是为了方便使用

this指针的特性

this指针不能在形参和实参显示传递

但是可以在函数内部显示使用

2. this指针的练习

// 1.下面程序编译运行结果是?  A、编译报错  B、运行崩溃  C、正常运行
class A
{
public:
    void Print() //  void Print(A* this)
    {
        cout << "Print()" << endl;
    }
private:
    int _a;
};
 
int main()
{
    A* p = nullptr;
    p->Print(); // Print(p)
    return 0;
}

首先, 因为Print成员变量是存储在公用代码段中, 所以Print可以正常调用

然后, 对象调用成员函数都会隐式的传递其对象的地址, p->Print()  -------》  Print(p), 也就是传递一个空指针

最后,因为只有访问(解引用)空指针才会报错, 这里只是打印没有解引用空指针, 所以正常运行

// 2.下面程序编译运行结果是?  A、编译报错  B、运行崩溃  C、正常运行
class A
{ 
public:
    void PrintA() // void PrintA(A* this)
    {
        cout<<_a<<endl; //  cout<< this->_a <<endl; 解引用空指针, 所以运行崩溃
    }
private:
    int _a;
};
 
int main()
{
    A* p = nullptr;
    p->PrintA(); // 调用PrintA(p)
    return 0;
}

这道题与之前类似, 但是因为访问了空指针this, 所以运行崩溃 

注意: 编译报错是语法错误,这里不是

标签:void,month,year,Print,day,指针
From: https://www.cnblogs.com/xumu11291/p/17361573.html

相关文章

  • c语言中,字符数组名 与 指向字符串常量的指针之间的关系
    chara[]="hello";//定义一个字符数组a,constchar*b="hello";//定义一个指向字符的指针b,指向字符串常量的第一个字符的首地址区别:a是一个指针常量,它本身的值不能修改,即char*consta;b是一个常量指针,它所指向的值不能修改,constchar*b;......
  • 【CPP】自定义排序--针对智能指针
    目录代码块代码块#include<iostream>#include<memory>#include<vector>#include<algorithm>usingnamespacestd;classBase{public:virtualvoidPrint(){std::cout<<"IamBase!\n";}};classDerived1:publi......
  • golang1.6版本json包解析嵌套指针的问题小记
    指针的指针问题本地跑的好好的,测试环境跑的好好,预发布环境(准线上环境),跪了。起因就是:1a:=&struct{s:""}2json.Unmarshal([]byte{},&a)3fmt.Println(a.s)//报错行第一行代码进行&取地址,获得指针变量。第二行代码,进行json解析的时候,传入了&a, 指针的指针,a到了jso......
  • [leetcode]复制带随机指针的链表
    力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷......
  • const关键字_常量指针与指针常量
    变量被const修饰,能且仅能被赋值一次。指针被const修饰,只在初始化时指向一个对象,且不能更改指向常量:不能被二次赋值constinta;intconsta;常量指针和指针常量constint*p;//*p不能被二次赋值int*constp;//p不能被二次指向constint*constp;//*p不能第二次赋值,指针p不......
  • C语言--指针
    【指针的类型】short* int* long* char* double* …指针的类型决定了指针向前或向后一步的步长(距离),其步长对应类型的大小。【指针的解引用】指针类型决定了对指针解引用的时候有多大的权限(能操作几个字节)。比如char的指针解引用就只能访问1个字节,而int的指针解引用就能访......
  • C语言指针的感悟
    写这篇文章要感谢(微信公众号 C语言与CPP编程里C++指针详解)此处我写的就是看过那篇文章后的一点启发(例如:如何取出一个4个字节int类型数的第三个字节存储的内容之类的问题)#include<iostream>usingnamespacestd;intmain(){intm=65536;char*p=(char......
  • 《C# in depth》第5章C#5.0中的更改(十二)——指针和非安全编码
    指针类型是一种C#5.0中引入的不安全代码特性,它允许程序员直接访问内存地址,以及使用指向变量和对象的指针。指针类型可以帮助程序员处理一些高性能场景,例如在大型数组中查找数据。指针类型需要使用unsafe关键字定义,表示这段代码中存在潜在的危险操作。在unsafe代码块中,可以......
  • 12 | C语言中的函数类型和函数指针类型
    函数类型和函数指针类型的区别,让我们先看一个例子#include<iostream>usingnamespacestd;typedefint(Func)(int);typedefint(*Func_p)(int);intf(inta){returna;}intmain(){Func_pp=f;Func*p_ptr=f;cout<<p(0)<<endl;cout<<p_ptr(1)......
  • C语言 指针也是数组
    #include<stdio.h>main(){char*p="abcdef";printf("%c",*p);printf("\n%c",*(p+1));printf("\n%c",p[0]);printf("\n%c",p[1]);getchar(); }    ......