自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Effective_C++:38、绝对不要重新定义继承而来的缺省参数值

38、绝对不要重新定义继承而来的缺省参数值1、缺省参数值的静态绑定虚拟函数是动态绑定的,非虚拟函数是静态绑定的。对于非虚拟函数,绝对不应该重新定义,见Effective_C++:37https://blog.csdn.net/l1dian11/article/details/81603168。对于虚拟函数,由于函数的缺省参数值是静态绑定的,即通过指针调用函数时缺省参数值由指针的声明...

2018-08-12 09:01:07 239

原创 Effective_C++:37、绝对不要重新定义继承而来的非虚拟函数

37、绝对不要重新定义继承而来的非虚拟函数1、静态绑定非虚拟函数是静态绑定的,虚拟函数是动态绑定的。在派生类中重新定义一个继承而来的非虚拟函数与一个虚拟函数,则用基类指针或派生类指针指向一个派生类对象,并通过指针来调用函数时:非虚拟函数静态绑定,由指针类型决定调用基类函数还是派生类函数;虚拟函数是动态绑定,由指向的对象类型决定基类函数还是派生类函数。调用函数 基类指针 ...

2018-08-12 08:25:33 212

原创 Effective_C++:36、区分接口继承(interface inheritance)和实现继承(implementation inheritance)

