读书笔记2

类别:编程语言 点击:0 评论:0 推荐:

关于this指针
虽然this指针大家已经很熟悉了,但是我这里讨论的关于this指针的问题可能大家还没注意过:
为了说明这个关于this的归属问题,我自写了一段再简单不过的程序,虽简单但具体:
#include <iostream.h>
class A
{
public:
 A *p1;
 int m_data1;
 int m_data2;
 A(){m_data1=1;m_data2=this->m_data1;p1=this;}
 void aa(){cout<<"A_aa"<<endl;}
 virtual void aaa(){cout<<"A_aaa"<<endl;}
};
class B:public A
{
public:
 int m_data1;
 int m_data3;
 B(){}
 void print(){cout<<m_data2<<endl<<m_data1<<endl;}
 virtual void aaa(){cout<<"B_aaa"<<endl;}
};
void main()
{
 B b;
 b.print();
 b.p1->aa();
 b.p1->aaa();  
        b.p1->m_data3=0;//编译错###
}
我的问题是指针p1是指向b自身吗?
一看程序,大家就知道:不是,p1指针是指向b的一个隐含父类A的。
对,答案对了(如果你对这一点也怀疑,那你只有自己到vc上试试了。),
在此,我也可以直接给一个证据,那就是上面的编译错,因为A中不存在m_data3。
你的答案其实说明我想要得的一个结论1,那就是this(程序中的)指针是指向A的。
但是,我想问既然p1是指向b的父类的,那么b.p1->aaa()应该调用的是那个函数呢?
答案是B中的那个,如果不是虚函数呢,结果就是A中的那个了(这从结论1中可知),
原来是虚函数捣的鬼,但是这是为什么呢?
虽然从一般意义上好像是这样,但是,P1指针自始至终都是指向A的吧?不是父类的指针指向子类的情况吧?
因为没有出现p1=&b的语句吧。:)

关于多态与虚函数
总结如下:
1)指针:父类的指针可以指向子类对象,但只能调用自身的成员函数和成员变量,除虚函数
外;子类的指针只能指向由父类显示类型转换为子类的对象,调用的是子类自身的
函数和变量,除虚函数外。
2)无指针(对象之间的类型转换):父类对象可以转化为子类对象,仍只能调有
自身的函数和变量,不能调用子类的函数和成员,与虚函数无关;子类对象不能显示
的转换为父类对象,除非人为编写相关代码。

即:虚函数必须与指针一起使用;除开虚函数之外,继承类之间的类型转换没有
什么直接作用。

对象生存方式

四种:stack、 heap、 global、 local static
产生方法:
第一种:在函数中,main()之内
第二种:new方法
第三种:在任何函数范围之外,由startup代码对其初始化。
第四种:在函数范围之内的静态对象

 

本文地址:http://com.8s8s.com/it/it26055.htm