C++ 基础
阿七秃了
hello world
展开
-
C++ Primer 第3章 3.4 迭代器介绍 总结和答案
仅供参考,欢迎交流和指正 power by Qi1.string对象和vector对象都支持迭代器,所有的标准库容器都支持迭代器,但是只有少数几种支持下标运算符2. 迭代器和指针一样都支持对容器或者string中的字符的间接访问3.在容器中最常用的迭代器是 begin()和end(),begin()指向容器的第一个元素的位置,end()指向容器最后一个元素的下一个位置,如果同期为空则,beg...原创 2020-01-08 20:24:48 · 235 阅读 · 0 评论 -
C++ Primer 第三章 3.3 标准库类型 vector
仅供参考,欢迎交流和指正 power by Qi1.vector表示对象的集合,因为其可以容纳对象,所以又被称为容器(container)2.vector是一个类模板,需要指定类型实例化进行实例化。模板分为类模板和函数模板,模板本身不是函数或者类,模板可以看作是编译器生成类或者函数的说明。即:模板是一个类或者函数的通用规则,但不是还没有涉及到具体的类型。换种思路想就是:模板是一个骨架,具体...原创 2020-01-06 22:18:27 · 143 阅读 · 0 评论 -
C++ Primer 3.2 习题
仅供参考,欢迎交流和指正 power by DaQiZi习题3.6string a = "kuailefengnan";for (auto &item:a) {item = 'X';}cout << a << endl;3.7字符串不会发生改变,使用char item相当于将a在当前位置的值赋值给item,所以其值不会改变3 3.8for循环...原创 2020-01-03 21:05:04 · 174 阅读 · 0 评论 -
C++Primer 第2章 变量和基本类型
第二章2.1 基本类型C++的基本类型分为空类型和算术类型,空类型就是void,算术类型就是整型,字符型,浮点型,布尔型char分为,unsigned char,signed char和char,其中char是有符号还是无符号取决于编译器对于无符号类型,如果赋值超过了其表示范围,则结果为该无符号类型所能表示的数值个数%赋值的数。unsigned char c = -1;//256%...原创 2020-04-09 09:27:44 · 258 阅读 · 0 评论 -
第18章 用于大型程序的工具 18.3 多重继承和虚继承
多重继承实在是一个折磨人的东西。。。18.3 多重继承和虚继承18.3.1 多重继承派生类的派生类表可以继承多个类,默认的继承方式和单继承是一样的,即class类默认使用private,struct默认使用public。派生类构造函数初始化所有基类的时候,我们一般会在初始化列表中调用基类的构造函数。一个多重继承的派生类其构造顺序是按照派生列表中声明的顺序进行的。对于多重继承,一个相同的基...原创 2020-03-24 22:59:53 · 188 阅读 · 0 评论 -
第18章 用于大型程序的工具 18.2命名空间
18.2 命名空间命名空间可以有效的防止变量名重复,命名空间就是一个作用域,可以在命名空间中定义命名空间,但是不能在类和函数中定义。18.2.1 命名空间定义使用这种方法来定义命名空间namespace xxx{}命名空间都是一个作用域,所以和作用域中的变量是一样的,变量名字不能重复。和作用域不一样的是,命名空间可以不是连续的。我们定义一个命名空间,如果之前没有这个空间,则创建这个...原创 2020-03-23 18:55:17 · 143 阅读 · 0 评论 -
C++ Primer 第十六章 16.1定义模板
16.1.1 定义函数模板使用template+模板参数列表来定义一个函数模板。template<typename T>bool compare(const T&a,const T&b){ return a<b;}compare(1,1);在具体调用时,会根据传入的实参类型,将函数模板中的模板参数替换掉,转换为一个具体的函数实例。 这个过程叫做实...原创 2020-03-04 20:10:54 · 184 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.9
15.31位取反,位与,位或的优先级分别时~ > & > |所以a,最终创建一个OrQueryb,最终创建一个OrQueryc,最终创建一个OrQuey15.32Query对象被拷贝q的引用计数+1被赋值,原来指向的对象引用计数-1,赋值语句左边的对象引用计数+1,如果左侧对象引用计数为0则调用析构销毁对象回收的内存。被移动,q引用计数变为传入左值的引用计...原创 2020-03-03 00:09:28 · 328 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.8 容器和继承 练习和总结
15.8 容器和继承在容器中管理继承体系的类时,如果需要多个子类都调用某一个操作,往往保留的是基类的指针,这做会更加的灵活。练习15.8 15.29 vector<shared_ptr<Quote>> vec; /*vec.push_back(make_shared<Bulk_quote>("123", 20, 10, 0.9)); vec.push...原创 2020-03-02 18:38:59 · 161 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.7 构造函数和拷贝控制 练习和总结
15.7 构造函数和拷贝控制15.7.2 虚析构函数在继承体系中,基类的指针,引用可以绑定派生类的对象,使用指针时,我们使用delete来回收这个指针所管理的对象。但是在继承体系中,这个指针可能指向的是其子类的对象,为了正确的调用子类的析构函数,应该将基类的析构函数声明为虚析构函数。只要基类的析构函数为虚析构函数,那么其子类的析构函数(编译器合成的或者自己定义的)也默认是析构函数。注意,一...原创 2020-03-02 15:43:01 · 245 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.6 继承中的类作用域 练习和总结
15.2 继承中的类作用域每一个类都有自己的作用域,派生类的作用域在基类的作用域中。从派生类的对象访问某一个成员如果在派生类中没有找到该名字,则从直接基类中查找,一直往继承链的上面找,如果一直没有找到则报错。对于名字查找,这依赖于变量(普通变量,指针或者引用)的静态类型,即:变量的静态类型决定了这个变量只能访问哪些成员。这就很好理解为什么用基类的引用或者指针只能访问基类的成员(虚函数除外),另...原创 2020-03-01 21:53:43 · 163 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.5访问控制与继承 练习和总结
15.5 访问控制和继承在继承体系中,有两个地方需要用到访问限定符,第一个地方是类中 ,protected修饰的成员可以在派生类中直接访问,但是不能在用户代码中直接访问。在派生类中我们只能通过派生类对象来访问基类的protected数据成员,不能通过基类变量访问基类的protected数据成员。class A {public: int pub_value;protected: int...原创 2020-03-01 18:37:50 · 219 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.3 虚函数 15.4抽象基类 练习和总结
15.3 虚函数只有在基类的指针或者引用访问虚函数的时候才会发生动态绑定。 如果由一个基类或者一个派生的对象直接访问虚函数则访问的就是其自己定义的那个函数,不会发生动态绑定。此时如果想访问基类的函数则需要使用作用域运算符来访问。重写虚函数时,返回值类型和参数列表中的参数需要完全一样,否则派生类重写的函数实际是定义了一个新的函数,为了防止开发人员误操作,C++提供了override函数,显式的表...原创 2020-02-29 13:56:30 · 188 阅读 · 0 评论 -
C++ Primer 第十五章 面向对象程序设计 15.2 定义基类和派生类 练习和总结
15.2 定义基类和派生类15.2.1 定义基类练习15.1使用virtual关键字修饰的函数时虚函数15.2用protected修饰的成员,使用类的用户不能直接访问,但是继承该类的派生类可以访问。使用private修饰的成员,使用这个类的用户不能直接访问,继承该类的派生类也不可以直接访问。15.3class Quote{public: Quote()=default; ...原创 2020-02-28 21:20:06 · 546 阅读 · 0 评论 -
C++ Primer 第十四章操作重载与类型转换 14.9 重载、类型转换与运算符 练习和总结
14.9 重载、类类型转换与运算符在学习构造函数的时候,我们知道如果构造函数只有一个形参或者只有一个形参没有默认值,那么可以通过隐式转换,将该形参类型转化为类类型。同样,我们也可以将类类型转化为其他的类型,虽然C++提供了这样的操作,但是我们应当尽量避免使用类型转换运算符,因为使用类型转换运算符可能会造成很多潜在的风险,比如各种二义性,以及如果二者的转换规则不明显可能会造成代码可读性非常差。...原创 2020-02-28 13:29:24 · 182 阅读 · 0 评论 -
C++ Primer 第十四章操作重载与类型转换 14.8 函数调用运算符 练习和总结
14.8 函数调用运算符重载了函数调用运算符的类,它的对象可以做出像函数 一样的行为,因此我们称这样的对象为函数对象。相对于普通的函数,函数对象可以保存一些状态,这些状态其实就是他的数据成员。这其实就又和lambda表达式一样了,lambda表达式其实就是一个类的对象。练习14.33零个,一个,多个都可以,而且参数可以有默认值14.34struct IfThenElse{ i...原创 2020-02-28 11:55:15 · 347 阅读 · 1 评论 -
C++ Primer 第十四章操作重载与类型转换 14.1~14.7 练习和总结
第14章的内容过一遍就可以了,通过重载运算符实现的方法,定义函数也可以实现。重载运算符类型建议定义在哪里返回值类型参数类型注意事项<<非成员ostram&ostream&,const CLS&>>非成员istream&istream&,CLS&需要考虑输入流错误的情况,一般将对...原创 2020-02-28 00:55:03 · 331 阅读 · 0 评论 -
C++ Primer 第十三章 13.6 对象移动 练习和总结
13.6 对象移动练习13.45一句话:左值引用可以绑定左值,const 左值引用和右值引用可以绑定右值。左值引用可以绑定返回值类型为引用的函数、赋值、下标、解引用、前置递减递增运算符等返回左值的表达式的结果上。const类型的左值引用和右值引用可以绑定在返回非引用类型的函数、算术、关系、位、后置递增递减等返回右值的表达式的结果上。13.46int &&r1 = f...原创 2020-02-26 21:56:28 · 300 阅读 · 0 评论 -
C++ Primer 第十三章 13.5 动态内存管理类 练习和总结
13.5 动态内存管理类类中管理动态的内存最好的方法是使用容器或者使用智能指针,但是可能如果我们自己要设计一套库,那么就需要让这个库的性能处于一个较好的水平。这个时候我们可能需要使用一些较为低层的管理内存的函数。像vector这样的容器如果push的时候空间不足,贼会开辟新的空间,此时需要将原来的元素都拷贝到新的空间中去。所以这里会调用拷贝构造函数,调用拷贝构造函数意味着需要消耗性能,那么有...原创 2020-02-26 13:41:19 · 340 阅读 · 0 评论 -
C++ Primer 第十三章 13.4 拷贝控制示例 练习和总结
13.4 拷贝控制示例练习13.33因为如果形参类型是const Folder&,那边形参是一个常量。那么folders的类型必须是常量指针。那么调用的Folder的AddMsg和remMsg就必须是常量函数。而这两个函数肯定会修改Folder中数据成员的值,因此不能被设置为常量函数。所以只能讲save和remove的形参定义为非const类型。13.34class Me...原创 2020-02-25 19:55:33 · 568 阅读 · 0 评论 -
C++ Primer 第十三章 13.3 交换操作 练习和总结
13.3 交换操作对于管理资源的类(我的理解是数据成员有动态分配的内存的类),一般需要定义一个swap函数。默认的swap是这样的:A temp = v1;v1=v2;v2=temp;代码会创建一个临时变量,并且使用两次赋值语句。想一下,如果一个对象中有一个指针指向了一个占用内存非常大的对象。这样创建临时变量是比较消耗性能的。**所以不创建临时变量,而是只交换两个对象内部的数据。...原创 2020-02-25 17:01:26 · 1729 阅读 · 1 评论 -
C++ Primer 第十三章 13.2 拷贝控制和资源管理 练习和总结
13.2拷贝控制和资源管理练习13.22这个练习是错误的示范,正确的示范在练习13.23中class HasPtr {public: HasPtr(const std::string& s = std::string()) :ps(new std::string()), i(0) {}; HasPtr(const HasPtr& hasptr) :ps(new str...原创 2020-02-24 22:51:42 · 244 阅读 · 0 评论 -
C++ Primer 第十三章 13.1 拷贝赋值和销毁 练习和总结
定义一个类我们需要显式或者隐式的指定这个类在拷贝,赋值,移动,销毁时需要做什么,我们需要定义拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符和析构函数来控制这些操作。拷贝和移动构造函数定义了一个对象初始化本对象时,需要做什么。拷贝和移动赋值运算符则决定了将 一个对象赋值给同类型的另一个对象时需要做什么。析构函数定义了销毁对象时需要做什么。这些5个成员函数被称为拷贝控制操作。1...原创 2020-02-24 20:18:16 · 256 阅读 · 0 评论 -
C++ Primer 第十二章 12.3 使用标准库:文本查询程序 练习
练习12.27这个程序已经可以完成论文所作的功能了class QueryResult { //懒得重复写,所以使用类型别名 using str_vec_ptr = std::shared_ptr<vector<string>>; using str_set_map_ptr = std::shared_ptr<map<string, set<s...原创 2020-02-20 21:13:11 · 201 阅读 · 0 评论 -
C++ Primer 第十二章 12.2 动态数组 练习和总结
12.2动态数组之前学到new和delete是可以创建/删除一个对象的,但是我们有时候需要创建一组对象和删除一组对象。现在我们可以使用容器来这么做,vector,list,不过new和delete也提供了创建/删除一组对象的操作。创建动态数组使用new创建动态数组我们可以使用如下的方式用new创建动态数组。int* p = new int[10];using TenArr = int[...原创 2020-02-20 18:45:39 · 277 阅读 · 1 评论 -
C++ Primer 第十二章 12.1 动态内存与智能指针 练习和总结
前文之前我们只学习过静态内存和栈内存。现在还有一个堆内存,他们保存的变量类型分别为内存名字该内存中保存的类型静态内存static局部变量、类的static数据成员、定义在函数体之外的变量栈内存函数体中的所有非static变量堆内存动态分配内存空间的变量12.1动态内存和智能指针我们可以使用new关键字动态的分配内存空间,并返回指向该对象的指针,我们...原创 2020-02-20 13:44:24 · 411 阅读 · 0 评论 -
C++ Primer 第十一章 11.4 无序容器 练习和总结
11.4无序容器C++11新增了4中容器,他们是无序关联容器,因为他们组织元素不靠比较运算符,而是使用一个哈希函数和==运算符,这些容器组织的元素没有明显的顺序,所以他们是无序关联容器。有序的关联容器,在某个时候维护序需要较大的代价,如果我们并不会利用元素的序,那么可以使用无序关联容器。因为无序关联容器也有multi版本,因此大部分情况下,有序关联容器和有序关联容器都是可以互换着使用的。无...原创 2020-02-18 20:27:15 · 216 阅读 · 0 评论 -
C++ Primer 第十一章 11.3 关联容器操作 练习和总结
11.3 关联容器操作关联容器定义的额外的类型。注意map的value_type是一个pair类型,而且pair的first成员是const类型,这是因为我们从map中得到的pair返回的是引用,这意味着我们可以修改pair中的数据成员,而first成员是map容器的关键字,关键字是不允许改变的,为了防止我们修改了关键字,所以将first设置为const。mapped_type表示的是ma...原创 2020-02-18 19:31:50 · 369 阅读 · 0 评论 -
C++ Primer 第十一章 11.2 关联容器容器概述 练习和总结
11.2 关联容器概述关联容器支持容器的通用操作,比如size_type这种类型,insert,erase,clear操作,以及值初始化等等。这些都在9.2节里面。11.2.1 定义关联容器定义map需要指定关键字和值的类型。定义set,需要指定关键字的类型。在进行初始化时,1.可以使用同类型的容器进行拷贝2.也可以使用迭代器范围,只要迭代器内的元素可以转化为map的值的类型或者s...原创 2020-02-18 11:12:18 · 238 阅读 · 0 评论 -
C++ Primer 第十一章 11.1 使用关联容器 练习和总结
11.1 使用关联容器相对于顺序容器,关联容器通过关键字来访问存储在容器中的元素。关联容器有8个。他们都是有不同属性的map和setmuti表示容器可以存储重复元素。unordered表示存储没有顺序按照关键字有序的容器,头文件在<map><set>中。无序的在<unorder_map><unorder_set>中。mapmap是关键...原创 2020-02-17 16:34:45 · 256 阅读 · 0 评论 -
C++ Primer 第十章 10.5~10.6 泛型算法结构 练习和总结
10.5 泛型算法结构泛型算法是在迭代器上进行操作的,所以每一个算法都需要迭代器提供它所需的操作,按照可读,可写,递增,递减等迭代器操作,算法对迭代器的操作要求可以分为5个类别。迭代器名字支持的操作输入迭代器只读、不写、单遍扫描、只能递增输出迭代器只写不读、单遍扫描,只能递增前向迭代器可读可写;多遍扫描;只能递增双向迭代器可读可写;多遍扫描;可递增...原创 2020-02-17 11:48:14 · 277 阅读 · 0 评论 -
C++ Primer 第十章 10.4 再探迭代器 练习和总结
10.4 再探迭代器标准库的头文件iterator,除了定义了容器的迭代器之外,还定义了一些额外的迭代器。插入迭代器 insert iterator流迭代器 stream ierator反向迭代器 reverse iterator移动迭代器接下来总结每个迭代器具体是做什么的10.4.1插入迭代器插入迭代器是一种迭代器适配器,其接受一个容器,生成一个迭代器,对该迭代器赋值时,这...原创 2020-02-14 19:39:34 · 310 阅读 · 0 评论 -
C++ Primer 第十章 10.3 定制操作 练习和总结
10.2 定制操作我们在使用泛型算法时,泛型算法会调用序列中元素的运算符,但是有时这些类型并不支持某些运算符,或者说我们没有为这个类型,定义该运算符。这时我们可以通过定制操作,来完成代替这些运算符完成某些操作。比如sort()支持传入一个谓词,这个谓词用来代替<运算符来比较元素大小。谓词根据需要的参数数量,分为一元谓词和二元谓词。谓词需要满足的条件,将在以后有介绍,现在就我的理解来...原创 2020-02-13 17:38:06 · 212 阅读 · 0 评论 -
C++ Primer 第十章 10.2 初识泛型算法 练习和总结
10.2 初识泛型算法C++标准库提供的算法有100多个,一下子记不住这么多,我们可以辅助记忆。大部分的算法接收两个参数表示可以操作的范围,这个范围叫做输入范围。(其实我觉得也可以叫做迭代器范围)泛型算法根据对元素的操纵方式分为是否读取元素、改变元素、或是否重排元素。根据这些可以对算法进行大致划分。10.2.1 只读算法accumulate算法accumulate(iter1,it...原创 2020-02-13 13:08:43 · 218 阅读 · 0 评论 -
C++ Primer 第十章 10.1 泛型算法概述 练习和总结
10.1泛型算法概述C++标准库为容器提供的操作只有最基本的增加和删除和修改,但是我们往往需要对容器中的元素进行搜索、排序等操作。C++没有为每个容器都单独定义这些操作,而是定义一系列的泛型算法。所谓的泛型算法就是,算法的执行不依赖于具体的容器,这套操作是通用的。泛型算法定义在algorithm和numeric头文件中,其中numeric文件定义的都是和数值相关的算法。泛型算法往往需要传...原创 2020-02-12 17:14:27 · 213 阅读 · 0 评论 -
C++ Primer 第九章 9.6 容器适配器 练习和总结
9.6 容器适配器适配器是标准库的一个通用概念,表示使得一种类型看起来像另一种类型。一个容器适配器接收一个已有的容器类型。标准库定义的三个容器适配器。stack,queue,priority_queue.他们都是在某个顺序容器的基础上实现的。它们支持的通用操作为。其中A a©;需要记住以下,c是A的低层实现容器的对象,也就是说可以使用底层容器的对象来初始化容器适配器。//可以 低层...原创 2020-02-12 16:20:35 · 357 阅读 · 0 评论 -
C++ Primer 第九章 9.5 额外的string操作 练习和总结
9.5 额外的string操作string提供了非常多的函数供我们使用,其中大部分函数都和C风格字符串,字符数据,以及使用下标代替迭代器有关。9.5.1 构造string的其他方法除了之前的初始化方式,string还可以使用字符数组以及使用字符串并指定字符串的范围进行初始化。注意,字符数组初始化给定计数值,因为在字符数组中,默认是没有结束符的。对于使用字符串进行初始化,并指定范围。s...原创 2020-02-10 18:35:43 · 225 阅读 · 0 评论 -
C++ Primer 第九章 9.4 Vector对象是如何增长的 练习和总结
9.4 Vector对象是如何增长的vector对象为了支持快速随机访问,其物理存储方式是连续存储的,又因为vector是动态大小的,所以这就涉及到了一个问题。如果当前的vector容器分配的存储空间空间已经满了,不能再添加新的元素,那么就需要重新分配一块内存空间,将原来的值复制过去并添加新的元素。但是如果每次添加都重新分配内存空间的话,vector的效率会非常的低。所以为了避免这种低效的...原创 2020-02-10 13:05:58 · 244 阅读 · 0 评论 -
C++ Primer 第九章 9.3 顺序容器的操作 练习和总结
9.3 顺序容器的操作如题,这一章讲的全是顺序容器如何操作。9.3.1 向顺序容器中添加元素顺序容器添加元素的操作如下:因为array的大小是固定了,所以这些操作是和array无关的。需要注意的点:1.如果容器有push_back,push_front这样的函数,表示这个容器在头部或者尾部添加元素时,效率较高。比如vector有push_back,所以在尾部添加元素效率很高,但是如果...原创 2020-02-08 21:20:42 · 494 阅读 · 0 评论 -
C++ Primer 第九章 9.2 容器库概览 练习和总结
9.2 容器库概览容器库的操作分为通用的,顺序容器(大部分)通用的,关联容器(大部分)通用的,以及容器特有的操作。对于容器的通用操作,如表所示:可以看到容器的通用操作大部分是和迭代器有关的。有几个可能会被忘记的点是:1.可以使用迭代器表示一个范围来初始化容器2.可以使用swap来交换两个容器的元素同样,我觉得这些东西不需要死记,在需要用到的时候再查也不迟。练习9.2list...原创 2020-02-07 22:56:25 · 222 阅读 · 0 评论