高效C++ --经验条款(三)

高效C++ --经验条款(三)

给多态基类声明virtual析构函数:

“给base classes一个virtual析构函数”,这个规则只适用于带有多态性质的base classes身上。这种base classes的设计目的是为了用来“通过base class接口处理derived class对象”。

并非所有base classes的设计目的都是为了多态用途。例如标准stirng和STL容器都不被设计作为base classes使用,更别提多态了。某些classes的设计目的是作为base classes使用,但不是为了多态用途。有些类并非被设计用来“经由base class接口处置derived class对象”,因此他们不需要virtual析构函数。

带多态性质的baseclasses应该声明一个vitual析构函数。如果class带有任何virtual函数,他就应该拥有一个virtual析构函数。

Classes的设计目的如果不是作为baseclasses使用,或不是为了具备多态性,就不该声明virtual析构函数。

不要在构造和析构函数中调用virtual函数

将operator=操作符返回reference *this

注意在operator=中处理“自我赋值”

在自定义的operator=中,一定要明确将所有成员都进行复制,特别是有继关系在内时。

标准库中auto_ptr类似智能指针的unique_ptr,他只能指向唯一一个对象,若通过copy构造函数或copy assignment操作符复制他们,他们会变成NULL,而复制所得的指针将取得资源的唯一拥有权力。受auto_ptr管理的资源必须绝对没有一个以上的auto_ptr同时指向它。

Auto_ptr和shared_ptr两者都在其析构函数内做delete而不是delete[]动作,那意味在动态分配而得的array身上使用auto_ptr或shared_ptr不是一个好主意。

其实New和delete有很多中使用方法和含义,这里说最经典的一个使用方法,使用New动态生成一个对象:

当使用New动态生成一个对象时,有两件事情发生。第一,内存被分配出来(通过名为operator new的函数),第二,针对此内存会有一个(或更多)构造函数被调用。当你使用delete,也有两件事情发生,针对此内存有一个(或多个)析构函数被调用,然后内存才被释放(通过名为operator delete的函数)。Delete的最大问题在于:即将被删除的内存之内究竟存有多少对象?这个问题的答案决定了由多少个析构函数必须被调用起来。也就是说即将被删除的那个指针,所指的是单一对象或对象数组?

这样就会有一个问题,如果你使用的new表达式中使用[],必须在相应的delte表达式中也使用[]。如果在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。

先记住,这是new的第一种使用方法,往后还会介绍New的别的使用方法。

在使用智能指针时,以独立语句将newed对象存储于(置于)智能指针内。也就是说,比如一个函数的一个参数是智能指针的,那么不要在传递参数的时候完成指针指针额初始化,首先初始化,然后传递初始化好的东西。不然可能会造成错误。

时间: 2024-10-09 21:26:16

高效C++ --经验条款(三)的相关文章

高效C++ --经验条款(二)

STL迭代器以指针为根据塑造,所以迭代器的作用就像个T*指针,声明迭代器为const就像声明指针为const一样(既声明一个T* const指针),表示这个迭代器不得执行不同的东西,但它所指的东西的值是可以改动的.如果你希望迭代器所指的东西不可被改变(类似const T*指针),需要的是const_iterator. Std::vector<int>  vec; Const std::vector<int>::iteratoriter = vec.begin();   //iter

高效C++ --经验条款(一)

Effective C++ 指针和引用的不同: 指针在定义的时候就必须进行初始化,如果在使用的过程中,这个变量可能指向为空,那么就不要使用引用,就需要使用指针. 指针域引用的另一个重要的不同是指针可以被重新定义赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,如果改变了应用的值,那么引用指向的对象就被修改了. 在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况

高效阅读文章的“三步曲”

高效阅读文章的“三步曲” 通读杨春玲老师的两篇博文“我科研过程中走过的弯路及纠偏探索 ”.“如何有效阅读文献(图) ”及其中链接的文章How to Read a Paper http://blog.sciencenet.cn/home.php?mod=attachment&filename=howtoread.pdf&id=47254,现给出自己对于这一问题的思考,以下没有标注的引号里的内容均来自杨老师的两篇博文中. 一.认真研读自己专业的经典教材,“教材是一个领域里最佳参考,研究之前先查

ibatis 开发中的经验 (三)ibatis与spring2集成配置

ibatis项目中用到了一些基本配置,需要和spring集成,看了看这些配置大部分同hibernate中是一样的,也比较好理解,只是需要他们的配置中每个类的含义,还有其中的一些细节还是需要我们了解的,知识不在多,而在不断吸收和重复,在使用和练习中加深对各种问题的理解. 读取属性文件配置 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceho

Effective C++ 条款三 尽可能使用const

参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以再被修改     const int val = 90;      val = 100;   错误 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改, 则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const

Effective C++ --经验条款

高效C++ -4 必须返回对象时,别妄想返回其reference: 这句话什么意思呢?就是在一个函数内,如果你需要这个函数返回一个新的对象,那么这个函数的返回值类型就不要定义成引用类型.就直接返回这个类类型. 首先,我们知道在函数传递参数时,传递引用的好处,尤其是对那么比较大的类型,但是对于内建类型和STL的迭代器类型就没有必要使用引用传递,就可以使用值传递.因为对于内建类型传递引用不值得. 下面看一个例子,为何在必须返回对象时,就别想返回对象的引用.因为得到了函数传递引用的好处,有人可能在返回

C#心得与经验(三)Regex,Exception,Delegate &amp; Events

一.Regular Expression using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace RegexTest { class Program { static void Main(string[] args) { str

模块设计与实现经验总结(三)

3  模块详细设计指南与规范 模块详细设计要完成两个方面工作:一是明确模块的功能需求和非功能需求.二是设计如何完成和实现模块的功能需求,包括类结构.线程结构设计等.本节根据后台模块特点,描述了两部分工作需要考虑和设计的关键点. 3.1确定模块的功能规格 1) 本模块概述 概述主要描述了本模块所属子系统,以及在子系统中所承当职责的简单描述. 2) 本模块在系统中与周围模块关系和交互情况 很多模块一般要依赖周围的模块或者数据库,为此建议以图形方式描述本模块与本模块依赖的其他模块或者数据库之间交互情况

集合类操作优化经验总结(三)

集合类实践 ArrayList.Vector.LinkedList 均来自 AbstractList 的实现,而 AbstractList 直接实现了 List 接口,并扩展自 AbstarctCollection.ArrayList 和 Vector 使用了数组实现,ArrayList 没有对任何一个方法提供线程同步,因此不是线程安全的,Vector 中绝大部分方法都做了线程同步,是一种线程安全的实现.LinkedList 使用了循环双向链表数据结构,由一系列表项连接而成,一个表项总是包含 3