36、区分接口继承和实现继承成员函数的接口一定会被继承,因为公有继承是“isa”的关系,只要可以用于基类对象上,就可以用于派生类对象上。1、纯虚拟函数声明一个纯虚拟函数的目的是让派生类只继承其接口。纯虚拟函数必须被派生类重新声明,且在基类中通常没有定义。但是,纯虚拟函数在基类中也是可以定义的,此时通常用于实现为其他非纯虚拟函数提供缺省行为。2、非纯虚拟函数声明一般(非纯...

2018-08-10 08:42:37 246

原创 Effective_C++:35、确定你的public inheritance,模塑出“isa”的关系

35、确定你的public inheritance,模塑出“isa”的关系1、共有继承共有继承意味着“is a”的关系,意味着任何一个可以接受基类指针或引用的参数的函数,都接受一个派生类对象,意味着任意用基类对象的地方都可以使用派生类对象。如student继承于person。然而,派生类对象数组不是基类对象数组。2、共有继承问题然而,实际中,会有一些问题。如penguin继承于bi...

2018-08-03 10:35:47 122

原创 Effective_C++:33、明智地应用inlining

33、明智地应用inlining1、inline函数使用 inline函数时,函数的每一步都以函数代码取代。故将函数inlining,可能增加目标代码的大小(除非inline函数的函数体比“以函数调用”产出的代码更小)。但是他不需要承受函数调用时的成本(生成副本)。2、编译器拒绝将函数inline时inline与register一样,只是对编译器的提示、建议,并不是一个强制命令。...

2018-08-01 09:28:57 205

原创 Effective_C++:32、尽可能延缓变量定义式的出现

32、尽可能延缓变量定义式的出现1、原因在定义一个变量时,即会调用其构造函数进行初始化,离开作用域之后调用析构函数销毁。即,如果变量没有被使用,则调用的构造函数与析构函数就是白白增加的成本。同时,构造时进行初始化远比构造完对象再赋给一个值效率高。2、结果所以,尽可能延缓变量定义式的出现,指延缓变量的定义,直到必须使用该变量时,甚至尝试直到能够给他初值时。  ...

2018-08-01 08:29:25 120

原创 Effective_C++:9、31、千万不要传回“函数内local对象的reference”或“函数内以new获得的指针所指的对象”

31、千万不要传回“函数内局部对象的引用”或“函数内以new获得的指针所指的对象”1、原因local对象在函数返回时被销毁,返回其引用的结果未定义。以new获得的指针,还需要关注delete问题,防止内存泄漏。若某些时候此返回值只作为中间临时变量,无法进行delete。传回static对象则在一个地方多次使用该函数时发生问题。见(Effective_C++:23、当你必须传回obj...

2018-08-01 08:26:32 156

原创 Effective_C++:30、避免写出member functions,传回一个non-const pointer或reference并以之指向较低存取层级的members

30、避免写出成员函数,传回一个非const指针或引用并以之指向较低存取层级的成员1、传回一个非const引用时传回一个非const引用时,有可能该引用是私有成员或保护成员,将传回的引用作为全局的一个引用的初始化,则可以利用这个全局的引用来访问私有成员或保护成员,使得设定的访问权限被破坏。1、传回一个非const指针时同理,传回一个非const指针,赋给另一个指针,则可以通过外部的...

2018-08-01 08:22:04 169

原创 Effective_C++:29、避免传回内部数据的handles

29、避免传回内部数据的handles1、const成员函数中对于const对象,其只能调用const成员函数。若传回内部数据的handles(可能是指针,可能是引用),则存在改变const对象内部数据的可能。解决方法就是要么声明为非const函数,要么不传回任何handle。1.声明为非const函数,则对于const对象,不能调用该函数,这只是避免了问题,并非真正的解决问题。2.传...

2018-08-01 08:15:24 120

原创 Effective_C++:28、尝试切割global namespace(全局命名空间)

28、尝试切割全局命名空间1、命名空间的使用有三种方式使用命名空间:1.导入命名空间的所有符号。若存在同名的临时变量,会掩盖命名空间的符号。using namespace std;2.导入命名空间的某个符号。若存在同名的临时变量,编译器会发生错误,名称冲突。using std::cout;3.使用符号时,用作用域操作符来指明命名空间。std::cout &lt...

2018-07-27 14:23:24 395

原创 Effective_C++:27、如果不想使用编译器暗自产生的member function,就应该明白拒绝他

27、如果不想使用编译器暗自产生的member function,就应该明白拒绝他有时,撰写一个class,可能不想使用编译器暗自产生的成员函数,如赋值操作符,那么我们就应该拒绝他。办法就是将其声明为private。声明了这个函数,编译器就不会再暗自产生一个版本,声明为private,则别人不可以调用他。然而,其他成员函数与友元函数可以调用他,为此,我们只声明他而不进行定义,则当他被调用时会出...

2018-07-26 10:06:23 113

原创 Effective_C++:26、防卫潜伏的ambiguity(模棱两可)状态

26、防卫潜伏的模棱两可状态1、潜伏的模棱两可状态潜伏的模棱两可状态,是指存在一种使用情景下使得程序出现模棱两可状态,而当这种场景被应用之前,模棱两可状态并没有出现(潜伏下来)。2、防卫潜伏的模棱两可状态1.将B对象转换为A型别,既可以通过A的构造函数,又可以通过B的转换函数。如下,在不使用f(b)前,程序的声明都是合法的,然而,当使用f(b)时,才发现存在模棱两可状态。若不使用f...

2018-07-26 09:32:28 189

原创 Effective_C++:25、避免对指针型别和数值型别进行重载

25、避免对指针型别和数值型别进行重载1、指针型别和数值型别进行重载的问题指针保存的是其所指对象的地址,解析时将其变为数值类型。尤其是有时我们把一个空指针定义为0,则当传入一个值为0的参数,若对指针型别和数值型别都进行重载的函数,应当出现编译错误,因为此时编译器不知道0是指针型别还是数值型别。然而,实际上,编译器对于入参为0的情况,会认为其为数值型别,会调用参数为数值型别的函数,并不会出现...

2018-07-25 09:58:13 197

原创 Effective_C++:24、在函数重载和参数缺省化之间,谨慎抉择

24、在函数重载和参数缺省化之间,谨慎抉择1、函数重载与参数缺省化函数重载:函数特征标不同的同名函数,由调用函数时的函数特征标来选用对应的函数。参数缺省化:给予参数一个缺省值,当调用函数时,为没有缺省值的参数都提供了值,则可以不给有缺省值的参数提供值,此时他们会使用默认的缺省值。2、在函数重载和参数缺省化之间,谨慎抉择当函数只需一个算法、默认参数不会影响算法结果时,选用参数缺省...

2018-07-24 08:10:16 136

原创 Effective_C++:23、当你必须传回object时,不要尝试传回reference

23、当你必须传回object时,不要尝试传回reference1、必须传回object当考虑传回reference时,一定要想想这个reference的另一个名称是啥,他指的是哪个对象,这个对象是否存在于调用函数中。否则,函数无法返回一个临时对象的reference。即需要传回一个产生的临时对象时,必须传回object。2、尝试传回reference当需要传回临时对象的值时,尝试...

2018-07-23 13:33:37 134

原创 Effective_C++:22、尽量使用pass_by_reference(传址),少用pass_by_value(传值)

22、尽量使用传址,少用传值1、传址与传值传值是指在函数被调用时,以实参为基础将形参初始化,即形参为实参的一个副本,然后调用结束,函数同样以传回值为基础创建副本,传回副本的值并销毁形参。传址是指在函数被调用时,形参作为实参的别名,传入与传回时都不会创建新的对象或副本。2、为何尽量使用传址,少用传值1.传值时,需要创建副本,内存开销可能很大,而传址可以避免这一过程。2.传值时...

2018-07-22 10:39:56 165

原创 Effective_C++:21、尽可能使用const

21、尽可能使用const1、const的作用const关键字的作用就是表示某个对象不应该被修改。若某值应该保持不变,就应该明确指出来,告诉编译器和其他程序员这个值不应该被改变,而编译器也会严格遵守这个值不能被改变的规则。const的使用范围很广。1.可以修饰全局变量、局部变量、static变量、类内的static与非static变量,使之为常量。2.可以修饰指针。在*前是表示...

2018-07-21 10:20:37 213

原创 Effective_C++:20、避免将data members放在公开接口中

Effective_C++:20、避免将data members放在公开接口中1、避免将data members放在公开接口中将data members放在公开接口中,主要是方便类外可以访问,随时读写。但是为了数据安全、公开接口的一致性(都是函数),我们也可以用函数来实现数据成员的读写,函数的抽象性使得类的使用者不会受到影响。读取数据的函数,通过返回值来读取数据成员,此时可以考虑将其声...

2018-07-20 08:35:03 96

原创 Effective_C++:19、区分member functions、non-member functions和friend functions三者

19、区分member functions、non-member functions和friend functions三者1、member functions、non-member functions和friend functions成员函数:class的成员函数,可以是普通函数、虚函数,可以访问类的public、protected、private成员,会被派生类继承。重载运算符时参数数量...

2018-07-19 11:58:05 1274

原创 Effective_C++:18、努力让接口完满(complctc)且最小化

18、努力让接口完满(complctc)且最小化1、接口的完满与最小化声明与定义一个新的class,我们尽量要他的接口完满且最小化。而所谓接口,就是对于这个类的使用者,使用接口完成某些事情,至于具体的实现方法、过程是不需要知道的。使接口完满,就是让这个class能实现所有的功能,即满足使用者所有的需求。使接口最小化,则是使得接口的数量尽可能的少,接口的功能尽可能的不要重叠。2、...

2018-07-18 09:44:09 169

原创 Effective_C++:17、在operator=中检查是否“自己赋值给自己”

17、在operator=中检查是否“自己赋值给自己”1、为何检查是否“自己赋值给自己”在使用赋值操作符时,我们只要求调用的对象类型、参数类型正确即可。所以,自己赋值给自己是完全合法的,如可能将一个对象的别名作为另一个对象赋值给这个对象。发生自己赋值给自己,可能会发生一些问题,为此,我们需要检查是否“自己赋值给自己”。1.为了确保正确性。使用赋值操作符给左边的对象配置新资源时,可能需要...

2018-07-17 09:52:59 501

原创 Effective_C++:16、在operator=中为所有的data members设定(赋值)内容

16、在operator=中为所有的data members设定(赋值)内容1、默认的assignment运算符与自定义的assignment运算符        在自定义一个class时,若没有声明assignment运算符,则编译器会为class产生一个缺省的assignment运算符。默认的assignment运算符,将会使得对象的每个数据成员都按照二进制值进行拷贝。        而有些时...

2018-07-16 10:56:52 89

原创 Effective_C++:15、令operator=传回“*this的reference”

15、令operator=传回“*this的reference”1、const变量、const指针、const引用        const变量是指变量的值不能改变,const指针是指使用该指针不能改变他指向的对象的值,const引用是指使用该引用不能改变与他绑定的对象的值。        const指针可以指向const变量与非const变量,但非const指针只能指向非const变量。    ...

2018-07-15 14:04:34 94

原创 Effective_C++:14、总是让base classs拥有virtual destructor

14、总是让base classs拥有virtual destructor1、为啥让base classs拥有virtual destructor        在含有继承关系的情况中,让基类的析构函数为虚函数,则在销毁指向派生类的基类指针时,会成功调用派生类的析构函数,否则只调用基类的析构函数。        有时,需要class跟踪记录他的对象数量,则可以定义一个static成员初始为0,调用...

2018-07-14 14:06:39 338

原创 Effective_C++:13、initialization list中的members初始化次序应该和其在class内的声明次序相同

13、initialization list中的members初始化次序应该和其在class内的声明次序相同1、初始化列表的成员初始化次序        初始化列表的成员初始化次序是按照他们在class内的声明次序,与成员初始化列表中出现的次序无关。记住,这是一个设定,编译器在编译时会按照class内的声明次序对成员进行初始化,在成员初始化列表的调用对应的构造函数,不在成员初始化列表的调用默认构造...

2018-07-13 10:57:53 113

原创 Effective_C++:12、在构造函数中尽量以initialization(初始化)动作取代assignment(赋值)动作

12、在构造函数中尽量以initialization(初始化)动作取代assignment(赋值)动作1、initialization(初始化)动作        首先,得强调一下,初始化动作是在构造函数中使用的。仅当定义构造函数时,有两种方式将类的数据成员赋予某个特定的值(尽量使用成员初始化列表):        1.使用初始化动作,即成员初始化列表。此时,是将该数据直接初始化为特定值,即调用该...

2018-07-12 12:12:21 546

原创 Effective_C++:11、如果class内有动态分配内存,请为class声明一个拷贝构造函数和赋值运算符

11、如果class内有动态分配内存,请为class声明一个拷贝构造函数和赋值运算符1、拷贝构造函数和赋值运算符        创建一个class,若没有声明拷贝构造函数和赋值运算符,如同没有声明构造函数和析构函数一样,会有默认的拷贝构造函数和赋值运算符。        拷贝构造函数用于程序中按值传递的地方,而赋值运算符仅用于两个已声明的对象。2、有动态分配内存时,默认的拷贝构造函数和赋值运算符c...

2018-07-11 12:04:17 240

原创 Effective_C++:10、如果你写了一个operator new,请对应写一个operator delete

10、如果你写了一个operator new,请对应写一个operator delete1、何时需要写一个operator new        缺省版的operator new和delete功能已经足够了,但不可避免的是他可能需要花费更多的内存,来提高效率。对于一些需要动态分配大量小额空间的程序而言,更需要提高效率。class AirplaneRep {...};//表示一个Airplane对象...

2018-07-10 11:17:46 120 1

原创 Effective_C++:9、避免遮掩了new的正规形式

9、避免遮掩了new的正规形式1、遮掩new的正规形式        内部的一个声明名称,会遮掩外边部的相同名称。即若全局区域和class内部都有函数f(),成员函数可能会遮掩掉全局函数。        因此,当给class加进一个operator new时,将不经意间妨碍调用new正规形式的能力。class X {public: static void * operator new (...

2018-07-09 10:26:24 97

原创 Effective_C++:8、撰写operator new和operator delete时应遵守的公约

8、撰写operator new和operator delete时应遵守的公约1、撰写operator new时应遵守的公约        1.函数行为应该与缺省的operator  new保持一致性。即函数应该有正确的返回值:内存不足时调用new_handler,并准备处理内存不足的问题;内存足够时返回一个指针指向他。        2.避免不经意遮掩了正常形式的new。        3.op...

2018-07-08 10:54:08 95

原创 Effective_C++:7、为内存不足的状况预做准备

7、为内存不足的状况预做准备1、#define是啥

2018-07-07 13:33:16 301

原创 Effective_C++:6、记得在destructor中以delete对付pointer members

6、记得在destructor中以delete对付pointer members1、在constructor中添加pointer members        class要进行动态配置内存,会在构造函数里以new配置内存,在析构函数里delete释放内存。因此必须记得所有在构造函数里被分配内存的成员并delete。        在class中添加pointer member,几乎总是需要:1.在...

2018-07-04 11:17:00 111

原创 Effective_C++:5、使用相同形式的new和delete

5、使用相同形式的new和delete1、new和delete        new和delete是C++用来动态内存申请和释放的操作符,会调用构造函数和析构函数。在Effective_C++:3、尽量以new和delete取代malloc和free中有介绍。        new和delete有两种形式。        申请的内存中有一个对象时:string *pstring1 = new st...

2018-07-03 16:28:15 131

原创 Effective_C++:4、尽量使用C++风格的注释形式

4、尽量使用C++风格的注释形式1、注释         旧有的C注释语法是/*...*/,注释多行,而新的C++单行注释为//。2、注释可能出现的问题       如下, 如果要注释掉多行代码,其中包含有注释部分,注释会在遇到第一个*/时截止,导致意料之外的结果。if(a > b){/* int temp = a; /* swap a and b */ a = b;*/ ...

2018-07-03 15:25:16 186

原创 Effective_C++:3、尽量以new和delete取代malloc和free

3、尽量以new和delete取代malloc和free1、malloc和free        malloc和free是C语言中申请和释放动态内存的函数,malloc申请在堆上寻找一块指定大小的内存,返回一个void类型的指针,指向该内存的首地址;若申请失败则返回空指针NULL。程序结束,需要使用free()调用之前的指针来释放之前申请的动态内。2、为啥要取代malloc和free       ...

2018-07-02 12:18:54 193

原创 Effective_C++:2、尽量以iostream取代stdio.h

2、尽量以<iostream>取代<stdio.h>1、<iostream>与<stdio.h>       <stdio.h>是C语言的包含标准输入输出函数的头文;<iostream>是C++的头文件。2、为啥要取代<stdio.h>        尽管<stdio.h>中的print

2018-07-02 10:53:09 664

原创 Effective_C++:1、尽量以const和inline取代#define

1、尽量以const和inline取代#define1、#define是啥        #define被称为宏定义,是用来定义一个常量的,会在预编译期间直接进行文本替换。主要用于以下场景:        1.后接一个参数,用来定义标识,表示这个标识此处被定义。常用于#ifndef、#define、#endif结构,来防止头文件被重复包含。#ifndef MYSTRING_H_#define M...

2018-07-01 13:20:25 152

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除