`

C++、面向对象随想

阅读更多
最近使用C++,用起来总感觉不是很顺畅,主要不是对语法和stl的不是熟,而是使用面向对象方法时,有点局促,放不开手脚。
C++从c发展而来,从根上继承了c的一些特性,对象、引用、指针并存,很难去取舍,有时因为没有完美的方法而感到很纠结。使用对象就很难避免拷贝,使用指针、引用如果持有的是栈中的对象就很难保证生命周期一致而导致句柄悬空,堆中动态申请的对象,就容易发生内存泄露,谁申请谁就释放的准则并不适用于所有情况。而按照面向对象的方式去设计,深层的封装会加剧这一过程。c++的一些容器所采用的方法,就是拷贝,放进去我就拷贝,因为这是最安全的方式。
所以个人认为c++比较适合扁平一点的结构,不适合像Java那样多层封装。因为封装一层就增加了返回对象拷贝的次数,如果比较大的对象或者容器,性能就会有问题,而Java只是引用地址的拷贝。如果是深层次的指针或者引用返回,生命周期很难保证,并且一旦所持有的对象被销毁,就会发生诡异的难以发现的错误,没有exception那么易查。而像Java这用只有引用持有堆中对象的具有垃圾回收的语言是不需要考虑持有对象的生命周期、拷贝和内存泄露的问题的,所以可以放开手脚按照真实世界的语义进行设计。当然Java这类语言和C++一样也需要担心引用对象的共享的问题,但一般不会有什么纠结之处,使用场景会很容易让你做出正确的判断。因为Java没有像c++那样const语义的语言支持,所以封装性是个很大的问题,一旦返回内部成员的引用,private的封装性只是表面上的摆设而已。不变对象是个解决方法,这种写时拷贝的技术,使得设计的对象具有很好的封装性、线程安全性并避免不必要的拷贝,但是不变对象有一大堆的要求和限制,所以一般值类型的对象最好设计为不变对象,比如String,Address。
智能指针在C++中或许是解决上面所说问题的好的选择,但是多层的封装会加剧智能指针的嵌套从而导致可读性的问题。使用C++根据应用选择定制内存管理模式或者是更好的方式,很多应用也是这么做的,但难度也比较大。

欢迎大家讨论,洗耳倾听。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics