最近使用C++,用起来总感觉不是很顺畅,主要不是对语法和stl的不是熟,而是使用面向对象方法时,有点局促,放不开手脚。
C++从c发展而来,从根上继承了c的一些特性,对象、引用、指针并存,很难去取舍,有时因为没有完美的方法而感到很纠结。使用对象就很难避免拷贝,使用指针、引用如果持有的是栈中的对象就很难保证生命周期一致而导致句柄悬空,堆中动态申请的对象,就容易发生内存泄露,谁申请谁就释放的准则并不适用于所有情况。而按照面向对象的方式去设计,深层的封装会加剧这一过程。c++的一些容器所采用的方法,就是拷贝,放进去我就拷贝,因为这是最安全的方式。
所以个人认为c++比较适合扁平一点的结构,不适合像Java那样多层封装。因为封装一层就增加了返回对象拷贝的次数,如果比较大的对象或者容器,性能就会有问题,而Java只是引用地址的拷贝。如果是深层次的指针或者引用返回,生命周期很难保证,并且一旦所持有的对象被销毁,就会发生诡异的难以发现的错误,没有exception那么易查。而像Java这用只有引用持有堆中对象的具有垃圾回收的语言是不需要考虑持有对象的生命周期、拷贝和内存泄露的问题的,所以可以放开手脚按照真实世界的语义进行设计。当然Java这类语言和C++一样也需要担心引用对象的共享的问题,但一般不会有什么纠结之处,使用场景会很容易让你做出正确的判断。因为Java没有像c++那样const语义的语言支持,所以封装性是个很大的问题,一旦返回内部成员的引用,private的封装性只是表面上的摆设而已。不变对象是个解决方法,这种写时拷贝的技术,使得设计的对象具有很好的封装性、线程安全性并避免不必要的拷贝,但是不变对象有一大堆的要求和限制,所以一般值类型的对象最好设计为不变对象,比如String,Address。
智能指针在C++中或许是解决上面所说问题的好的选择,但是多层的封装会加剧智能指针的嵌套从而导致可读性的问题。使用C++根据应用选择定制内存管理模式或者是更好的方式,很多应用也是这么做的,但难度也比较大。
欢迎大家讨论,洗耳倾听。
分享到:
相关推荐
在次有大量的关于c++面向对象编程的实例 对于初级的学习者有很大的帮助
该文件是谭浩强《谭浩强 C++面向对象程序设计》电子扫描版,高清
c++面向对象程序设计杜茂康 课后习题代码及结果
C++面向对象程序设计教程(第3版)——陈维兴、林小茶编著 清华大学出版社 这个是对应的PPT课件,文件为压缩包,里面每章一个PPT文件。
c++面向对象考试题即答案 很有用的...............
C++面向对象程序设计习题集,主要练习面向对象思想。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
C++面向对象高效编程C++面向对象高效编程C++面向对象高效编程C++面向对象高效编程
c++面向对象程序设计课后习题答案c++面向对象程序设计课后习题答案c++面向对象程序设计课后习题答案
C++面向对象程序设计上机考试题库.pdf
c++面向对象程序设计_杜茂康_课后答案[1-6章]_
c++面向对象程序设计第三版谭浩强教学大纲.pdf
C++面向对象高级编程代码资源及课件.tar.gz
C++面向对象程序设计C++面向对象程序设计C++面向对象程序设计C++面向对象程序设计C++面向对象程序设计
【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 ) : https://hanshuliang.blog.csdn.net/article/details/99609557 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 ...
期末课程设计题目,使用C++面向对象思想实现的ATM取款机的基本操作,本人也是学生,初学,写的不好,仅供参考。
清华大学出版社,龚晓庆付丽娜等编写的《C++面向对象程序设计》第二版,课后编程题参考答案。
此为清华大学出版社陈维兴等人编写的《C++面向对象程序设计教程》习题答案,仅供学习参考
c++面向对象程序设计语言重点难点复习题及答案。
(麻省理工免费课程)C语言内存管理和C++面向对象编程,学习的好资料
C++面向对象程序设计课后答案(清华大学出版社)