Chinaunix首页 | 论坛 | 博客
  • 博客访问: 279133
  • 博文数量: 111
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 816
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 20:35
文章分类

全部博文(111)

文章存档

2016年(1)

2015年(5)

2014年(105)

我的朋友

分类: C/C++

2014-06-20 07:59:26

—— 还能冲动,表示你还对生活有激情,总是冲动,表示你还不懂生活

一、运算符重载

1. 重载也遵守运算符优先级
2. 一元运算符和二元运算符:aa@bb = aa.operator@(bb)或operator@(aa,bb)
3. 命名空间里的运算符:依赖于名字查找——函数调用时,会从参数的命名空间中查找


二、继承

1.  确定指针指向的真实类型:1)类型域:在每个类里加一个类型域,比如字段type;2)虚函数, 3)dynamic_cast
2.  虚函数:
     a. 只允许返回值不同,函数名和参数类型列表要完全一样;
     b. 子类不需要override,什么前缀都不带
     c.  通过:基类名::函数名,可以越过虚函数
3. 抽象类:包含至少一个纯虚函数的类
    a. 纯虚函数:virtual void vf()=0;
4. 继承限制符:public ,protected, private

三、模板

1. 模板函数:虽然支持参数的类型推演,但根本不建议使用
2. 专门化模板类:可以用于解决代码膨胀的问题(这个名次翻译很烂)
     template<> class Vector {} ——所有指针类型的模板类都公用一个实现
3. 专门化模板函数:template<> bool less(const char* a, const char* b) {}
——专门化模板类和模板函数,真心没看懂优势是什么,直接定义具体类型的类、函数就可以实现相同功能了
4. export:为了让其他的编译单元可以访问,模版类/函数必须用export定义
// out.h:(声明头文件——只包含out函数的声明信息)

template void out (const T& t);

// out.cpp:(定义代码文件——包含out函数的声明[通过include]和定义等全部信息)

#include

#include “out.h”

export template void out (const T& t) {std::cerr << t;}

//user.cpp:(用户代码文件——包含函数的声明头文件后就可以使用该函数)

#include “out.h”

// 使用out()


四、异常

1. 捕捉所有异常:try{} catch(...){}
五、层次结构

1. 多次从一个基类继承:
    1. 常规继承:基类各自保存存储;调用基类函数时,需要显式声明基类;覆盖函数时需要对每个基类
    2. 虚继承:基类只保存一个存储;调用基类函数时,不需要显式声明基类;覆盖函数时只需要覆盖一次即可
2. 虚基类:不需要每个虚函数都覆盖,和C#中不同
3. 继承访问控制:private, protected, public
    1. private——public, protected方法变为private;只有子类的成员函数或友元可以把(子类*)转换为(基类*)
    2. protected——public, protected方法变为protected;只有子类或孙类的成员函数或友元可以把(子类*)转换为(基类*)
    3. public——public, protected保持不变;任何函数可以把(子类*)转换为(基类*)
    4. dynamic_cast——也需要遵守上面的转换限制

阅读(671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~