- 博客(11)
- 收藏
- 关注
原创 《Effective Modern C++》学习总结(条款11- 15)
条款11:优先使用delete关键字删除函数而不是private却又不实现的函数1.=delete 是C++ 11新特性——见侯捷C++ 九中的描述删除的函数不能通过任何方式被使用方便起见,删除函数被声明为公有的,而不是私有的。这样设计的原因是,使这个函数为公有的可以产生更易读的错误信息任何函数都可以是删除的,然而仅有成员函数才可以是私有的2.小技巧1:使用delete能够防止隐式转换(见第一部分侯捷C++ 九)——通过把隐式转换的重载函数都delete,避免隐式转换,充分利用了d
2021-12-24 09:54:22
232
原创 《Effective Modern C++》学习总结(条款6- 10)
条款6:当auto推导出非预期类型时应当使用显式的类型初始化1.一种特殊情况:auto在推导vector<bool>时会返回vector<bool> reference常识是:std::vector<T>的operator[]常常返回一个T&std::vector<bool> features();auto ret = features(); //返回vector<bool> referen
2021-12-23 10:08:43
215
原创 《Effective Modern C++》学习总结(条款1- 5)
第一章、类型推导 条款1:理解模板类型推导模板类型推导的核心就在于模板参数的类型(也就是下文中的ParamType)和传入对象类型,下面将其分为三种情况分析。第一种情况:ParamType是个非通用的引用或者是一个指针1.当传递一个const对象给一个引用参数时,往往会期望对象保留其const特性,也就是说,参数变成了const的引用这也是为什么给一个以T&为参数的模板传递一个const对象是安全的——对象的const特性是模板参数类型推导的一部分template&l
2021-12-22 10:08:57
737
原创 《Effective C++》学习总结(条款51- 55)
条款51:编写new和delete时需固守常规1.opreator new的返回值很单纯,分为两种情况:如果有能力分配出用户申请的内存,返回一个指针指向该内存在每次分配失败后调用new-handerling函数,只有当new-handerling函数指向null时,才会抛出bad_alloc异常(见条款49)2.operator new内含一个无穷循环,只有当内存被成功分配或new-handerling函数完成其某一个特定动作后才会结束循环3.一般来说,针对一个class自定义设计的opera
2021-12-21 09:52:28
390
原创 《Effective C++》学习总结(条款41- 50)
第七章:模版与泛型编程 Template and Generic Programming 条款41:了解隐式接口和编译期多态1.class和template都支持接口和多态,但对于属于泛型编程的后者,与前者有根本上的不同对class而言接口是显式的,由函数签名式构成;多态是通过virtual函数发生于运行期——运行期多态对template而言接口是隐式的,由有效表达式组成;多态是通过template具现化和函数重载解析发生于编译期——编译器多态凡是设计w(w是泛型编程中的一个对象
2021-12-20 18:51:46
349
原创 《Effective C++》学习总结(条款31- 40)
条款31:将文件间的编译依存关系(compilation dependencies)降至最低对于C++类而言,如果它的头文件变了,那么所有这个类的对象所在的文件都要重编,但如果它的实现文件(cpp文件)变了,而头文件没有变(对外的接口不变),那么所有这个类的对象所在的文件都不会因之而重编1.接口与实现分离(通过pimpl idiom的设计方式)——其实质在于以”声明的依存性“替换”定义的依存性“上述也是编译依存最小化的本质——现实中让头文件尽可能自我满足,万一做不到,则让它与其他文件内的声明式相
2021-12-18 12:33:19
738
原创 《Effective C++》学习总结(条款21- 30)
条款21:必须返回对象时,别妄想返回其reference1.在任何函数中返回一个reference(或指针)指向某个local对象,都没有任何意义——因为其即将被销毁2.不要返回pointer或reference指向一个heap对象(用户不知道如何delete)3.不要返回pointer或者reference指向local static对象而有可能需要多个这样的对象(同一行不能调用多次该函数,static只有一份)4.当你必须在“返回一个reference”和“返回一个object”之间抉择,你需要
2021-12-17 21:02:41
777
原创 《Effective C++》学习总结(条款16- 20)
条款16:成对使用 new 和 delete 时要采取相同形式1.new:当使用new的时候,会发生如下两件事:首先,一块内存会被分配出来;其次,针对此内存会有一个(或更多)构造函数被调用。2.delete:当使用delete的时候,会发生如下两件事:首先,针对此内存会有一个(或更多)析构函数被调用;其次,内存被释放(通过operator delete的函数)。3.那么问题在于:即将被删除的那个指针,所指的是单一对象还是对象数组?也就是:即将被删除的内存之内究竟存有多少对象?
2021-12-16 21:00:45
217
原创 《Effective C++》学习总结(条款11 - 15)
条款11:在operator= 中处理“自我赋值”1.“自我赋值”发生在对象被赋值给自己的时候2.加一个“证同测试”使具有“自我赋值安全性”3.精心安排的语句可以使代码具有“异常安全性”(自动获得“自我赋值安全性”):在复制构造之前别删除原指针4.copy-and-swap技巧(见条款29),核心在于将*this数据与copy的复件版本进行交换操作5.请记住:确保当对象自我赋值时operator=有良好的行为。其中的方法包括比较 “赋值的来源对象” 与 “赋值的目标对象” 的地址(即2中的证
2021-12-14 20:03:02
563
原创 《Effective C++》学习总结(条款06 - 10)
条款06:若不想使用编译器自动生成的函数,就该明确拒绝1.请记住:为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。如果想要将linkage报错移至编译阶段,也可以通过使用一个像Uncopyable一样的base类,该类允许derived对象构造与析构,但通过将copy 构造函数和copy assignment放在private里来阻止其derived对象copy与赋值。Day 5条款07:为多态基类声明virtual析构函数1.当一个derived c
2021-12-13 15:36:53
274
原创 《Effective C++》学习总结(条款01 - 05)
introduction 导读 1.对高效使用C++的两类忠告 :一般性的设计策略带有具体细节的特定语言类型2.术语:声明(declaration)与定义(definition): 声明是告诉编译器某个元素的名称和类型,但略去细节。定义则是使编译器为程序元素分配空间。二者的区别: 注意区分声明和定义式,二者最根本的区别就是是否分配内存,声明不会导致内存的分配,而定义会分配内存。在C++程序中声明可以有多次,但是定义只能有一次。因此不能将变量的定义放置于头文件中,由于头文件会被多
2021-12-12 14:09:37
262
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人