一、this指针
1.1 成员函数的存储方式
用类实例化定义一个对象的时候,就好比是用int定义一个变量一样,系统会为该对象分配存储的内存空间。
C++语言中每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,而不包括函数代码所占用的存储空间。因为针对某个类的多个对象而言,不同的只是数据成员,而函数成员来说都是一样的代码,所以没有必要为每个对象都保存一份成员函数的代码。这样可以很大程度上节省空间。
在面向对象程序设计中,每个非静态成员函数中都包含一个特殊的指针,指向调用该函数的对象,这个指针称为this指针。
当对象访问类中的非静态成员函数时,编译器会自动将对象的地址隐式地作为第一个参数传递给this指针,在非静态成员函数访问中访问非静态成员时都隐含地使用了this指针。
this指针的作用域是在非静态成员函数内部,在调用非静态成员函数时构造this指针,在非静态成员函数调用结束后销毁this指针。
注意:this指针只适用于非静态成员
通过this指针访问的数据成员和方法成员都必须是类的非静态成员。类的静态成员属于整个类,不属于某一个对象,没有对象也就谈不上this指针,因此this指针只能在类的非静态成员函数中出现,而不能在类的静态成员函数中使用。
- this 指针特性
-
1 this指针是类 类型的指针 ,它不可修改;
2 只能在成员函数的内部使用;
3本质是成员函数的形参,形参不存储,所以不会影响成员函数的大小sizeof()
4 this 指针是成员函数隐藏的第一个指针形参
小案例
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name;
int num;
int age;
private:
char sex;
public:
char set_sex(char SEX)
{
char sex = SEX;
return sex;
}
public:
void print_name()
{
cout << "name = " << name << endl;
};
};
int main()
{
Student zhang_san, li_si;
zhang_san.name = "zhang_san";
li_si.name = "li_si";
zhang_san.print_name();
li_si.print_name();
return 0;
}
=================运行输出=================
name = zhang_san
name = li_si
明显,打印出的结果肯定不同,张三就打印出张三的名字,李四就打印出李四的名字。print_name 是通过 this 指针来区分对象是张三还是李四。
1.2 手动加上this
当参数名字和成员变量的名字一样,需要添加this指针。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
string name;
int num;
int age;
char sex;
public:
void set_sex(char sex)
{
this->sex = sex;
}
};
int main()
{
Student zhang_san, li_si;
zhang_san.name = "zhang_san";
li_si.name = "li_si";
zhang_san.set_sex('F');
li_si.set_sex('M');
cout << "zhang_san.set_sex('F')=>" << zhang_san.sex << endl;
cout << "li_si.set_sex('M')=>" << li_si.sex << endl;
return 0;
}
===========运行输出==============
zhang_san.set_sex('F')=>F
li_si.set_sex('M')=>M