C++讲解

11-17 5,719

1, c语言中,结构体struct中不能包括函数的,而在C++中struct中可以包括函数。
2,C++中结构体和类可以通用,区别主要表现在访问控制方面:struct中默认是public,而 class中默认的是private。
3,构造函数最重要的作用是创建对象的本身,C++中每个类可以拥有多个构造函数,但必须至少有一个构造函数,当一个类中没有显式提供任何构造函数,C++编辑器自动提供一个默认的不带参数的构造函数,这个默认的构造函数只负责构造对象,不做任何初始化工作。但在一个类中只要自己定义一个构造函数,不管带参不带参,编辑器不再提供默认的不带参的构造函数了。构造函数没有返回值。
4,析构函数当一个对象生命周期结束时候被调用来回收对象占用的内存空间。一个类只需有一个析构函数。析构函数没有返回值也不的带参数。
5,析构函数的作用与构造函数相反,对象超出起作用范围对应的内存空间被系统收回,或被程序用delete删除的时候,对象的析构函数被调用。
6,函数的重载条件:函数的参数类型、个数不同,才能构成函数的重载。重载是发生在同一个类中。
7,类是抽象的,不占用具体物理内存,只有对象是实例化的,是占用具体物理内存的。
8,this指针是隐含指针,指向对象本身(this指针不是指向类的),代表了对象的地址。所有的对象调用的成员函数都是同一代码段,但每个对象都有自己的数据成员。当对象通过调用它的成员函数来访问它的数据成员的时候,成员函数除了接收实参外,还接收了对象的地址,这个地址被一个隐藏的形参this所获取,通过这个this指针可以访问对象的数据成员和成员函数。
9,对象中public属性的成员在外部和子类中都可以被访问;protected属性的成员在外部不能被访问,在子类中是可以访问的;private属性在子类中和外部都不能被访问。
10,类的继承访问特性:(public,protected,private)
    a)基类中private属性成员,子类无论采用那种继承方式都不能访问。
    b)采用public继承,基类中的public,protected属性的成员访问特性在子类中仍然保持一致。
    c)采用protected继承,基类中的public,protected属性成员访问特性在子类中变为protected.
    d)采用provate继承,基类中的public,protected属性成员访问特性在子类中变为provate.
11,子类和基类的构造函数或析构函数调用顺序:
当调用子类的构造函数时候先调用基类的构造函数(如果没有指明,则调用基类却省那个不带参数的构造函数;如果要指明则在子类构造函数名后加”:基类名(参数)”)。析构函数则相反,先调用子类析构函数,后调用基类的析构函数。
12,函数的覆盖:
函数的覆盖是发生在发生父类和子类之间的。(函数的重载是发生在同一个类中)
当子类中重写了父类的某些成员函数后,子类中的成员函数覆盖了父类的对应同名成员函数。
13,用父类指针访问子类对象成员时候,只能访问子类从父类继承来的那部分。(这时候外部不可以访问父类中保护和私有的部分,子类中不可访问父类私有部分。)
14,多态性:在基类的的成员函数前加virturl变成虚函数,当用子类对象调用该功能的成员函数时候,子类有的就调用子类的,子类没有的就调用基类的。
当C++编译器在编译的时候,发现被调用的成员函数在基类中定义的是虚函数,这个时候C++就会采用迟绑定技术(late binding),在运行的时候,依据对象的类型来确定调用的哪个函数,子类有调用子类的,子类没有的就调用基类的。
如果基类中的成员函数不是虚函数,则这时候的绑定是早期绑定,在编译的时候就已经确定该调用哪个函数。
15,纯虚函数:在类中定义时 eg: virtual void f1()=0;
纯虚函数没有函数体,含有纯虚函数的类叫做抽象类,抽象类不能实例化对象。当子类从抽象类的基类中派生出来时候,如果没有实现基类中的纯虚函数,则子类也是个抽象类,也不能实例化对象。
纯虚函数被标名为不具体实现的虚成员函数,纯虚函数可以让类只具有操作的名称而不具有具体的操作的内容,让派生类在继承的时候再给出具体的定义。如果派生类没有给出基类的纯虚函数的具体定义的时候,派生类也为一个抽象类,也不能实例化对象。
16,引用:变量的别名。引用需要在定义的时候用一变量或对象初始化自己。引用一旦在定义的时候初始化,就维系在一个特定的变量或对象上。
引用不占用物理内存(与定义引用的目标共用同一内存)。指针变量需要占用物理内存,用来存储地址。
17, 如何防止类的重复定义?
用#inndef Point_H_H
#define Point_H_H
……//头文件
#endif
18.引用。const型的引用。
int a;
const int &b = a;
b = 1;//error     l-value specifies const object
a = 1;//ok
19.关于函数重载(overload)覆盖(override),,隐藏(hide).
重载发生在一个类中。覆盖和隐藏都是关于子类和父类的。
根据《高质量C,C++编程指南》中,对于虚函数,应该是迟绑定(lata binding),所以出现 :
sun sn;
father *fa = &sn;//用fa调用的时候,调用子类的虚函数。
                 //如果子类和父类有相同的函数(返回值,函数名,参数),并且没有声明为虚函数,那么调用父 类相应的函数,而不是子类的,这成为隐藏
                 //如果子类和父类有相同名称的函数,但参数不同,不管是否是虚函数,都调用父类的相应的函数,而不是子类的,这成为隐藏
20.子类的析构函数应该是虚函数。如:
A *a = new B;
delete a;//先调用子类的析构函数,然后是父类的析构函数。如果析构函数不是虚函数,那么只会调用父类的构造函数

暂无相关产品

5则回应给“C++讲解”

  1. khb_gl说道:

    你的blog质量很不错。继续加油。
    上面那些总结得很好,继续加油!

    [回复]

    Dante 回复:

    呵呵,谢谢~~~

    [回复]

  2. ReeZhou说道:

    c的struct中可以有函数指针

    [回复]

  3. Fangzhen说道:

    第12条 覆盖
    应该是派生类与基类在虚函数上才是覆盖,如果派生类和基类的函数签名完全相同,但不是虚函数(基类没有virtual修饰)的话,派生类的函数就覆盖基类的函数

    [回复]

  4. Fangzhen说道:

    上面最后写错,应该是派生类函数隐藏基类函数

    [回复]

发表评论