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

Effective C++

指针和引用的不同:

指针在定义的时候就必须进行初始化,如果在使用的过程中,这个变量可能指向为空,那么就不要使用引用,就需要使用指针。

指针域引用的另一个重要的不同是指针可以被重新定义赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,如果改变了应用的值,那么引用指向的对象就被修改了。

在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。

当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应该使用指针。

C++中的类型转换:

Const_cast:专门用来去除const属性;static_cast:类型于C中的强制类型转换。

Dynaminc_cast:用来基类和继承类之间的转换:

Reinterpret_cast:一般用来在函数指针类型之间进行转换。

不要对数组使用多态:

类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性。但是如果使用数组来实现多态是错误的。在实现析构也是错误的。

隐式类型转换构造函数,比如避免但参数的构造函数和内建数据类型的转换就需要使用关键字explicit

自增、自减操作符前缀形式与后缀形式的区别:

C++允许重载increment和decrement操作符的两种形式。重载函数间的区别决定于他们的参数类型上的差异,但是不论Increment和decrment的前缀还是后缀都是只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个Int类型参数,当函数被调用时,编译器传递一个0做为Int参数的值给该函数。一个返回引用,一个返回临时变量。后缀操作符函数没有使用它的参数,他的参数只是用来分区前缀与后缀函数调用。

Placement new操作就是在一块存在的内存中初始化自己的对象,比如你已经拥有了一段堆空间,你想在这块堆空间上初始化一个对象,就可以使用这个操作。

所谓default构造函数是一个可被调用而不带任何实参者。这样的构造函数要不没有参数,要不就是每个参数都有缺省值。有的类的构造函数被声明为explicit,这可阻止他们被用执行隐式类型转换,但他们仍可被用来进行显示类型转换。他禁止编译器执行非预期的类型转换。Copy构造函数被用来“以同型对象初始化自我对象”,copy asignment操作符被用来“从另一个同型对象中拷贝其值到自我对象”。

Widget w1;   //调用default构造函数

Widget  w2(w1);  //调用copy构造函数

W1   = w2;  //调用copy assignment操作符

当看到赋值符号时请小心,因为”=”语法也可用来调用copy构造函数:

Widget w3 =w2;  //调用copy构造函数

Copy构造和copy赋值有所区别。如果一个新对象被定义(例如以上语句的w3),一定会有个构造函数被调用,不可能调用赋值操作。如果没有新对象被定义(例如上面的w1 = w2),就不会有构造函数被调用,那么当然就是赋值操作被调用。

Copy构造函数是一个尤其重要的函数,因为它定义一个对象如何passed by value(以值传递),当一个函数的参数是一个类类型,实参传递过程调用了copy构造函数,passed-by-value意味调用copy构造函数。

时间: 2024-09-29 22:54:27

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

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

高效C++ --经验条款(三) 给多态基类声明virtual析构函数: "给base classes一个virtual析构函数",这个规则只适用于带有多态性质的base classes身上.这种base classes的设计目的是为了用来"通过base class接口处理derived class对象". 并非所有base classes的设计目的都是为了多态用途.例如标准stirng和STL容器都不被设计作为base classes使用,更别提多态了.某些clas

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

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

Effective C++ --经验条款

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

C++ 经验条款

C++经验谈: 一.绝不让构造函数称为虚函数: 从最简单的思想来看,C++对象模型中是根据虚函数表来管理虚函数的,那么在调用虚函数时,需要找到虚函数表,在对象没有创建成功时是没有虚函数表指针的,构造函数就是构造对象的,在对象没有创建成功之前来寻找虚函数表是不合理的. 一般情况下,编译器会为每个类生成一个公有的默认构造函数,但是有两种特殊情况例外: 一个类显示声明了构造函数,这种情况下编译器不会生成公有默认构造函数,如果程序需要一个默认构造函数,则需要程序员显示地提供. 一个类声明了一个非Publ

软件测试理论与经验--阅读笔记

第1章 测试员的角色 测试人员的角色到底是什么?能够定义的很清楚吗? 经验1-测试员是项目的前灯 测试就是要找到信息,有关项目或者产品的关键信息决策都需要根据这些信息来决定. 经验2-测试员的使命决定要做的一切 使命可能决定于行业.公司.项目或者团队的个性,测试项目也是千差万别.我们的使命是以客户为中心, 明确需求,提高工作效率及降低风险.要经常动态调整自己的使命,不要侧重某一方面而疏忽另一方面. 经验3-测试员为很多客户服务 测试员提供的服务时至关重要的,客户可以是项目经理.程序员.技术文档编

代码审查总结

最近所带项目,因为人员素质良莠不齐,写出的代码质量不一,为了保证项目质量,不得不对代码一行行进行审查.同时,为了对代码审查有个更深的了解及借鉴其它同行实践成果,在网上搜集了不少项目知识,下面是对这些知识做出的整理. 第1章前提 在 Wikipedia 上,对代码审查的定义是:代码审查(英语:Code Review)是指对计算机源代码系统化地审查,常用软件同行评审的方式进行,其目的是在找出及修正在软件开发初期未发现的错误,提升软件质量及开发者的技术.代码审查常以不同的形式进行,例如结对编程.非正式

浅谈云巴实时通信的编程模型

浅谈云巴实时通信的编程模型 中国物联网 2016-09-28 09:38 概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异,真正差异则聚焦于产品定位,业务模式,基础技术水平等诸多细节上.本文暂不讨论具体产品形态上的差异,着重从技术角度浅谈实时通信的编程模型. 什么是实时通信 「实时」(realtime) 一词在语义层面上隐含着对时间的约束(real

[深度好文]想成为一个高效的Web开发者吗?来看看大牛分享的经验吧~外加一些自己的理解

前言: 无意间浏览到此篇文章,发现这篇文章无论是对于新手程序员,还是学过几年的程序员,都是挺有帮助的.于是,在此分享,后面也有我自己的一些理解,希望能帮到更多的朋友. 作为一个软(ku)件(bi)工(de)程(ma)师(nong),你有没有觉得做什么事都没时间?没时间学习新东西,没时间去回顾.整理原来写的烂代码,没时间写单元测试,没时间给接管你项目的家伙写文档,没时间思考,没时间喘气,没!时!间! 额--如果你肯花点时间看看这篇文章,我相信你会明白应该把时间花在哪. 我曾以为成为一个技术大牛的唯

未来酒店——建设高效研发团队的经验分享

摘要: 在5月29日召开的第二届研发效能嘉年华中,由浙江未来酒店网络技术有限公司的孙吉君带来了"未来酒店--建设高效研发团队的经验分享".本次分享中他对未来酒店研发规模进行了介绍,对高效团队的三个特征.四个能力的培养和团队建设过程中的四个方法进行了讲解. 在5月29日召开的第二届研发效能嘉年华中,由浙江未来酒店网络技术有限公司的孙吉君带来了"未来酒店--建设高效研发团队的经验分享".本次分享中他对未来酒店研发规模进行了介绍,对高效团队的三个特征.四个能力的培养和团队