C++基础知识点补漏

会的不再重复记录,把不熟悉的记录一下。重点是知道有这么个概念,什么时候用,不需要死记细节,用到时候查一下即可。

《C++ Primer》阅读

宏观而言,比起入门书籍,主要增加了STL库、智能指针方面的东西。
1,用#ifndef 把头文件的内容都放在#ifndef和#endif中,能防止头文件被重复包含编译。
2,标准库中bitset类型用来处理位操作。
3,显式转换:(个人理解是了解即可)
static_cast:进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

Base*bp = static_cast< Base*>(dp)  //上行转换是安全的

dynamic_cast: 尽少用量
reinterpret_cast:它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针
const_cast:用于修改类型的const或volatile属性。
4,顺序容器 (了解即可)
例如list有三种适配器。主要作用是包装其它容器使之具有某种操作特征。stack 堆栈适配器可以将list包装成 堆栈。
5,深拷贝、浅拷贝
A=B,默认是浅拷贝。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。
解决方法1是深拷贝

CA(const CA& C)
{
 a=C.a;
 str=new char[a]; //深拷贝
 if(str!=0)
  strcpy(str,C.str);
}

解决方法2是使用智能指针。

《Effective C++》阅读

1、C语言部分:
1.1、多用const,少用define。
2、OOP部分:
2.1、多态中,基类析构函数需定义为virtual。
2.2、以对象来管理资源(指针、锁、数据库连接、文件访问等)
个人理解:所谓RAII,举个例子,函数中使用互斥锁时,容易忘记释放锁。如果把锁的操作封装成对象,在对象构造时加锁,在对象析构时释放锁。这样,由于函数中的对象是局部变量,出函数作用域后,自动调用析构函数释放锁,避免用户忘记释放锁。其他例子比如,读写文件的时候,很容易忘记关闭文件,如果借用 RAII技术,就可以规避这种错误.再如对数据库的访问,忘记断开数据库连接等等,都可以借助RAII 技术也解决。
shared_ptr,unique_lock都是RAII对象。

《重构 改善既有代码的设计》阅读

1、重构的定义:不改变软件外在行为的前提下,重构其内部结构,以方便理解或增加新功能
2、重构的目的:改进软件设计、增加软件可读性、方便添加新功能、减少bug。
3、处理概括关系(类之间继承的优化):
3.1、字段上移
如果两个子类拥有相同的字段,则将该字段移至超类
如果这些字段是private的,你必须将超类的字段声明为protected,这样子类才能引用它。
3.2、将函数上移
有些函数在各个子类中产生完全相同的结果,则将该函数移至超类
如果你使用的是一种强类型语言,而待提升函数又调用了一个只出现于子类而未出现于超类的函数,你可以在超类中为被调用函数声明一个抽象函数。
3.3、构造函数本体上移
如果在各个子类中拥有一些构造函数,并且它们的本体几乎完全一致。那么可以在超类中新建一个构造函数,并在子类构造函数中调用它。
3.4、函数下移
如果超类中的某个函数只与部分(而非全部)子类有关,则将这个函数移到相关的那些子类中去。
3.5、字段下移
超类中的某个字段只被部分(而非全部)子类用到,则将这个字段移到需要它的那些子类去。
3.6、提炼子类
如果类中的某些特性只被某些(而非全部)实例用到,则新建一个子类,将上面所说的那一部分特性移到子类中。
3.7、提炼超类
如果两个类有相似特性,则为这两个类建立一个超类,将相同特性移至超类。
3.8、提炼接口
如果某各类在不同环境下扮演截然不同的角色,使用接口就是个好主意。
3.9、折叠继承体系
如果超类和子类之间无太大区别,则将它们合为一体。
3.10、塑造模板函数
你有一些子类,其中相应的某些函数以相同的顺序执行类似的操作,但各个操作的细节上有所不同。将这些操作分别放进独立函数中,并保持它们都有相同的签名,于是原函数也就变得相同了。然后将原函数上移至超类。

C++ 11新特性

内容太多,没必要面面俱到。个人觉得比较实用的几个。
1,使用nullptr表示空指针。
2,智能指针。
不需要手动去释放指针指向的内存。分共享式与独占式。
std::shared_ptr,多个指针指向同一个内存计数器也相应加1或减1。当最后一个指针管理对象销毁时,计数器为1,此时在销毁指针管理对象的同时,也把指针管理对象所管理的指针进行delete操作。
3,多线程

void threadfun1();
void threadfun2(int iParam, std::string sParam);

std::thread t1(threadfun1);
std::thread t2(threadfun2, 10, "abc");
t1.join(); 同步
t2.detach(); 异步

4,For循环和auto的使用。

int numbers[] = { 1,2,3,4,5 };
for (auto number : numbers)
{
    std::cout << number << std::endl;
}

5、std::function和std::bind
std::function可以理解为函数指针。std::bind可以指定将某函数绑定到std::function上,并指定具体参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值