primer Day4

用new分配一个const 对象必须要初始化

通常情况下new失败了,会抛出一个bad_alloc的异常 我们可以通过改变使用new的方式来组织他抛出异常  这种形式的new成为定位New

int *p1 = new int ; //如果分配失败  会抛出一个bad_alloc的异常

int *p2 = new (nothrow) int; // 如果分配失败,不会抛出异常,返回一个空指针

接受指针参数的智能指针的构造函数的explicit的,所以不能将一个内置指针隐式转化为一个智能指针 要用直接初始化的形式

share_ptr<int>  p1 = new int(10);//错误 不能隐式转化为智能指针

share_ptr<int> p2(new int(10)) //正确

尽量用make_shared 不用new  若使用get函数的时候,不要对返回的指针进行delete 也不要初始化另一个指针 容易造成double free

share_ptr<T> p(q,d)  p被销毁时,执行d删除器 而不是直接delete

unique_ptr 拥有它指向的对象,因此unique_ptr不支持拷贝和赋值操作 必须采用直接初始化方式

不能拷贝和赋值unique_ptr有个例外,就是拷贝将要被销毁的unique_ptr

unique_ptr也可以重载一个删除器  unique_ptr<T,decltpye(funtion)*> p(&T,funtion)

隐式销毁一个内置指针类型的成员变量不会delete它所指向的对象 比如类离开作用域范围 内置指针类型成员变量隐式销毁 但是指向的对象还可以访问,未删除

构造函数 先初始化成员 再执行函数体 析构函数 先执行函数体 在析构成员   (析构函数本身并不直接销毁成员 成员是在析构函数体之后隐含的析构阶段被销毁的,在

整个对象销毁过程中,析构函数体是作为成员销毁步骤之外的另一部分而进行的)

一个类如果需要析构函数,那么一般都要拷贝赋值和拷贝构造函数,不然用默认的合成构造函数,只是简单的拷贝,比如指针类型的成员,简单的拷贝多次指针,指向

同一个地方,但是对象析构时就会多次析构同一个指针,这个肯定是有问题的。

c11的新标准 我们可以通过将拷贝构造函数,拷贝赋值运算符定义为删除的函数来阻止拷贝

删除的函数是一种函数 我们虽然声明了它,但是不能以任何方式使用它struct Nocopy{ Nocopy()=default;Nocopy(const Nocopy&)=delete;NoCopy&operator =(const Nocopy&)=delete};

当类中有不能销毁拷贝赋值的成员时 类的合成拷贝控制成员就被定义为删除的

将类的拷贝构造函数 拷贝赋值运算符声明为私有的,可以组织用户拷贝这个类型的对象,但是友员和成员函数依然可以拷贝,为了阻止友元和成员函数进行拷贝,我们将

这些拷贝控制成员声明成private的,但不定义他们。

拷贝赋值 :注意两点 1  如果将一个对象赋给自身,赋值运算能够正常工作 2 大多数赋值运算组合了析构函数和拷贝构造函数的工作

当你编写一个赋值运算符时 一个好的模式是现将右侧运算对象拷贝到一个局部临时对象中,当拷贝完成后,销毁左侧运算对象的现有成员就是安全的,一旦左侧运算对象

的资源被销毁剩下就是从临时对象拷贝到左侧运算对象的成员中  这样对于成员是指针类型的时候 拷贝赋值需要注意的第一点就可以做到

行为像指针的类  构造函数(除拷贝构造)引用计数为1 拷贝构造 引用计数加1  拷贝赋值 左边减一 右边加一

时间: 2024-11-09 01:00:15

primer Day4的相关文章

C++ Primer快速学习 第一章 入门

很多人说C++Primer不适合于入门,本系列入门文章向大家证明了:这是一个谎言. 第一章 入门 本章介绍 C++ 的大部分基本要素:内置类型.库类型.类类型.变量.表 达式.语句和函数. 1.1. 编写简单的 C++ 程序 每个 C++ 程序都包含一个或多个 函数 ,而且必须有一个命名为 main.函数 由执行函数功能的语句序列组成.操作系统通过调用 main 函数来执行程序, main 函数则执行组成自己的语句并返回一个值给操作系统. 下面是一个简单的 main 函数,它不执行任何功能,只是

C++ Primer Plus的若干收获--(八)

接下我会比较系统的介绍OOP的核心--类这个概念.可能会写的比较繁琐,比较多,但是自己理解总是好的.还记得上学期刚开始的时候老师讲的数据结构,一上来就来个LIst的一个大类,结果全班就傻了,完全不知所云(ps:博主是数学系,只学过C),然后自己就坐在图书馆借了两大本C++书开始啃了起来,大概啃了两个月才把C++学了个大概,尤其是读到类这块都是三四百行的常常的代码,看的那叫一个痛苦啊.不过自此之后就真正喜欢上这门语言了,再到之后能用C++写上个一两千行的代码,才发现之前的努力还是有收获的.好了,废

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

C++primer 15.7.3节练习

练习15.26 写的时候不小心写到了派生类Disc_quote,其实是一样的,主要明白原理即可 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #include <memory> 5 #include <vector> 6 7 using namespace std; 8 9 class Quote { 10 public: 11 Quote() : bookNo(

day4

day4: 经过一天的考试与测评,我发现自己在审题和考虑情况方面有很大的不足,以后要留意不同数据出现时发生的所有情况,不要遗漏数据输出时使用的库. #include〈iostream〉 using namespace std: int main() { int n,m; cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<n;j++) cout<<'*'<<' '; cout<<'*'&l

C++ Primer 第四版课后练习解答 习题1.1

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.1 查看所用的编译器文档,了解它所用的文件命名规范.编译并运行本节的main程序. [解答] 一般而言,C++编译器要求编译的程序保存在文件中.C++程序一般涉及两类文件:头文件和源文件.大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成.文件后缀通常表明文件的类型,如头文件的后缀可以是.h或.hpp等:源文件和后缀可以是.cc或.cpp等,具体的后缀与使用的编译