this指针
struct和class每个成员函数都隐含一个名为this的指针形参,并且它是该成员函数的第一个参数,当某个对象调用成员函数时,就会把该对象的地址传给被调用成员函数的隐式形参this。
#include <iostream>
using namespace std;
class Student
{
public:
void Show()//成员函数
{
cout<<name<<"-"<<grade<<endl;
}
public://成员变量
char* name;
int grade;
};
int main()
{
Student S1;
S1.name = "S1";
S1.grade= 95;
S1.Show();
system("pause");
return 0;
}
编译器调用实际就是类似上图,但不能显示的写 p.Show(&S1);和void Show(Typy* this){},编译器内部会自己这样处理,this->name是允许这样写的。
隐式指针形参this的作用就是明确是S1这个对象在调用Show函数,在 Show内操作的成员变量都是S1对象的(显示出S1对象的name和grade)
const成员函数
const成员函数:不可通过该函数改变成员变量的值(mutable修饰的成员变量除外)。
在每个成员函数都隐含一个名为this的指针形参,而在const成员函数中,隐式的this是一个常量指针,就是一个被限定了权限的指针,不可通过该指针来改变所指向对象的内容。
#include <iostream>
using namespace std;
#include <string>
class Student
{
private:
string name;
public:
int grade;
public:
Student(string name,int grade):name(name),grade(grade){
//&::name = name;
}
void Show()//普通成员函数
{
//name = "NickName"; 允许
cout << "normal-" << name << endl;
}
void Show() const//const成员函数
{
//name = "NickName"; //const成员函数不允许改变成员变量
cout << "const-" << name << endl;
}
};
int main()
{
Student S1("S1",98);
S1.Show();
const Student S2("S2",97);
S2.Show();
cout << S2.grade;
system("pause");
return 0;
}
/*
输出:
normal-S1
const-S2
97
*
const对象只能调用const成员函数,不能调用非const成员函数。(成员变量都可以调用,但不能改变值)
非const对象,const成员函数和非const成员函数都可以调用,但会优先调用非const成员函数,如果没有非const成员函数,才会调用const成员函数。