this的特性:
- this指针的类型:
类类型* const
,即可以改变指针指向对象里面的内容,但不能改变指针的指向 - 只能在“成员函数”的内部使用
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针,当调用成员函数的时候,this指针会存在于栈帧中
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递(看不见,但是有这个形参,用户可以使用)
在成员函数中隐含的this指针就如下图,使用对象内部的成员变量或成员函数会默认用this指向,表明该成员变量或成员函数属于该对象的内部成员
面试题:
- this指针存在哪里?
没有调用成员函数的时候this指针是不存在的,当调用成员函数的时候,建立成员函数的栈帧,类对象的地址作为实参传递给this形参,该形参就在栈帧中,一般通过ecx寄存器自动传递 - this指针可以为空吗?
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
void Print()
{
cout << "Print()" << endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->Print();
return 0;
}
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
return 0;
}
所以空指针也是可以作为实参传递给形参this的,运行的结果具体看里面函数的实现
比较C语言和C++实现Stack的不同
C语言下的Stack
typedef int DataType;
typedef struct Stack
{
DataType* array;
int capacity;
int size;
}Stack;
void StackInit(Stack* ps)
{
assert(ps);
ps->array = (DataType*)malloc(sizeof(DataType) * 3);
if (NULL == ps->array)
{
assert