乱侃C++
来源:互联网 发布:淘宝开店上传照片要求 编辑:程序博客网 时间:2024/05/22 13:24
更佳排版,戳这里
C++ 与 C 的区别
面向对象
面向对象:数据封装、类的继承、函数多态
函数重载
新的关键字
const
, inline
常变量 , 内联函数
消除宏的二义性,方便调试
#define add(a,b) ((a)+(b)) //总而言之宏非常危险
函数区别
名称粉碎机制不同于C
所以在引入 C 函数时 要加上 extern “C”
常见的 C++ 函数
默认生成的函数
public:
构造函数、析构函数、拷贝构造函数(浅层)、赋值函数、一对取址运算符
struct
与 class
关键字 基本一样,一个是内部默认 public,一个是默认 private
成员初始化
非内建类型的初始化 最好在初始化列表进行初始化,可以提高效率 const
常量必须在 初始化列表进行初始化
初始化列表中类的成员变量的初始化顺序以成员的声明顺序为准
static
成员变量 在类外部初始化
类的析构
当需要使用到多态特征时,一般来说,基类的析构函数需要声明为 虚析构函数,防止基类不会被释放的问题发生。
模板与模板类
定义形式
template <参数化类型名表> <返回类型> <函数名> (<参数表>)
函数模板:
template <typename T > void Sort(T *tNum, int nCount) { for (int i = 0; i < nCount; i++) { for (int j = i + 1; j < nCount; j++) { if (tNum[i] > tNum[j]) { T tTemp = tNum[i]; tNum[i] = tNum[j]; tNum[j] = tTemp; } } } }
模板类:
template <模板参数表> class <类名> { //类体说明 }; //实例化对象 类名<参数类型> 对象;
其实 实际使用中可以参考 STL模板的设计 :)
菱形继承和多重继承
不推荐使用,很容易造成混乱
多态
父类指针指向子类对象,调用虚函数时会自动调用正确的子类的虚函数。
虚函数与纯虚函数
virtual
关键用来声明一个虚函数
当使用了 virtual
时,编译器会自动采用动态联编。
C++ 在编译时会在含有虚函数的类中加上一个指向虚表的指针,每一个实例化的对象都会拷贝一份指向虚表的指针到其内部
#include <stdlib.h>class CTest{public: int test() { m_nNum = 1; return 0; }private: int m_nNum;};int _tmain(int argc, _TCHAR* argv[]){ CTest obj; printf("%d", sizeof(obj)); system("pause"); return 0;}
4
当在 int test()
前加上 virtual
关键字后
8
VS编译器:
我们在反汇编窗口看到虚表的存在
虚表实际上相当于一个函数指针数组,但是实际上并不是函数指针
而是指向一个 新的表的某个元素,VS编译器会将类里面的虚函数搜集整理到一张全局的函数跳转表里面
在有虚函数的类被继承时,子类会复制一份父类的虚表,并将其中的重写过的虚函数地址替换为自己的地址
重载与重写
重载: 函数参数必须改变,函数返回,但是不能依据返回类型来区分重载的不同函数
重写:发生在类的继承关系中。 重写函数与被重写函数的 声明必须完全一样,虚函数重写时子类可以 不用加上 virtual
。
不能缩小原访问权限,只能扩大。
基类的静态方法只能重写为静态方法,非静态方法一样,
派生类的重写函数不能比基类的函数抛出更多异常。
尽量不要重写非虚函数,因为在使用的时候会很奇怪,尤其是夹杂上多态的思想后。
还有就是如果有虚函数记得一定要顺便把基类的析构函数变成虚析构函数
STL模板
通用容器:
- 序列容器: vector,list,deque
- 关联容器: set,map
- 适配器:stack,queue,priority
- 迭代器:iterator, const_iterator(只读迭代器)
常用算法:
- sort() —排序
- reverse() —翻转
- find() —查找
- copy() —拷贝
其他
写时拷贝的实现
智能指针 auto_ptr
(1) 不能共享所有权
(2) 不能指向数组
(3) 不能作为容器的成员
(4) 不能通过复制操作来初始化
听说不怎么好用,建议不要使用,免得造成内存泄露
禁止对象产生于堆中
将 new
和 delete
声明为 private
权限
禁止对象产生于非堆中
将对象的析构函数至于 private
或 protected
权限
- 乱侃
- 乱侃~~~
- 乱侃委托
- 开张乱侃
- 乱侃C++
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 乱
- 08-04 工厂设计模式 反射 线程 注解
- 【JLOI2014】【BZOJ3629】聪明的燕姿
- Vector Quantization(学习Free Mind知识整理)
- 验证角谷猜想
- 各种坐标系详解
- 乱侃C++
- VBScript,checkbox,选择问题
- 08-05 Server、Client可连续发送 生产者、消费者 死锁解决 Server、Client窗口实现
- Extjs表单验证的编写方法及vtypes集合
- hdu 1069 Monkey and Banana(动态规划)
- 搜索结果的高亮显示实现
- 08-10 数据库操作
- struts2.3.15之环境搭建
- python菜鸟日记9