随笔分类 -  C++

摘要:常量表达式是指不会改变并且在编译阶段就能得到计算结果的表达式.显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式. 一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如: const int max_file = 20; // max_files 是常量 阅读全文
posted @ 2021-04-10 00:50 phr2000 阅读(169) 评论(0) 推荐(0)
摘要:std::move 的定义 template <typename T> // typename表明type是一个类型 typename remove_reference<T>::type&& move(T&& t) { return static_cast<typename remove_refer 阅读全文
posted @ 2021-04-08 00:21 phr2000 阅读(1438) 评论(0) 推荐(0)
摘要:template <typename T> void f(T &p); 函数参数p是一个模板类型参数T的引用,记住两点:编译器会应用正常的引用绑定规则; const是底层的,不是顶层的. 从左值引用函数参数推断类型 当一个函数参数是模板类型参数的一个普通(左值)引用时(即, T&),绑定规则告诉我们 阅读全文
posted @ 2021-04-07 23:51 phr2000 阅读(139) 评论(0) 推荐(0)
摘要:使用类的类型成员 我们通过(::)来访问static成员和类型成员. 在普通函数中,编译器掌握类的定义,因此,它知道通过作用域访问符访问的是名字还是static成员. 但对于模板代码,如T::mem它不会知道men是一个类型成员还是一个static数据成员,知道实例化时才知道. T::size_ty 阅读全文
posted @ 2021-04-05 23:55 phr2000 阅读(112) 评论(0) 推荐(0)
摘要:继承关系对基类拷贝控制最直接的影响是基类要定义一个虚析构函数,这样我们才能动态分配继承体系中的对象. 当我们delete一个动态分配的对象的指针时将指向析构函数.如果该指针指向继承体系中的某个类型,则有可能出现指针的静态类型与被删除对象的动态类型不符的情况. 析构函数的虚属性会被继承.只要基类的析构 阅读全文
posted @ 2021-03-28 10:17 phr2000 阅读(121) 评论(0) 推荐(0)
摘要:拷贝构造函数 \(如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则为拷贝构造函数.\) class Foo { public: Foo(); // 默认构造函数 Foo(const Foo &); // 拷贝构造函数 } \(拷贝构造在几种情况下都会被隐式使用,因此不应该 阅读全文
posted @ 2021-03-27 11:49 phr2000 阅读(53) 评论(0) 推荐(0)
摘要:派生类对象向基类的类型转换 因为派生类对象中含有与基类对应的组成部分, 所以能把派生类对象当成基类对象来使用,我们可以将基类的指针或引用绑定到派生类对象中的基类部分上. Quoto item; // 基类 Bulk_quote bulk; // 派生类 Quote item *p = &item p 阅读全文
posted @ 2021-03-27 09:51 phr2000 阅读(119) 评论(0) 推荐(0)
摘要:\(allocator类定义在头文件memory中,帮我们将内存分配和对象构造分离开来.\) \(它分配的内存时未构造.\) aallocator<string> alloc; // 定义可分配string的allocator对象 auto const p = alloc.allocate(n); 阅读全文
posted @ 2021-03-24 18:31 phr2000 阅读(61) 评论(0) 推荐(0)
摘要:shared_ptr类 \(与vector类似,智能指针也是模板.\) shared_ptr<string> p1; shared_pte<list<int>> p2; \(默认初始化的智能指针是一个空指针,与普通指针一样,解引用得到它指向的对象.\) if (p && p->empty()) *p 阅读全文
posted @ 2021-03-24 18:25 phr2000 阅读(39) 评论(0) 推荐(0)
摘要:\(new分配内存, delete释放new分配的内存.\) new \(在默认情况下,动态内存的对象是默认初始化的,所以内置类型或组合类型的对象的值是未定义的.\) string *ps = new string; // 初始化位空的string int *pi = new int // int的 阅读全文
posted @ 2021-03-24 18:24 phr2000 阅读(64) 评论(0) 推荐(0)
摘要:右值引用 \(所谓右值引用就是必须绑定到右值的引用.\\符号是\&\&.只能绑定到一个将要销毁的对象.\\因此.我们可以自由地将一个右值引用的资源"移动"到另一个对象.\) \(右值和左值都是表达式的属性.\\一般而言,一个左值表达的是一个对象的身份,而右值表达式表达是一个对象的值.\) \(类似任 阅读全文
posted @ 2021-03-24 18:15 phr2000 阅读(118) 评论(0) 推荐(0)
摘要:\(一个lambda表达式可以表示一个可调用的代码单元,可以将其理解成一个未命名的内联函数.\) \(一个lambda表达式具有一个返回类型,一个参数列表,一个函数体,与函数不同,它可能定义在函数内部.\) \(形式如下:\) [capture list](prarameter list) -> r 阅读全文
posted @ 2021-03-24 18:13 phr2000 阅读(54) 评论(0) 推荐(0)
摘要:内联函数 \(将函数定义为宏函数或内联函数都可以节约函数压栈出栈的时间\) \(宏函数的问题:\) #define MAX(a, b) ((a) > (b)) ? (a) : (b) \(宏函数是无脑展开, 在预处理阶段进行,它不具有语法的检测能力. 如:\) MAX(a++, b++) -> (( 阅读全文
posted @ 2021-03-13 15:48 phr2000 阅读(249) 评论(0) 推荐(0)