实习整理(六)

来源:互联网 发布:色环电阻识别软件 编辑:程序博客网 时间:2024/05/01 17:04

csdn的编辑器再次让我无语,已无力吐槽。。。

36.C++中无论类是通过子类还是自身进行声明,都是先调用自身的构造函数,再调用子类的构造函数,释放时如果自身的析构函数不为虚函数,则只调用自身的析构函数,否则先调用子类的析构函数再调用类本身的析构函数
,其余的成员函数就看它是用自身进行声明还是利用子类进行声明,不过若显示指定了调用哪个类的成员函数那就调用相应类的成员函数,形式为 类::函数名()
就如下面:

感觉C++中构造函数和析构函数是比较难以理解的,因此将其总结下:
1.类只要有基类先调用基类的构造函数,(成员对象的构造函数),再调用自身的构造函数,析构函数的顺序与构造函数的顺序就相反;

2.调用构造函数的顺序为:初始化--->执行函数体,初始化的顺序应该和变量声明的顺序保持一样,和它在初始化列表中的顺序无关;此外,如果对象声明为全局对象,则该对象的成员变量在初始化的时候,内置的类型(int,数组)初始化为0,其余的类类型则调用该类的构造函数;如果对象声明为局部对象,则该对象的成员变量在初始化的时候,内置的类型(int,数组)为垃圾值,其余的类类型则调用该类的构造函数;

3.构造函数为如下形式时就是复制构造函数:
        类名(const 类 & 变量名)  {...}
如果某个对象是通过如下形式进行声明的,则应调用复制构造函数
       类的对象=类(该类的其他对象)  或者 函数(该类的对象)  或者 该类的对象=函数返回的值
如果类中并未声明复制构造函数,则调用默认的复制构造函数,即函数体为空,复制构造函数对应的析构函数和构造函数对应的析构函数一致;
可以借助这个博客中的第22题加深理解:
http://blog.csdn.net/hackbuteer1/article/details/6902917

4.析构函数的执行顺序与构造函数(包括复制构造函数)的执行顺序完全相反,只要记得构造函数的顺序即可;

5.类中声明的成员变量不能在声明之后直接就初始化


37.C++中实现多态的方式有两种:
静态多态性:函数重载,运算符重载
动态多态性:虚函数
静态联编:通过对象来访问成员函数,如    A::fun()
动态联编:成员函数加上virtual关键词声明为虚函数后,通过指针或者引用来访问
class A
{
    virtual fun1(){cout<<"virtual AA"<<endl;}
    fun2(){cout<<" AB"<<endl;}
}
class B:public A
{
    fun1(){cout<<"virtual BB"<<endl;}//fun1()也为虚函数
    fun2(){cout<<"BB"<<endl;}
}
int main()
{
    B *b=new B();
    A aa;
    B bb;
    aa=bb;
    A *a=&b;
    aa->fun1();//结果为virtual AA
    a->fun1(); //结果为:virtual BB
    a->fun2();//结果为:AB
    b->fun1();//结果为:virtual BB
    b->fun2();//结果为: BB
    a->A::fun1();//结果为:virtual AA
    b.fun2();//结果为: BB
}
通过父类指针来声明子类对象时,若父类某成员函数为虚函数时,则调用的子类的该成员函数;否则调用的是父类的该成员函数(引用和指针类似)

38.子类和父类直接可以进行显示转换,但不能进行隐式转换,即 A:父类 B:子类
A * a=new B();正确     B *b=new A();错误

39.函数除了可以返回值之外,还可以返回指针,但是返回的指针可能会是垃圾指针,因此要分清楚
1):若返回的是指向栈的指针,则该指针为垃圾指针;
2):若返回的是指向堆或者全局存储区或者文字常量区,则该指针仍有效;
在涉及到指针时,要注意两点:1.它是什么类型的指针,这个决定了它进行加减操作时移动的字节数;2.它指向的对象或者说该对象所在的内存,比如若指向的对象在文字常量区,就不能使用该指针来改变对象的内容;

40.类中成员可以声明为static或者const等,可以通过下面的例子进行区分理解:
class cd {
public:
static int a;//只能进行声明,不能定义,定义要放在类外,所谓不能定义应该就是:static int a=2;
const int b://定义要放在构造函数的初始化列表中,此外类中的数据成员如果是引用类型的话也必须放到初始化列表中初始化;
const static int c;//有两种情况,一可以在构造函数中初始化,但也要在类外进行定义,只是不需要再次进行初始化,初始化的时候不需要再加static关键词;二可以直接就在类外进行初始化,初始化的时候不需要再加static关
键词
const static int d;
int &e;
cd():b(2),c(3),e(4){...}
}
int cd::a=1;
const cd::c;
const cd::d=4;

41.函数可以有默认参数的设置,不过默认参数的设置遵从的顺序为从右至左,不过调用该函数的时候赋值的顺序为从左至右,如:
int max(int a=1,int b=2,int c=3);//这样是正确的
int max(int a=1,int b,int c=3);//这样是错误的,因为b没有默认值
max(13,4,5);//a=13,b=4,c=5
max(11,3);//a=11,b=3

42.指针一定要初始化或者赋值为0,才可以进行使用,否则会导致编译错误
typedef是编译时处理,有类型安全检查;define是预编译时处理,没有类型安全检查;

未完待续。。。



0 0