0%

C++笔记

0

大学的时候断断续续学过一点C++的东西,记得那时用的是《accelerated c++》,对于初学者相当友好又不至于太简单只能写toy代码,后来因为搞科研开始写python代码,最近一段时间因为学习Linux方面的东西又开始看C++方面的书。其中《c++ primer 5e》和《深入探索c++对象模型》对我理解C++帮助很大,从C++和python的异同中又学到不少东西(有点像之前看《SICP》学LISP的感觉),语言确实可以改变程序员的思考方式。下面断断续续地总结一些体会和知识。

1

最初并不是很理解Python的新式类(继承object),后来代码写得多了发现新式类多了许多特性,最突出的就是type时能够返回正确的类类型。对于C++这样的语言,假如class不需要兼容struct的内存结构完全可以单根继承object,这样一个object指针就可以指向所有类型了。用void 也没问题,但void*在没转换前几乎什么都做不了,像类型这样的信息完全可以放在父类object内。当然这样会略微增加一点类实例的大小。

2

sizeof一个空的class得到的结果是1(有些编译器是零),因为需要有一个地址来做『占位符』(以便指针指向),这也说明C++在class优化真的挺彻底的,class在正确使用下并不会比struct带来更多的『负担』。

3

多线程下,即使构造函数的最后一行也不要泄露this, 因为Foo可能是基类,基类先于派生类构造,执行完Foo::Foo()后还会执行派生类的构造函数,仍然不安全。因为其他线程可能会引用到一个不完全对象。

4

异常的出现有一部分是为了处理C++中构造函数没有返回值的情况,但在析构中一般不抛出异常,因为一般的异常有可能会调用析构函数,这时又抛出异常会使得资源无法正常释放,另外异常点之后的代码不能正常执行,正常的析构无法完成的话也会有内存泄露问题。