乱侃C++

来源:互联网 发布:淘宝开店上传照片要求 编辑:程序博客网 时间:2024/05/22 13:24

更佳排版,戳这里

C++ 与 C 的区别

面向对象

面向对象:数据封装、类的继承、函数多态

函数重载

新的关键字

constinline
常变量 , 内联函数
消除宏的二义性,方便调试

#define add(a,b)   ((a)+(b)) //总而言之宏非常危险

函数区别

名称粉碎机制不同于C
所以在引入 C 函数时 要加上 extern “C”

常见的 C++ 函数

默认生成的函数

public:
构造函数、析构函数、拷贝构造函数(浅层)、赋值函数、一对取址运算符

structclass 关键字 基本一样,一个是内部默认 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) 不能通过复制操作来初始化

听说不怎么好用,建议不要使用,免得造成内存泄露

禁止对象产生于堆中

newdelete 声明为 private 权限

禁止对象产生于非堆中

将对象的析构函数至于 privateprotected 权限

0 0
原创粉丝点击