随笔分类 - c++基础学习
学习C++11
摘要:template class Vector { public: /** *默认构造函数 */ Vector(){} /** *拷贝控制 */ Vector(const Vector &s) { auto newdata = alloc_n_copy(s.begin(), s.end()); ...
阅读全文
摘要:函数模板 编译器通常用函数实参来为我们推断模板实参。 编译器用推断出的模板参数来为我们实例化(instantiate)一个特定版本的函数。生成的版本通常被称为模板的实例。 我们可以在模板中定义非类型参数(nontype parameter)。一个非类型参数表示一个值而非一个类型。模板实参必须是常量表
阅读全文
摘要:购物篮程序:模拟虚拷贝 文本查询程序(2):允许单词的逻辑组合查询如:fiery&bird|wind 分析: 我们只需要对于TextQuery,定义operator~(),operator|(TextQuery1,TextQuery2),operator&(TextQuery1,TextQuery2
阅读全文
摘要:在C++语言中,基类将类型相关的函数与派生类不做改变直接继承的函数区别对待,对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明为虚函数。 派生类必须将其继承而来的成员函数中需要覆盖的那些重新声明。不同于之间的成员函数,虚函数必须得定义。 因为在派生类对象中含有与其基类对
阅读全文
摘要:对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。 对于一个重载的运算符来说,其优先级和结合律与对应的内置运算符保持一致。 逻辑与运算、逻辑或运算和逗号运算符的运算对象求值顺序规则无法保留下来,所以不建议重载; 逗号运算发和取地址运算符不重载的另一个原因:C++语言已经定义了这
阅读全文
摘要:文本查询程序 要求:程序允许用户在一个给定文件中查询单词。查询结果是单词在文件中出现的次数及所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。 对要求的分析: 1.读入文件,必须记住单词出现在每一行。因此,程序需要逐行读取文件,并将每一行分解成独立的单词; 2. 程序生成输出时,它必须能提
阅读全文
摘要:拷贝控制操作:拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符、析构函数。 实现拷贝控制操作的最困难的地方是首先认识到什么时候需要定义这些操作。 拷贝构造函数: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数时拷贝构造函数。 参数是引用:为了避免陷入
阅读全文
摘要:智能指针——shared_ptr 为了更容易地使用动态内存,新的标准提供了智能指针来管理动态对象。智能指针的行为类似常规指针,重要的区别是它负责自动释放指向的对象。 智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。 最安全的分配和使用动态内存的方法是调用一个名为make_sha
阅读全文
摘要:当用decltype来获得一个函数指针类型时,必须加上一个*来指出我们要使用一个给定函数类型的指针。decltype<CompareIsbn>*。 map<string, int>::value_type v3; //v3 是一个pair<const string, int> 由于下标操作可能插入一
阅读全文
摘要:泛型算法的基础是迭代器。 迭代器令算法不依赖于容器,但是算法依赖于元素类型的操作。也即:算法永远不会执行容器的操作。 那么,如果想向容器中添加元素或者执行其他的一些操作呢?标准库提供了插入迭代器来完成。但算法自身永远不会做这样的操作。 理解算法最基本的方法是:了解它们是否读取元素、改变元素、或是重排
阅读全文
摘要:现代C++程序应该使用标准库容器,而不是更原始的数据结构,例如内置数组。 新标准库容器的性能几乎肯定与最精心优化过的同类数据结构一样好。 当我们用一个对象来初始化容器时,或将一个对象插入到容器中时,实际上放入到容器中的是对象值的拷贝,而不是对象本身。 容器选择原则: 首先确定是否真的需要在容器中间位
阅读全文
摘要:关于this指针 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象。当我们调用一个成员函数时,用请求该函数的对象初始化this。 因为this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址。 例如this的类型是Sale_data* cons
阅读全文
摘要:执行函数的第一步是(隐式地)定义并初始化它的形参。所以,函数最外层作用域中的局部变量也不能使用与函数形参一样的名字。 局部静态变量:在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。在此期间即使对象所在的函数结束执行也不会对它产生影响。 Best Practice:熟悉C的程
阅读全文
摘要:表达式语句:一个表达式+一个分号 表达式语句的作用是执行表达式并丢弃掉求值结果。 空语句:单独一个分号 Best Practice:使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的。 复合语句(块):用花括号括起来的语句和声明的序列。 一个块就是一个作用域。 条件语句——if 注
阅读全文
摘要:左值和右值 当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。 一个重要的原则是需要右值的地方可以用左值来代替,但是不能把右值当作左值使用。(13.6有例外情况) 下面是集中用到左值的情况: 1.赋值运算符需要一个(非常量)左值作为其左侧
阅读全文
摘要:C++11新特性:范围for(range for) vector和数组都是对象的集合,而引用不是对象。 vector对象可以高效地增长,在定义vector对象的时候设定其大小也就没什么必要了,事实上如果这么做性能可能更差。 C++11新特性:cbegin() & cend() 为了便于专门得到con
阅读全文
摘要:如何选择算术类型? 当明确知晓数值不可能为负的时候,选用无符号类型; 不要使用char和bool,对于不大的整数,明确指定signed char或unsigned char; 使用int执行整数运算(而非short和long),太大的数值选用long long; 执行浮点运算选用double,因为f
阅读全文
浙公网安备 33010602011771号