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清楚,单例支持多态,而静态类不支持。
- 《面向对象程序设计-C++》学习笔记1
- 《面向对象程序设计-C++》学习笔记2
- C++primer阅读笔记---------------面向对象程序设计
- Object-C学习笔记二-----面向对象编程基础知识
- C/C++笔记 --C++ 面向对象
- Objective-C学习笔记第三章面向对象编程
- C/C++学习笔记(五)面向对象的编程
- C/C++面向对象编程中的学习笔记
- Effective c++(笔记)之继承关系与面向对象设计
- Objective-C学习笔记第三章面向对象编程
- C++primer——阅读笔记(非面向对象)
- Objective-C学习笔记二:面向对象概述
- iOS笔记之Objective - c 面向对象概念的解释
- C++primer第五版笔记-第十五章面向对象程序设计
- 面向对象分析与设计(C++)课堂笔记
- 译:应用笔记 在C中的简单面向对象编程
- C语言之面向对象编程学习笔记
- C++primer学习笔记----面向对象程序设计(1)
- Eclipse导入项目Maven error “Failure to transfer…”
- 数据结构常考知识点
- IPC机制--使用Bundle进行通信
- 艾宾浩斯记忆遗忘曲线-背单词
- js自定义函数传值问题
- C++ 面向对象笔记
- 集合2
- 3n+1数列问题
- hadoop安装教程(转载,超详细)
- Java复习——类
- SpringMVC下压缩文件下载
- scala学习笔记
- Hibernate深入理解----03操作Session缓存方法(flush、refresh、clear,事务隔离级别)
- Qt内存泄露问题