赞
踩
- class Date
- {
- public:
- void Init(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- void Print()
- {
- cout <<_year<< "-" <<_month << "-"<< _day <<endl;
- }
- private:
- int _year; // 年
- int _month; // 月
- int _day; // 日
- };
- int main()
- {
- Date d1, d2;
- d1.Init(2022,1,11);
- d2.Init(2022, 1, 12);
- d1.Print();
- d2.Print();
- return 0;
- }
对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
根据之前的博文,我们得知了类中的成员函数是处在一个公共的区域,类中的成员变量仅仅只是声明,只有在主函数内部定义了 以类为类型的变量,才算是开辟了成员变量的空间。
同时,在成员函数内部的成员变量,也同类中的成员变量一样,仅仅只是一个声明。
并且因为需要知道调用的函数的对象是谁,C++引入了一个隐藏的指针 this
即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成。
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<<endl;
- }
- private:
- int _a;
- };
- int main()
- {
- A* p = nullptr;
- p->Print();
- return 0;
- }
- 解答:
- 在这里,
p
是一个指向A
类型的指针,但是它被初始化为nullptr
,也就是空指针。- 恰巧,_a就在p开辟的空间内部,但是p被赋予了空指针,所以寻访_a是错误的!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。