this概念:
- C++中通过引入this指针解决该问题,
- 即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this特性:
- this指针的类型:类类型* const
- 只能在“成员函数”的内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参。所以对象中不存储this指针。
- this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户 传递
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
void Show()
{
cout<<"Show()"<<endl;
}
private:
int _a;
};
int main()
{
Date* p = NULL;
p->PrintA();
p->Show();
}
问题1:this指针存在哪里?
问题2:this指针可以为空吗?
#if 0
class A
{
public:
/*
//this改写:
void TestFunc(A* const this)
{
this->_t = 10;
cout << this << endl;
}
*/
void Test()
{
cout << "A::Test()" << endl;
}
void TestFunc()
{
Test();
cout << this << endl;
}
int _t;
};
int main()
{
A a1,a2,a3;
//方式一:对象
a1.TestFunc(); // call A::TestFunc(&a1)
a2.TestFunc(); // call A::TestFunc(&a2)
a3.TestFunc(); // call A::TestFunc(&a3)
//A::TestFunc(); //报错,没有对象无法调用
// 成员函数必须要通过对象来进行调用,在该成员函数调用之前,
// 编译器需要将当前对象的地址通过ecx寄存器传递给成员函数
//
//方式二:指针
A* pa = &a1;
pa->TestFunc(); // call A::TestFunc(pa);
pa = &a2;
pa->TestFunc(); // call A::TestFunc(pa);
// 注意:pa是A*类型的指针,也就是说pa将来可以指向A类型的对象
// 如果pa指针没有合法指向时,一般都是将该指针置为nullptr
//空指针指向this时
pa = nullptr;
pa->TestFunc();
return 0;
}
#endif
方式一:
方式二:
结论:
this指针能否为空??
#if 0
class A
{
public:
/*
//this改写:
void TestFunc(A* const this)
{
this->_t = 10;
cout << this << endl;
}
*/
void TestFunc()
{
//this->_t = 10;//访问了成员变量,报错。
cout << this << endl;
}
int _t;
};
int main()
{
A* pa = &a1;
pa->TestFunc(); // call A::TestFunc(pa);
pa = &a2;
pa->TestFunc(); // call A::TestFunc(pa);
// 注意:pa是A*类型的指针,也就是说pa将来可以指向A类型的对象
// 如果pa指针没有合法指向时,一般都是将该指针置为nullptr
pa = nullptr;
pa->TestFunc();
return 0;
}
#endif
#if 0
class A
{
public:
/*
//this改写:
void TestFunc(A* const this)
{
this->_t = 10;
cout << this << endl;
}
*/
void Test()
{
cout << "A::Test()" << endl;
}
void TestFunc()
{
Test();//没有报错,因为器Test()中也没有成员变量。
cout << this << endl;
}
int _t;
};
int main()
{
A a1,a2,a3;
A* pa = &a1;
pa->TestFunc(); // call A::TestFunc(pa);
pa = &a2;
pa->TestFunc(); // call A::TestFunc(pa);
// 注意:pa是A*类型的指针,也就是说pa将来可以指向A类型的对象
// 如果pa指针没有合法指向时,一般都是将该指针置为nullptr
pa = nullptr;
pa->TestFunc();
return 0;
}
#endif
结论:
往期链接:
cpp_7.1 类和对象上(三) — this
cpp_7类与对象上(二) — 类对象的存储方式
cpp_6.1类与对象上(一)— 类的引入
cpp_6 nullptr
cpp_5.2 auto关键字
cpp_5.1 内联函数
cpp_5 const修饰的变量和宏
cpp_4 引用
cpp_3 函数重载/传址调用/引用
cpp_2 输入输出/函数/重载
cpp_1 命名空间/输入输出