C++ Primer 读书笔记
文章平均质量分 88
River_Lethe
这个作者很懒,什么都没留下…
展开
-
Chapter2 变量和基本类型
4种变量初始化的方法int val = 0;int val = {0}; //C++11int val{0}; //C++11int val(0); 这种用花括号初始化的方法称作为”列表初始化 “, 这种初始化有一个重要特点:当进行有丢失信息风险的初始化行为时, 编译器将会报错.long double ld = 3.1415926;int a{ld},b={l原创 2017-09-20 22:10:40 · 378 阅读 · 0 评论 -
再探迭代器
除了为每个容器定义的迭代器以外,标准库在头文件 iterator 中还定义了额外4种迭代器 插入迭代器 、 流迭代器 、 反向迭代器 、 移动迭代器插入迭代器基本介绍插入器是一种迭代器适配器,接受一个容器,生成一个插入迭代器vector<int> vi;auto it = back_inserter(vi);//back_inserter是插入器//it是其生成的对应容器vi的插入器对插原创 2017-11-10 15:40:42 · 426 阅读 · 0 评论 -
谓词与lambda、bind
谓词(predicate)标准库中定义了一类可以“定制操作”的算法函数,这类函数接收一个参数,这个参数与以往我们所认识的参数不同,它是一个可调用的对象,其返回结果是一个能用作条件的值。 这个参数就是谓词。 我们通过谓词来定制特定的操作。 谓词分为一元谓词和二元谓词,表示可调用表达式接收一个还是两个参数。 谓词的使用例子:bool isShorter(const string &s1,const原创 2017-11-09 17:07:58 · 498 阅读 · 0 评论 -
C++ 严格弱序
什么是严格弱序?C++关联容器的有序容器对元素关键字的类型有要求,元素关键字的类型必须定义了严格弱序(stick weak ordering) 拿内置类型来说,C++都定义了 “<”操作符,这就是一个严格弱序,而“<=”就不是一个严格弱序严格弱序有什么用?对于内置类型我们自然可以有<、>、=来判断两个值的大小关系,而对于自定义的类类型,为它定义三种比较操作符是没有必要的,只用一个严格弱序(这里就用原创 2017-11-23 20:40:37 · 7500 阅读 · 6 评论 -
类的const成员函数
类的const成员函数class Sales_data{public: string Get_isbn() const {return bookNo;} //const成员函数pritvate: string bookNo;}; 定义为const的成员函数 不可以修改类的数据成员(只读) 在成员函数内使用类的数据成员时,实际上隐式的引入了 this //以原创 2017-10-18 19:57:54 · 793 阅读 · 0 评论 -
数据窃取——移动操作
右值引用C++11标准中引入了一种新的引用类型——右值引用(rvalue reference),右值引用必须绑定到一个右值上,用&&来获取右值引用。右值左值表示一个对象的身份,如: 返回左值引用的函数、下标、解引用、前置递增/递减运算符而右值表示一个对象的值 返回非引用类型的函数、算数运算符、位运算、逻辑运算符、后置递增/递减运算符我们看出右值有以下特点右值没有其他用户 右值是无名的原创 2017-12-14 15:19:42 · 2218 阅读 · 0 评论 -
shared_ptr的使用和陷阱
shared_ptr的使用分配内存make_shared//make_shared<int>分配一块int类型大小的内存,并值初始化为100//返回值是shared_ptr类型,因此可以直接赋值给spshared_ptr<int> sp = make_shared<int>(100);new接受指针参数的只能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式转化为一个只能指原创 2017-12-06 20:37:03 · 13250 阅读 · 6 评论 -
unique_ptr的使用和陷阱
unique_ptr的使用分配内存与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,并且由于unique_ptr不可拷贝和赋值,初始化unique_ptr必须使用直接初始化的方式。unique_ptr<int> up1(new int()); //okay,直接初始化unique_ptr<int> up2 = new i原创 2017-12-07 15:07:12 · 14046 阅读 · 0 评论 -
动态内存与智能指针
程序中内存分配有以下五种:栈区 存放局部变量、函数参数等,由编译器自动分配,变量离开作用域后自动收回内存,可分配的内存空间较小。void func(int _a);int main(){ int a = 5; //局部变量a存放在栈区 func(a); //参数值存放在栈区}堆区 由程序员手动分配与回收,分配内存后生存期直原创 2017-12-06 18:54:45 · 2884 阅读 · 0 评论 -
C++ 关联容器
不同于顺序容器,关联容器根据元素的键(key_type)来组织元素。 关联容器有 set 和 map 两类,根据unordered、multi修饰共衍生出8种关联容器。 一般根据是否有序来划分:有序关联容器mapmultimapsetmultiset无序关联容器unordered_mapunordered_multimapunordered_setuno原创 2018-01-05 21:51:06 · 497 阅读 · 0 评论 -
顺序容器操作
容器大小操作empty() 返回bool值,容器为空时true,非空时falsemax_size() 返回一个大于或等于该类型容器所能容纳的最大元素个数(即size()一定不超过max_size())。size() 返回容器中元素的个数,但forward_list不支持size() 原因如下: forward_list的设计目标是达到与最好的手写单向链表的数据结构性能相当,而实现si原创 2017-11-05 20:31:52 · 290 阅读 · 0 评论 -
C++类的静态成员
类的静态成员由整个类所共享,而不属于任何一个对象。声明静态成员在成员的声明之前加上static来将它声明为静态成员。 类的静态成员可以是常量、引用、指针、类类型,也可以是public或privateclass A{public: static double rate(){return interestRate;} static void rate(double);原创 2017-10-24 19:15:05 · 651 阅读 · 0 评论 -
Chapter1 开始
关于CinCin返回了什么?int val;cout<<typeid(cin>>val).name();//输出为class std::basic_istream<char,struct std::char_traits<char> >//是一个istream对象 Cin返回了一个istream对象.作为条件判断语句int val;while(cin>>val);cout<<"输入了原创 2017-09-20 20:54:56 · 260 阅读 · 0 评论 -
Chapter3 字符串、向量和数组
字符串字面值与string对象相加 1. 字符串字面值与string是不同的类型 2. 字面值与string类型对象相加时,必须确保每个加法运算符(+)的两侧至少有一个string对象string str1 = "hello";string str2 = str1 + "world"; //合法string str3 = "hello" + "world原创 2017-09-29 16:56:06 · 244 阅读 · 0 评论 -
Chapter6 函数
参数传递 形参初始化的机理与变量初始化一样,分为传值(拷贝)和传引用传值参数只是将实参的值拷贝后传入,完成这个过程后,再与实参对象本身无关。 因此,在赋值与传参时,会忽略掉实参的顶层const NOTE 因为忽略顶层const的特性,顶层const不能作为函数重载的参数区分void func(int a);void func(const int a); //er原创 2017-10-11 12:05:34 · 256 阅读 · 0 评论 -
Chapter4 表达式
求值顺序只有4种运算符明确规定了运算对象的求值顺序. 即: 1.逻辑与 (&&) 先求左侧,且只有在左侧值为真时才求右侧 2.逻辑或 (||) 先求左侧,且只有在左侧值为假时才求右侧 3. 条件 (? :) cond?expr1:expr2,先求cond的值,如果为真执行expr1,为假执行expr2 4.逗号原创 2017-10-02 13:10:39 · 226 阅读 · 0 评论 -
Chapter5 语句
switch内部的变量定义switch的执行流程有可能会跨过某些case标签,若果被跳过的case中含有变量的声明,则此声明也会被跳过,但它下面的case仍在变量的作用域中。因此 在需要为某个case定义并初始化一个变量时,应该加上{大括号}将变量的作用域限定在case内case true:{ string str = "aaa"; //str仅在块内有效}原创 2017-10-05 11:05:02 · 230 阅读 · 0 评论 -
顺序容器概述
什么是顺序容器? 元素在容器中的排列次序只与元素加入容器的次序有关,可以按照顺序访问元素。顺序容器大致分为两类 按照元素在内存中储存的方式,可以将顺序容器分为连续储存和离散储存两种连续储存的顺序容器 容器在内存中占据一整块连续的内存空间,元素在容器中的排列方式就是在物理内存中的排列方式。这样的顺序容器有两个特点:可以随机访问元素在容器中间插入或删除元素,由于要保持元素在内存中的连续原创 2017-10-31 15:38:26 · 527 阅读 · 0 评论 -
容器拷贝
在容器的初始化和赋值时常常会对另一个容器(或部分容器)进行拷贝 下面就来讨论下容器拷贝时的一些规则 容器的定义及初始化有以下几种方式(并不全是拷贝)默认构造函数Container c; //如果Container是array,则按元素默认值初始化;否则c为空指定大小的构造函数Container seq(n); //n个元素,默认值初始化Container原创 2017-10-31 16:58:51 · 565 阅读 · 0 评论 -
C++中的强制类型转换
C++中有五种强制类型转换static_castconst_castreinterpret_castdynamic_cast旧式(C风格)强制类型装换 下面一一介绍static_cast 只要不包含底层const,都可以使用/* static_cast<type>(exp) 将exp的结果转化为type类型*/double d = 10;void *vp = &d;d原创 2017-10-23 20:51:42 · 312 阅读 · 0 评论 -
隐式的类类型转换
转化构造函数 如果构造函数只接受一个实参,则它实际上定义了转化为此类类型的隐式转换,我们把这种构造函数称作转换构造函数(converting constructor)。举一个栗子class A{public: A(string _str):str(_str){} //这个只接受一个参数的构造函数就是转换构造函数 void Show() {原创 2017-10-23 22:08:26 · 513 阅读 · 0 评论