C++ 面向对象笔记

来源:互联网 发布:linux查看当前shell 编辑:程序博客网 时间:2024/06/03 06:26

构造函数

构造函数用来初始化类的对象,与父类的其它成员不同,它不能被子类继承,子类可以继承父类所有的成员变量和变量方法,但不能继承父类的构造方法。

因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。

如果没有显示的构造函数,系统会给一个默认的构造函数。并且该默认的构造函数仅仅在没有显示的生命构造函数创建。

如果子类调用父类带参数的构造函数,需要初始化父类成员对象。

void derived::derived():base(1);

析构函数

当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
如果不把析构函数声明为虚函数,那么实际上在对象生命周期结束时,调用的将知识调用基类base的析构函数,而派生类的derived的析构函数将是不可调用的。

继承

  • 公有继承
    共有继承和保护继承作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类访问。
  • 私有继承
    基类的共有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
  • 保护继承
    基类的所有共有成员和保护成员都称为派生类的保护成员,并且只能被它的派生类和成员函数或者友元访问,基类的私有成员仍然是私有的。

前置声明

c++经典头文件循环引用问题
定义一个类class A这个类里面使用了类B的对象b
定义一个类class B这个类里面使用了类A的对象a

解决办法:
在A的头文件中声明class B,而不include。

class B是一种不完整的声明,只要类B中没有执行需要了解类A的大小或者成员的操作,则这样的不完整申明允许声明指向A的指针和引用。

B b需要了解A的大小,不然是不肯能知道如何给A分配内存大小,因此不完整的前置声明就不行,必须要包含B.h来获得类A的大小。

友元

友元类

友元不是成员函数,但是它可以访问类中的私有成员。
友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员,不过,类的访问权限确实在某些应用场合显得有些代办,从而容忍了友元这一特别语法现象。

class d{    //dd可以访问d的私有变量    friend dd;}

友元函数

友元函数具有全局性,不慎使用会造成函数同名冲突
虽然命名空间能解决一定问题,但我还是偏向使用静态成员函数

class x{    //函数a为全局函数,可直接调用而静态函数a(),x::b();    friend void a();}

虚函数

纯虚函数

子类必须继承。
包含一个或多个纯虚函数的类为抽象基类,视图创建一个抽象基类的实例是错误的。

virtual void a() = 0;

虚函数

//基类class base{virtual void a();void b();...}//子类class derived{void a();void b();}derived d;base* pb = &d;derived* pd = &d;//当调用pd的函数a和b时,都调用子类的a的b;//当调用pb的函数a和b是,a调用子类的a,而b调用base的b

内联函数 外联函数

内联函数指定义在类结构体内的成员函数,即该函数的函数体放在类体内。
外联函数指申明在类体内,定义在类体外的成员函数。
外联函数转化为内联函数只要加inline

编译过程的最终产品是可执行程序 — 由一组机器语言组成

运行程序时,操作系统将这些指令载入到计算机内存中,因为每条指令都有特定的内存地址。

内联函数的编译代码与其他程序代码”内联”,也就是说,编译器将使用相应地函数代码替换函数调用。
对于内联代码,程序无需跳到另一个位置处执行代码再跳回来。

内联函数的运行速度比常规函数稍快,但要占用更多的内存。

如果执行函数代码的时间比处理函数调用机制的时间长,则节省的时间只占用整个过程的很小一部分。
如果执行时间很短,则内联调用就可以节省非内联调用使用的大部分时间。

内联函数体重,不能有循环语句,if语句或switch语句,否则,函数定义时及时有inline关键字,编译器也会把该函数作为非内联函数处理

单例vs静态类

单例:

通过控制一个全局变量,以便拥有某些独占性资源,并达到便于管理和访问,但其缺点也很致命,它在整个程序运行周期内几乎不会被释放。
同事,滥用单例会使代码偶尔性增加,不易于扩张。

静态类

静态类在编译时就已经初始化了,成本昂贵。
在静态类中静态方法产生的对象,当执行结束后被GC清除。而单例的的静态对象不会被GC清楚,单例支持多态,而静态类不支持。

0 0
原创粉丝点击