`

C++、面向对象随想

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

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

相关推荐

    代码随想录算法PDF.rar

    9. **C++编程技巧**:包括面向对象编程、模板元编程、STL(标准模板库)的使用、异常处理等C++高级特性,这些技巧对于编写高效的C++代码至关重要。 10. **算法设计与分析**:学习如何分析算法的时间复杂度和空间...

    代码随想录最新第三版-最强八股文

    2. **Java**:深入剖析Java基础,包括内存模型、面向对象编程、集合体系、接口、Lambda表达式、类加载机制、内部类、代理类以及Java并发和JVM(Java虚拟机)的工作原理。这部分内容对于理解Java的运行机制至关重要。...

    软件随想录.pdf

    3. 编程范式:过程式编程、面向对象编程、函数式编程等。 4. 设计模式:常用的设计模式,如工厂模式、单例模式、策略模式等。 5. 软件架构:微服务架构、SOA(面向服务的架构)、MVC(模型-视图-控制器)架构等。 6....

    23种设计模式(C++).pdf

    懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成 立。道可道,非常道。道不远人,设计模式亦然如此。

    WebServerApp

    MFC是微软推出的一套面向对象的C++类库,它封装了Windows API,使得开发者能够更高效地构建Windows应用程序。在WebServerApp中,MFC可能被用来处理线程管理、窗口类、消息处理、网络I/O等关键任务。使用MFC可以简化...

    《代码随想录》链表算法详解及实现

    面向的对象主要是具有一定基础的编程学习者和技术求职人员,适用于面试准备、技术提升等场合。学习者能够从中获得扎实的基础理解和高效解决复杂问题的能力。 适用人群:正在从事软件研发工作的人群或是有一定编程...

    VC开发的WEBSERVICE服务器

    6. **WCF(Windows Communication Foundation)**:WCF是微软新一代的面向服务架构,它将多种通信协议和消息模式统一到一个框架下,包括Web Service。尽管WCF可以使用多种语言(包括C++),但在VC中使用WCF开发Web ...

    Java后端大厂面试八股文

    在面向对象编程方面,讨论了override(重写)和overload(重载)。override用于子类继承父类时改变或扩展父类方法的功能,需要遵循严格的匹配规则,如参数列表、返回值和访问权限的一致性。而overload是在同一类中...

    java8源码-itscoder.github.io:这是itsCoder官网的仓库

    面向对象 6 Android 6 Android 6 Android 6 Android 6 Android 6 Android 6 算法 5 Design 5 React Native 5 Java 5 Android 5 Android 5 Android 5 Android 5 Android 5 Android 5 Java 4 Java 4 算

    java笔试题算法-weeklyblog:这是itsCoder的WeeklyBlog的存储库

    java笔试题算法 WeeklyBlog 欢迎来到 itsCoder 的 WeeklyBlog 项目。...面向对象 6 Android 6 Android 6 Android 6 Android 6 Android 6 Android 6 算法 5 Design 5 React Native 5 Java 5 Android 5 An

Global site tag (gtag.js) - Google Analytics