C++
文章平均质量分 78
花花...
追自己的光
展开
-
C++ Primer第五版之(十三)模板与泛型编程
函数模板template <typename T>int compare(const T &v1, const T&v2);<>中是模板参数列表,函数中适用的一个或多个模板参数。①当调用函数模板时,编绎器用函数实参推断模板实参。②使用模板实参创建模板的实例,实例化模板。③模板参数可用来指定返回类型或函数的参数类型,可用于函数体内变量声明或类型转换。类型参数前必须使用关键字class或typename。非类型参数,例unsigned N。原创 2020-12-29 16:05:40 · 436 阅读 · 2 评论 -
C++ Primer第五版之(十二)面向对象程序设计
核心思想是数据抽象、继承和动态绑定。虚函数派生类可重载基类虚函数,可不重载,重载基类虚函数时,在函数形参列表后增加一个override关键字。任何构造函数之外的非静态函数都可以是虚函数。virtual只能出现在类内部的声明语句之前,不能用于类外部的函数定义。基类的虚函数,在派生类中隐式地也是虚函数。动态绑定在C++中,当使用基类的引用或指针调用一个虚函数发生动态绑定,调用可能执行基类的版本,也可能执行派生类的版本。定义基类作为继承关系中根节点的类通常会定义一个虚析构函数。访问原创 2020-11-22 22:27:35 · 167 阅读 · 1 评论 -
C++ Primer第五版总结之左值、右值
一、左值和右值C++中对象被用作右值时用的是对象的值(内容),对象被用作左值时,用的是对象的身份(在内存中的位置)。需要右值的地方可以用左值代替,但不能把右值当左值使用。当左值被当右值使用时,实际使用的是它的内容(值)。使用关键字decltype,如果表达式(不是变量)求值结果是左值,得到一个引用类型。①,赋值运算符需要一个(非常量)左值作为左侧运算对象,得到的结果也是一个左值。②,内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是原创 2020-11-16 15:48:02 · 355 阅读 · 0 评论 -
C++ Primer第五版总结之auto、decltype
一、auto类型说明符auto让编绎器通过初始值来推算变量的类型,因此auto定义的变量必须有初始值。引用其实是使用引用的对象,真正参与初始化的是引用对象的值。此时编绎器以引用对象的数据类型作为auto的类型,不可返回引用类型。auto一般会忽略掉顶层const,保留底层const。(结合上面const限定符即保留指针的底层const)二、decltype类型指示符编绎器分析表达式并得到它的类型,但不实际计算表达式的值。如果表达式是一个变量,返回该变量类型(包括顶层con原创 2020-11-16 15:40:47 · 201 阅读 · 0 评论 -
C++ Primer第五版之(十一)重载运算与类型转换
重载运算与类型转换重载运算符函数的参数数量与运算符作用的运算对象数量一样,二元运算符,左侧运算对象传递第一个参数,右侧运算对象传递第二个参数。除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认参数。如果运算符函数是成员函数,则它的左侧第一个运算对象为隐式的this指针,成员运算符函数的显式参数数量比运算符的运算对象总数少一个。可将运算符作用于类型正确的实参以运算符形式间接调用重载的运算符,也可像普通函数调用直接调用运算符函数。重载的运算符,优先级和结合律与对应的内置运算符原创 2020-10-29 16:45:27 · 226 阅读 · 0 评论 -
C++ Primer第五版之(十)拷贝控制
拷贝控制拷贝构造函数如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。如果类没有定义拷贝构造函数,编绎器会自动合成一个拷贝构造函数,与合成默认构造函数不同,即使定义了其他构造函数,编绎器也会合成一个拷贝构造函数。每个成员的类型决定了如何拷贝:类类型的成员使用其拷贝构造函数来拷贝,内置类型的成员直接拷贝,数组类型会逐元素拷贝数组元素,如果数组元素是类类型,使用元素拷贝构造函数拷贝。直接初始化与拷贝初始化之间的差异:当使用()直接初始化时,要求的编绎原创 2020-10-29 14:09:18 · 2303 阅读 · 0 评论 -
C++ Primer第五版之(九)动态内存
动态内存静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量,栈内存用来保存定义在函数内非static对象。分配在静态或栈内存中的对象由编绎器自动创建和销毁,栈对象仅在其定义的程序块运行时才存在,static对象在使用之前分配,在程序结束时销毁。程序用堆来存储动态分配对象,动态对象的生存期由程序来控制。动态内存和智能指针新标准库提供两种智能指针类型管理动态对象,自动释放所指向的对象,shared_ptr允许多个指针指向同一个对象,unique_ptr则独占所指向的原创 2020-10-22 15:33:47 · 215 阅读 · 0 评论 -
C++ Primer第五版之(八)关联容器
关联容器关联容器支持高效的关键字查找和访问,两个主要关联容器map和set,map中元素是key-value对,关键字起到索引的作用,值表示与索引相关联的数据,set中每个元素只包含一个关键字。标准库提供8个关联容器,体现在三个维度:1,或者是一个set,或者是一个map,map、set有序关键字不可重复2,或者要求不重复关键字,或者允许重复关键字,multimap、multiset有序关键字可重复3,按顺序保存或无序保存,unordered_map、unordered_set无序关键字不可重复,原创 2020-10-21 14:56:06 · 254 阅读 · 0 评论 -
C++ Primer第五版之(七)泛型算法
泛型算法实现一些经典算法的公共接口,且可以用于不同类型元素和多种容器类型(标准库类型、内置数组类型),算法不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来进行操作,运行于迭代器之上,执行迭代器的操作。只读算法find、accumulate、equal写操作fill、fill_n拷贝操作copyreplace、replace_copy重排容器元素算法sort、unique、stable_sort、elimDupsfind_if、for_each、make_plural操作两个序列,一些原创 2020-10-20 17:06:06 · 202 阅读 · 0 评论 -
C++ Primer第五版之(六)顺序容器
顺序容器vector,可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素速度慢deque,双端队列,支持快速随机访问,在头尾位置插入、删除速度很快list,双向链表,只支持双向顺序访问,在任何位置插入、删除操作速度都很快forward_list,单向链表,只支持单向顺序访问,在任何位置插入删除都很快array,固定大小数组,支持快速随机访问,不能添加或删除元素string,与vector相似的容器,专用于保存字符,随机访问快,尾部插入删除速度快string和vector将元素保存在原创 2020-08-19 14:36:24 · 341 阅读 · 0 评论 -
C++ Primer第五版之(五)类
类编绎器先编绎成员的声明,再编绎成员函数。二、const成员函数默认情况下,this的类型是指向类类型非常量的常量指针,this是隐式的并且不会出现在参数列表中,C++允许把const关键字放在成员函数的参数列表之后,表示this是一个指向常量的指针,这样的const成员函数被称作常量成员函数。常量对象、以及常量对象的引用或指针都只能调用常量成员函数。三、构造函数构造函数任务是初始化类对象的数据成员,与类同名没有返回类型且不能声明成const,当创建类的const对象时,直到构造函原创 2020-08-11 17:28:41 · 244 阅读 · 0 评论 -
C++ Primer第五版之(四)函数
一、自动对象形参是一种自动对象。二、参数传递如果形参是引用类型,它将绑定到对应的实参上,否则将实参的值拷贝赋给形参。建议使用引用类型的形参替代指针,使用引用避免拷贝,当函数无须改变引用形参的值时最好将其声明为常量引用,引用形参可以适用返回多个结果情况。当用实参初始化形参时会忽略顶层const,当形参有顶层const时,常量对象或非常量对象实参均可,因忽略顶层const,则相同名字函数仅形参列表const不同时不可。三、数组形参数组的两个特殊性质,不允许拷贝数组,使用数组名时会将其转换原创 2020-08-11 11:16:21 · 182 阅读 · 0 评论 -
C++ Primer第五版之(三)表达式、语句
一、左值和右值C++中当一个对象被用作右值时用的是对象的值(内容),当对象被用作左值时,用的是对象的身份(在内存中的位置)。需要右值的地方可以用左值代替,但不能把右值当左值使用,当左值被当右值使用时,实际使用的是它的内容(值)。使用关键字decltype,如果表达式(不是变量)求值结果是左值,得到一个引用类型。①,赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果也是一个左值。②,内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是原创 2020-08-11 10:52:41 · 176 阅读 · 0 评论 -
C++ Primer第五版之(二)字符串、向量、数组
一、标准库string表示可变长字符序列,定义在命名空间std中,初始化时使用=执行拷贝初始化,不使用=执行直接初始化,所能执行操作如下:os<<s;将s写到输出流os当中,返回osis>>s;从is 中读取字符串赋给s,字符串以空白分隔,返回isgetline(is, s);从is中读取一行赋给s,返回iss.empty();s为空返回true,否则返回falses.size();返回s中字符的个数s[n];返回s中第n个字符的引用,位置n从0计起s1+s2;返原创 2020-08-11 10:22:24 · 196 阅读 · 0 评论 -
C++ Primer第五版之(一)基础
一、文件包含确保头文件多次包含仍能安全工作的常用技术是预处理器,使用头文件保护符,头文件不应包含using声明二、输入 输出流操纵符endl结束当前行,并将与设备关联的缓冲区内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入到输出流,而不是公停留在内存中等待写入流。三、初始值初始化和赋值是两个不同的操作,初始化是创建变量时赋予一个初始值,赋值是把对象当前值擦除,以新值替代。C++11新标准下使用{ }花括号进行列表初始化,用()括号初始化实际上是调用构造函数初始化。原创 2020-08-10 17:28:06 · 179 阅读 · 0 评论 -
C++深入理解指针
1,NULL表示特殊指针,((void*)0),NUL是一个char,定义为\02,资源获取即初始化 (Resource Acquisition Is Initialization, RAII)GNU编绎器提供了非标准的扩展来支持这个特性,通过演示如何在一个函数中分配内存然后释放可以说明这种扩展。一旦变量超出作用域会自动触发释放过程。3,GNU的扩展要用到RAII_VARIABLE宏,它声明...原创 2020-02-22 17:09:15 · 189 阅读 · 0 评论