![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++
学习C++ Primer plus有好一段时间了,但在学习完后没有将具体的知识点提炼出来。本专栏记录学习C++的过程并对每章节的知识点总结。方便以后的复盘。
心不在于身
爱code
展开
-
C++unique_ptr小结
通常情况下, unique_ptr的大小和裸指针的大小一样, 但是当指定了删除器之后, unique_ptr的指针的大小会随之而改变,所以对于unique_ptr来说, 指定了删除器可能会导致效率下降。原创 2023-08-13 13:00:53 · 205 阅读 · 0 评论 -
C++ unique_ptr概述 常用操作
uniue_ptr是一个独占式的指针,同一个时刻, 就只能有一个unique_ptr指向这个对象(内存),unique_ptr的使用格式unique_ptr的常规初始化:创建一个空的智能指针make_unique函数make_unique函数是在C++14中引入的,使用了make_unique函数之后不能指定删除器, 如果不需要使用删除器, 尽量使用make_unique函数,他的效率高。原创 2023-08-13 11:34:46 · 302 阅读 · 0 评论 -
C++ shared_ptr使用场景和陷阱
在这里a_1和a_2分别引用计数, 没有关联, 会造成同一个对象被释放两次,使得程序崩溃.要这样做, 就必须要让两个对象关联起来, 所以介绍一种可行的方法.enable_shared_from_this(c++标准库里面的类模板)在这里a_1指向了A类对象, a_2指向了B类对象, 在他们内部的指针又互相指向对方,这样便造成了循环依赖, 在对象过期的时候, 这里的计数从2变成了1, 没有变成零, 所以导致内存泄漏.将一个裸指针指向的对象交给智能指针托管之后,避免裸指针后续的使用,否则会导致不可预料的结果。原创 2023-08-08 17:34:16 · 313 阅读 · 0 评论 -
C++智能指针weak_ptr
weak_ptr概述weak_ptr辅助shared_ptr进行工作,weak_ptr是弱引用的意思(强引用是shared_ptr), weak_ptr同shared_ptr一样都是类模板和智能指针,weak_ptr对资源的引用是非拥有式的,weak_ptr没有资源的管理权限,不能控制资源的释放,它常被用来检查资源.weak_ptr的创建弱引用常常用shared_ptr来初始化.原创 2023-08-06 11:41:28 · 139 阅读 · 0 评论 -
C++ 智能指针shared_ptr
在介绍智能指针前先看如下代码str = * ps;return;str = * ps;delete ps;return;原创 2023-08-06 08:47:11 · 482 阅读 · 0 评论 -
C++ 可变参数模板
参数包的展开:展开参数包,一般都采用递归函数, 所以在我们代码的编写过程中,需要有一个参数展开包的函数,和一个同名的递归终止函数, 可以通过这两个函数将参数包展开。一般对于可变参函数模板,都写一个参数,和一包参数,这样方便参数包的展开。对于可变参数模板我们一般把a称作一包,或者一堆参数,并且这些参数可以完全不同,对于T不能把它看作为具体的类型,要理解为0到多个不同的类型,那么a就是多个不同的参数。可变参数模板:允许模板中有0个到任意个模板参数,在语法上和传统模板不一样,多了一个...原创 2023-08-02 17:50:35 · 346 阅读 · 0 评论 -
C++ 模板全特化, 偏特化(局部特化)
对于模板的特化, 需要先有泛化的版本才可以,下面是一些例子在有泛化的版本Print之下, 才能出现特化的版本,常规全特化是指,所有模板的参数都要用具体的类型代表。原创 2023-08-02 15:38:02 · 220 阅读 · 0 评论 -
c++ using定义类型别名
using在用于定义类型, (定义类型模板)的时候, 包含了typedef的所有用法, 下面来看一些使用using定义类型别名的例子。在using中使用这种模板,既不是类模板, 也不是函数模板, 我们可以看成一种新的模板类型, 类型模板(别名)在未引入using之前定义类型的别名通常用typedef, 下面是一些typedef定义类型别名的用法。如何在map中保持前面部分不变, 后面是用户自定义的类型呢?1, 定义一个自定义函数参数类型和返回类型的函数指针模板。以下是一些使用using定义类型别名的练习。原创 2023-08-02 12:00:32 · 259 阅读 · 0 评论 -
c++ 显示实例化
现在将模板类A封装到头文件test.h中// test.h 头文件class Apublic:现在创建了test_1, test_2的cpp文件在这两个cpp文件中都有使用模板A, 当编译器遇见这些语句都会实例化一个A<float>, 如果当文件中定义了很多这种代码. 这会造成生成多个实例化的开销.为了避免这种开销,可以使用显示实例化.在test_1顶部包含这条语句// 显示实例化中的实例化定义, 这种实例化定义只需要在一个cpp文件中写就行。原创 2023-08-02 09:07:11 · 197 阅读 · 0 评论 -
C++ 依赖类型 函数指针
依赖类型是指在模板编程中,类型依赖于模板参数的一种特殊类型, 它是通过使用模板参数来定义的, 而不是显示地指定类型。由于模板参数可以是任何类型,编译器在实例化模板时无法确定依赖类型的具体定义和属性。当使用依赖类型的时候需要使用typename关键字来告诉编译器该名称是一个类型。这是因为编译器默认将依赖名称解析为一个静态成员或静态成员函数。而不是一个类型。原创 2023-08-02 07:36:05 · 153 阅读 · 0 评论 -
C++ 可调用对象与function模板
可调用对象是指可以像函数一样被调用的实体,C++中常见的可调用对象如下1,函数指针2,函数对象, 函数对象是一个类对象,它重载了函数调用运算符operator(), 使得对象可以像函数一样被调用。原创 2023-08-01 19:12:47 · 210 阅读 · 0 评论 -
C++ 模板
以两个数的加法为例子T temp;函数模板在调用的时候, 编译器会根据你传入的实际类型推断模板参数类型, 这个过程是在编译期间完成的.当编译器无法推断出实际类型, 需要我们手动的传入类型.当使用具体类型传入参数的时候, 函数模板会生成这个类型特定的函数int temp;template<typename 形参名1, typename 形参名2>class ....在类模板里面, 成员函数要以template<typaname T>开头,下面是示例private:T x;原创 2023-08-01 11:55:00 · 167 阅读 · 0 评论 -
第十八章 探讨C++新标准
对象移动是将资源的所有权从一个对象转移到另外的一个对象, 而不是进行深拷贝, 来避免不必要的数据复制和内存分配.原创 2023-08-01 01:13:48 · 195 阅读 · 0 评论 -
C++ 临时对象探讨, 性能提高手段
临时对象: 临时对象是指在表达式中创建并在表达式结束后立即销毁的对象.原创 2023-07-31 16:11:39 · 286 阅读 · 0 评论 -
左值 右值 std::move函数
左值是一个内存块的表达,,代表一个地址,可以被取地址,赋值, 常常出现在赋值语句的左边.变量, 数组元素, 结构成员, 引用, 和解除引用都是左值.原创 2023-07-31 12:03:50 · 199 阅读 · 0 评论 -
第十五章 友元 异常和其他
RTTI是运行阶段类型识别,通过运行时类型识别,程序能够使用基类的指针或者引用来检查这些指针或者引用所指向的对象的实际派生类型。原创 2023-07-30 13:40:49 · 150 阅读 · 0 评论 -
第十三章 类继承3
抽象基类是一种特殊的类, 他不能被实例化, 只能被用作其他类的基类, 抽象基类必须包含一个或以上的纯虚函数, 这些函数没有实现(可以被定义), 需要在派生类中进行实现.原创 2023-07-29 19:59:19 · 342 阅读 · 0 评论 -
第十六章 string类和标准模板库
其中container_type是容器名字, iterator是容器提供的迭代器类型, iterator_name是迭代器对象的名称.如定义一个vector容器的迭代器对象。原创 2023-07-29 16:46:02 · 304 阅读 · 0 评论 -
第十三章 类继承2
友元函数不能为虚函数, 因为友元函数不是类成员,而只有类成员才能是虚函数如果派生类函数没有重新定义函数, 则派生类将使用原来函数的基类版本.class Apublic:public:B b;原创 2023-07-24 20:28:27 · 77 阅读 · 0 评论 -
第十三章 类继承1
概念:成员初始化列表是一种在类的构造函数中初始化成员变量的方法。它使用初始化列表来为成员变量赋初值,而不是在构造函数的函数体中进行赋值操作。成员初始化列表快的原因:避免了默认构造函数的调用:如果在构造函数的函数体中对成员变量进行赋值,那么在对象创建时会先调用默认构造函数来初始化成员变量,然后再进行赋值操作。而使用成员初始化列表,可以直接在对象创建时为成员变量赋初值,避免了默认构造函数的调用,从而提高了效率。直接初始化:成员初始化列表允许我们使用直接初始化语法来初始化成员变量。原创 2023-07-24 14:38:36 · 48 阅读 · 0 评论 -
第十二章 类和动态内存分配
需要注意的是,使用new分配的内存可以直接赋值给相应类型的指针,而malloc返回的void指针需要进行类型转换后才能使用。对于重载>>必须返回对象的引用,如果只是返回对象,那么ostream就会调用复制构造函数,但是ostream没有公有的复制构造函数。深拷贝:将一个对象的值复制给另外的一个对象(复制指向的数据),这样一来两个对象是独立的,对一个对象的修改不会影响另外的一个对象。语法:new和delete是C++中的操作符,可以直接使用,而malloc和free是C语言中的函数,需要通过调用来使用。原创 2023-07-23 12:52:34 · 49 阅读 · 0 评论 -
第十一章 使用类
5,赋值运算符,下标运算符,函数运算符,等运算符只能通过成员函数重载。4,不能重载sizeof,成员运算符,作用域运算符等特定的运算符。1,重载后的运算符至少必须有一个操作数是用户定义的类型。2,在使用运算符时不能违反运算符原来的句法规则。使用方法:operator+()重载+运算符;使用构造函数能够将类类型和数据类型进行转换。explicit可以关闭隐式类型转换。定义方式:在类声明时用friend;访问权限与成员函数访问权限相同。3,不能创建新的运算符。原创 2023-07-21 14:19:43 · 54 阅读 · 0 评论 -
第十章 对象和类
静态成员函数不属于任何具体的对象,它属于整个类,所以在静态成员函数里面,不会存在this指针,当然也不可能操作this指针。成员函数则不是,因此成员变量需要存储到对象中,而成员函数则不需要。这就是为什么静态成员函数不能访问非静态成员变量的原因。class与struct的主要区别在于默认的访问权限与继承方式,class中默认访问权限是private,struct中是public.继承方面class默认私有继承,struct公有继承。this指针不属于类的成员,只是成员函数的参数,所以不占用大小。原创 2023-07-17 19:43:37 · 63 阅读 · 0 评论 -
C++ 期末作业 通讯录
【代码】C++ 期末作业 通讯录。原创 2023-07-16 21:24:40 · 58 阅读 · 0 评论 -
第八章 函数探幽 默认参数与函数重载
注意:对于单一的重载,当类型不匹配时会进行类型的转换,从而匹配相应的函数,当有多种选择的时候,编译器将会拒绝选择,并将其视为错误。第一个函数的参数与可修改的左值参数匹配,第二个函数与可修改的左值,cosnt左值参数,和右值参数进行匹配,第三个函数与左值匹配。重载这三个函数结果将如何呢?注意:对于带参数列表的函数,必须从右到左添加默认值。实参按重左到右的的顺序依次被赋给相应的形参,不能跳过任何一个参数。函数重载:函数重载是指在同一个作用域内,可以定义多个同名的函数,但这些函数的参数列表必须不同。原创 2023-07-14 12:44:02 · 46 阅读 · 0 评论 -
第八章 函数探幽 内联函数与引用2
3,为何将const用于返回类型:请注意accumulate(dup, five) = four这条语句,在赋值语句中左边必须是可以修改的左值,也就是说左边必须是一个可以修改的内存快,另一方面,常规(非引用)返回类型是右值——不能通过地址访问的值,这种表达式可以出现在赋值语句的右边,单不能出现在左边,其他右值包括字面值,表达式。因为函数的返回值是一个引用,会成为一个左值,所以能够赋值。在返回引用的时候,不要让其指向一个临时的变量的引用,在函数运行完毕后,临时变量将会被销毁。8.2.6 对象,继承,和引用。原创 2023-07-14 11:13:05 · 43 阅读 · 0 评论 -
第八章 函数探幽 内联函数与引用1
注意:如果函数调用的参数不是左值或与相应的 const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量。引用变量的定义:C++中的引用变量是一种别名。内联函数的定义:C++内联函数是一种在编译时将函数调用替换为函数体的优化技术,它可以减少函数调用的开销。内联函数的使用方法:在函数声明前加上inline,在函数定义前加上inline,(在类中实现的方法将成为内联函数)。生成临时变量的两种情况:实参的类型正确,但不是左值,实参的类型不正确,但可以转换为正确的类型。原创 2023-07-14 08:27:41 · 50 阅读 · 0 评论