C++:this指针(二)

this指针:

class Date
{ 
public:
 void Init(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 void Print()
 {
 cout <<_year<< "-" <<_month << "-"<< _day <

对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

根据之前的博文,我们得知了类中的成员函数是处在一个公共的区域,类中的成员变量仅仅只是声明,只有在主函数内部定义了 以类为类型的变量,才算是开辟了成员变量的空间。 

同时,在成员函数内部的成员变量,也同类中的成员变量一样,仅仅只是一个声明。

并且因为需要知道调用的函数的对象是谁,C++引入了一个隐藏的指针 this

即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成。C++:this指针(二)_第1张图片

this的特性:

1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。

注意 const 在*之前是说明指针指向的内容不可以改变 在*之后表示指针不可以被改变

2. 只能在“成员函数”的内部使用 

 3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针

4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递

 5.this 指针一般存储在栈内,但是有些编译器会将其存储在寄存器中,例如VS

相关面试题型:

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

解答: 
考点在 p->printA()

因为成员函数不在 定义的对象 所开辟的空间内部 ,所以这个p->printA()解引用是无效的

解引用是指去 p 指向的空间去寻找,但是printA不在p指向的空间内部。
换句话说,printA不在p开辟的空间内部
所以因为找不到,也就是说编译器觉得这个是没有用的,所以空指针的效果是无效的,因为空指针无效,语法也没有问题,空指针不会被解引用,所以可以正常运行!

// 2.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
 
public:
 void Print()
 {
   cout<<_a<Print();
 return 0;
}
  • 解答:
  •  在这里,p是一个指向A类型的指针,但是它被初始化为nullptr,也就是空指针。
  • 恰巧,_a就在p开辟的空间内部,但是p被赋予了空指针,所以寻访_a是错误的!

  

你可能感兴趣的:(C++,c++,开发语言)