
C++
文章平均质量分 76
DoronLee
软件工程,图像处理,机器学习,人工智能
展开
-
c++ 利用boost 实现文件操作
对文件夹里面的文件进行遍历操作是基本技能之一,python,perl以及bash等脚本都很好的实现了文件遍历方法,对于c/c++来说,只能通过系统自定的api获取。虽然文件夹操作本身是调用操作系统内核的接口,但毕竟接口不够友好。boost不愧是准标准库,filesystem提供了极为简便的方法,如下所示:[cpp] view plain copy// filesystem tut3.cpp -转载 2018-01-30 19:44:26 · 2080 阅读 · 0 评论 -
Item 26:尽量推迟变量定义
Item 26: Postpone variable definitions as long as possible.这一规则在任何编程语言中都适用,一方面可以避免无用的构造使得程序更高效,另一方面作用域的缩小会使程序更加清晰。 存在控制流转移的代码中,你可能会不经意间定义无用的变量。例如:string encryptPassword(const string& password){转载 2018-01-18 13:49:52 · 413 阅读 · 0 评论 -
Item 29:追求异常安全的代码
Item 29: Strive for exception-safe code.异常安全是指当异常发生时,1) 不会泄漏资源,2) 也不会使系统处于不一致的状态。 通常有三个异常安全级别:基本保证、强烈保证、不抛异常(nothrow)保证。基本保证。抛出异常后,对象仍然处于合法(valid)的状态。但不确定处于哪个状态。强烈保证。如果抛出了异常,程序的状态没有发生任何改变。就像没调用转载 2018-01-22 13:55:01 · 426 阅读 · 0 评论 -
Item 33:避免隐藏继承来的名称
Item 33: Avoid hiding inherited names.其实本文的话题和继承完全没有关系,隐藏名称是作用域的问题。 在C++中每一对{ }都会开启一个新的作用域,并嵌套在当前作用域中。一个示例int x;void func(){ double x; cin>>x; // read a new value for local x}转载 2018-01-22 14:10:06 · 396 阅读 · 0 评论 -
Item 34:区分接口继承和实现继承
Item 34: Dirrerentiate between inheritance of interface and inheritance of implementation.不同于Objective C或者Java,C++中的继承接口和实现继承是同一个语法过程。 当你public继承一个类时,接口是一定会被继承的(见Item32),你可以选择子类是否应当继承实现:不继承实现,只继转载 2018-01-22 14:19:16 · 307 阅读 · 0 评论 -
Item 37:不要重写父类函数的默认参数
Item 37: Never redefine a function’s inherited default parameter value.不要重写父类函数的默认参数。Item 36已经说明子类中不应该重写继承而来的父类的非虚函数。 那么本文讨论的内容其实是:不要重定义虚函数的默认参数。为什么呢? 因为虽然虚函数的是动态绑定的,但默认参数是静态绑定的。只有动态绑定的东西才应该被重写。转载 2018-01-23 12:50:38 · 556 阅读 · 0 评论 -
Item 39:明智地使用private继承
Item 39: Use private inheritance judiciously.Item 32提出public继承表示”is-a”的关系,这是因为编译器会在需要的时候将子类对象隐式转换为父类对象。 然而private继承则不然:class Person { ... };class Student: private Person { ... }; // inheri转载 2018-01-23 16:43:51 · 353 阅读 · 0 评论 -
Item 44:将参数无关代码重构到模板外去
Item 44: Factor parameter-independent code out of templates.模板是个好东西,你可以在实现类型安全的同时少写很多代码。但模板提供的是编译期的多态, 即使你的代码看起来非常简洁短小,生成的二进制文件也可能包含大量的冗余代码。 因为模板每次实例化都会生成一个完整的副本,所以其中与模板参数无关的部分会造成代码膨胀(code bloat)。转载 2018-01-23 17:02:37 · 351 阅读 · 0 评论 -
Item 46:需要类型转换时,应当在类模板中定义非成员函数
Item 46: Define non-member functions inside templates when type conversions are desired.Item 24中提到,如果所有参数都需要隐式类型转换,该函数应当声明为非成员函数。 Item 24是以Rational和operator*为例子展开的,本文把这个观点推广到类模板和函数模板。 但是在类模板中,需要所有参转载 2018-01-23 17:10:09 · 348 阅读 · 0 评论 -
Item 12:完整地拷贝对象
tem 12: Copy all parts of an object在一个成熟的面向对象的C++系统中,只有两种拷贝对象的方式:复制构造函数和赋值运算符, 不妨称他们为拷贝函数。 拷贝函数属于编译器默认生成的函数(参考:Item 5:那些被C++默默地声明和调用的函数), 默认的拷贝函数确实会完整地拷贝对象,但有时我们选择重载拷贝函数,问题就出在这里!一个正确拷贝函数的实现是这样的:转载 2018-01-07 19:43:51 · 405 阅读 · 0 评论 -
Item 25:考虑实现一个不抛异常的swap
Item 25: Consider support for a non-throwing swap.Swap函数最初由STL引入,已经成为异常安全编程(见Item 29)的关键函数, 同时也是解决自赋值问题(参见Item 11:赋值运算符的自赋值问题)的通用机制。 std中它的基本实现是很直观的:namespace std{ templatetypename T> voi转载 2018-01-18 13:47:16 · 538 阅读 · 0 评论 -
Item 21:需要返回对象时,不要返回引用
Item 21: Don’t try to return a reference when you must return an objectItem 20中提到,多数情况下传引用比传值更好。追求这一点是好的,但千万别返回空的引用或指针。 一个典型的场景如下:class Rational{ int n, d;public: Raitonal(int numerator=0, i转载 2018-01-18 13:34:43 · 406 阅读 · 0 评论 -
Item 38:通过组合表示"拥有"或"以...实现"的关系
Item 38: Model “has-a” or “is-implemented-in-terms-of” through composition.一个类型包含另一个类型的对象时,我们这两个类型之间是组合关系。组合是比继承更加灵活的软件复用方法。 Item 32提到public继承的语义是”is-a”的关系。对象组合也同样拥有它的语义:就对象关系来讲,组合意味着一个对象拥有另一个对象,是”has转载 2018-01-23 16:37:27 · 283 阅读 · 0 评论 -
Item 40:明智地使用多继承
Item 40: Use multiple inheritance judiciously.多继承(Multiple Inheritance,MI)是C++特有的概念,在是否应使用多继承的问题上始终争论不断。一派认为单继承(Single Inheritance,SI)是好的,所以多继承更好; 另一派认为多继承带来的麻烦更多,应该避免多继承。本文的目的便是了解这两派的视角。具体从如下三个方面来介绍:转载 2018-01-23 16:48:10 · 377 阅读 · 0 评论 -
Item 42:typename的两种用法
Item 42: Understand the two meanings of typename.时至今日还有人在论坛里问模板参数前的typename和class有何区别:template<typename T> class Widget;template<class T> class Widget;答案是没有区别!有人觉得class写起来方便就用class,有人觉得typename语义更正确就转载 2018-01-23 16:54:00 · 922 阅读 · 0 评论 -
Item 41:隐式接口与编译期多态
Item 41: Understand implicit interfaces and compile-time polymorphism.面向对象设计中的类(class)考虑的是显式接口(explicit interface)和运行时多态, 而模板编程中的模板(template)考虑的是隐式接口(implicit interface)和编译期多态。对类而言,显式接口是由函数签名表征的转载 2018-01-23 16:51:46 · 366 阅读 · 0 评论 -
Item 45:使用成员函数模板来接受所有兼容的类型
Item 45: Use member function templates to accept “all compatible types”.Item 13提到智能指针可用来自动释放堆中的内存,STL中的迭代器也是一种智能指针,它甚至支持链表元素指针的++操作。 这些高级特性是普通指针所没有的。本文以智能指针为例,介绍成员函数模板的使用:成员函数模板可以使得函数可以接受所有兼容的类型。如果你转载 2018-01-23 17:05:30 · 258 阅读 · 0 评论 -
Item 5:那些被C++默默地声明和调用的函数
Item 5: Know what functions C++ silently writes and calls在C++中,编译器会自动生成一些你没有显式定义的函数,它们包括:构造函数、析构函数、复制构造函数、=运算符。 有时为了符合既有设计,我们不希望自动生成这些函数,我们可以把它们显式声明为private。 此时在使用这些类的客户看来,它们就像不存在一样。class Empty转载 2018-01-04 11:17:23 · 572 阅读 · 0 评论 -
Item 11:赋值运算符的自赋值问题
Item 11: Handle assignment to self in operator=如果我们选择重载一个类的赋值运算符,要注意在自赋值时仍然能够正确工作。自赋值看起来像是不正确的调用方式, 但是在C++中这是合法的而且常常是不可识别的。例如:a[i] = a[j];*p1 = *p2;base = derived 之所以会出现自赋值的问题,是因为C++允许变量有别名转载 2018-01-05 17:36:07 · 710 阅读 · 0 评论 -
Item 14:资源管理类要特别注意拷贝行为
Item 14: Think carefully about copying behavior in resource-managing classes.在Item 13:使用对象来管理资源中提出了基于RAII的资源管理对象,auto_ptr和shared_ptr。 智能指针可以有不同的拷贝策略。当你实现这样一个资源管理对象时,需要特别注意。比如一个典型的RAII风格的互斥锁实现:cla转载 2018-01-07 20:45:02 · 413 阅读 · 0 评论 -
Item 18:让接口容易被正确使用,不易被误用
Item 18: Make interfaces easy to use correctly and hard to use incorrectly.“让接口容易被正确使用,不易被误用”,这也是面向对象设计中的重要概念,好的接口在工程实践中尤其重要。 在使用优秀的第三方组件时,常常能够切身感受到好的接口原来可以这么方便,甚至不需记住它的名字和参数就能正确地调用。 反观自己写的API,常常会有转载 2018-01-18 13:24:41 · 414 阅读 · 0 评论 -
Item 13:使用对象来管理资源
Item 13: Use objects to manage resources.熟悉智能指针的人肯定不会对此觉得陌生。利用C++中对象自动析构的特性,自动地释放资源。 C++编译器并未提供自动的垃圾回收机制,因此释放资源的责任落在了开发者的头上。 我们被要求总是成对地使用new和delete,例如:Investment *pInv = createInvestment();...delete转载 2018-01-07 19:49:21 · 400 阅读 · 0 评论 -
Item 15:资源管理类需要提供对原始资源的访问
Item 15: Provide access to raw resources in resource-managing classes.在一个完美的设计中,所有的资源访问都应通过资源管理对象来进行,资源泄漏被完美地克服。然而世界是不完美的, 很多API会直接操作资源,尤其是一些C语言的API。总之,你会时不时地发现有需要直接访问资源, 所以资源管理对象需要提供对原始资源访问。获取资源的方转载 2018-01-07 20:49:00 · 459 阅读 · 0 评论 -
boost递归遍历获得特定目录下的所有文件夹名
在windows操作系统下可以使用微软的文件查找功能_findfirst(或_findfirsti64) 和_findnext(或者_findnexti64)配合_finddata_t(或者_finddatai64_t),但是无法脱离windows使用。如果需要使用宽字符的查找,可以在下划线后加入w(如_wfindfirst)。使用boost的FileSystem可以摆脱系统关联,so,查找文件夹的原创 2018-01-31 16:55:30 · 2400 阅读 · 0 评论 -
Item 4:确保变量的初始化
Item 4: Make sure that objects are initialized before they’re used.出于效率原因,C++不保证内置类型数据成员的初始化。对于成员变量的内置类型, 会在构造函数进入之前进行初始化。例如:class C{ int a; B b;};其中数据成员a是基本数据类型,b是成员对象。有些情况下C++会初始化转载 2018-01-03 16:37:30 · 473 阅读 · 0 评论 -
Item 6:禁用那些不需要的缺省方法
Item 6: Explicitly disallow the use of compiler-generated functions you do not want.在C++中,编译器会自动生成一些你没有显式定义的函数,它们包括:构造函数、析构函数、复制构造函数、=运算符。 关于这些函数是的调用时机可以参考:Item 5:那些被C++默默地声明和调用的函数。这些默认生成的函数给我们的类转载 2018-01-04 11:20:14 · 441 阅读 · 0 评论 -
Item 16:使用同样的形式来new和delete
Item 16: Use the same form in corresponding uses of new and delete.这是C++界中家喻户晓的规则:如果你用new申请了动态内存,请用delete来销毁;如果你用new xx[]申请了动态内存,请用delete[]来销毁。 不必多说了,来个例子吧:int* p = new int[2]{11, 22};printf("转载 2018-01-07 20:52:44 · 345 阅读 · 0 评论 -
Item 17:在单独的语句中将new的对象放入智能指针
Item 17: Store newed objects in smart pointers in standalone statements.在单独的语句中将new的对象放入智能指针,这是为了由于其他表达式抛出异常而导致的资源泄漏。 因为C++不同于其他语言,函数参数的计算顺序很大程度上决定于编译器。如果你在做Windows程序设计,或者DLL开发,可能会经常碰到类似__cdecl,_转载 2018-01-18 13:20:36 · 269 阅读 · 0 评论 -
Item 19:把类的设计视作类型设计
Item 19: Teat class design as type design.在面向对象语言中,开发者的大部分时间都用在了增强你的类型系统。这意味着你不仅是类的设计者,更是类型设计者。 重载函数和运算符、控制内存分配和释放、定义初始化和销毁操作……良好的类型有着自然的语法、直观的语义,以及高效的实现。 你在定义类时需要像一个语言设计者一样地小心才行!类的设计就是类型设计,当你定义一转载 2018-01-18 13:27:45 · 339 阅读 · 0 评论 -
Item 20:传递常量引用比传值更好
Item 20: Prefer pass-by-reference-to-const to pass-by-valueC++函数的参数和返回值默认采用传值的方式,这一特性是继承自C语言的。如果不特殊指定, 函数参数将会初始化为实参的拷贝,调用者得到的也是返回值的一个副本。 这些拷贝是通过调用对象的拷贝构造函数完成的,正是这一方法的调用使得拷贝的代价可能会很高。通常来讲,传递常量引用比传值转载 2018-01-18 13:32:09 · 648 阅读 · 0 评论 -
Item 22:数据成员应声明为私有
Item 22: Declare data members private数据成员声明为私有可以提供一致的接口语法,提供细粒度的访问控制,易于维护类的不变式,同时可以让作者的实现更加灵活。而且我们会看到,protected并不比public更加利于封装。语法一致性你肯定也遇到过这种困惑,是否应该加括号呢?obj.length // 还是 obj.length()?ob转载 2018-01-18 13:37:26 · 688 阅读 · 0 评论 -
Item 23:非成员非友元函数好于成员函数
Item 23: Prefer non-member non-friend functions to member functions在类的是实现中,常常会面临成员函数和非成员函数的选择。比如一个浏览器类:class WebBrowser{public: void clearCache(); void clearCookies(); void clearHistory(转载 2018-01-18 13:41:58 · 382 阅读 · 0 评论 -
Item 24:用非成员函数来支持所有元的类型转换
Item 24: Declare non-member functions when type conversions should apply to all parameters.虽然Item 15:资源管理类需要提供对原始资源的访问中提到,最好不要提供隐式的类型转化。 但这条规则也存在特例,比如当我们需要创建数字类型的类时。正如double和int能够自由地隐式转换一样, 我们的数字类型转载 2018-01-18 13:44:20 · 320 阅读 · 0 评论 -
Item 43:访问模板基类中的名称
Item 43: Know how to access names in templatized base classes.从面相对象C++转移到模板C++时,你会发现类继承在某些场合不在好使了。 比如父类模板中的名称对子类模板不是直接可见的,需要通过this->前缀、using或显式地特化模板父类来访问父类中的名称。因为父类模板在实例化之前其中的名称是否存在确实是不确定的,而C++偏向转载 2018-01-23 16:59:06 · 467 阅读 · 0 评论 -
Item 48:了解模板元编程
Item 48: Be aware of template metaprogramming.模板元编程(Template Metaprogramming,TMP)就是利用模板来编写那些在编译时运行的C++程序。 模板元程序(Template Metaprogram)是由C++写成的,运行在编译器中的程序。当程序运行结束后,它的输出仍然会正常地编译。C++并不是为模板元编程设计的,但自90转载 2018-01-24 18:52:09 · 311 阅读 · 0 评论 -
Item 47:使用Traits类提供类型信息
Item 47: Use traits classes for information about types.C++中的 Traits 类可以在编译期提供类型信息,它是用Traits模板及其特化来实现的。 通过方法的重载,可以在编译期对类型进行”if…else”判断。我们通过STL中的一个例子来介绍Traits的实现和使用。本文以iterator_traits为例介绍了如何实现traits类,以转载 2018-01-24 18:48:46 · 339 阅读 · 0 评论 -
Item 49:new handler的行为
Item 49: Understand the behavior of the new-handler.new申请内存失败时会抛出”bad alloc”异常,此前会调用一个由std::set_new_handler()指定的错误处理函数(”new-handler”)。set_new_handler()“new-handler”函数通过std::set_new_handler()来设置,std::s转载 2018-01-24 18:56:16 · 350 阅读 · 0 评论 -
Item 50:为什么需要自定义new和delete?
Item 50: Understand when it makes sense to replace new and delete.我们在Item 49中介绍了如何自定义new的错误处理函数,以及如何为你的类重载operator new。 现在我们回到更基础的问题,为什么我们需要自定义operator new或operator delete?检测使用错误。new得到的内存如果没有delete会导转载 2018-01-24 18:58:14 · 305 阅读 · 0 评论 -
Item 52:写了placement new就要写placement delete
Item 52: Write placement delete if you write placement new“placement new”通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存。 但广义的”placement new”指的是拥有额外参数的operator new。new和delete是要成对转载 2018-01-24 19:05:51 · 290 阅读 · 0 评论 -
Item 53:注意编译警告
Item 53: Pay attention to compiler warnings.编译警告在C++中很重要,因为它可能是个错误啊! 不要随便忽略那些警告,因为编译器的作者比你更清楚那些代码在干什么。 所以,请严肃对待所有warning,要追求最高warning级别的warning-free代码;但不要依赖于warning,可能换个编译器有些warning就不在了。其实在多数项目实践中,不转载 2018-01-24 19:07:11 · 396 阅读 · 0 评论