primer

浅谈 C++ 中的 new/delete 和 new[]/delete[]

我怕爱的太早我们不能终老 提交于 2020-07-24 06:10:47
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候用它们? 你知道 operator new 和 operator delete 吗? 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行? … 如果你对这些问题都有疑问的话,不妨看看我这篇文章。 new 和 delete 到底是什么? 如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数。在这里,和 sizeof 类似,new 和 delete 也不是函数,它们都是 C++ 定义的关键字,通过特定的语法可以组成表达式。和 sizeof 不同的是,sizeof 在编译时候就可以确定其返回值,new 和 delete 背后的机制则比较复杂。 继续往下之前,请你想想你认为 new 应该要做些什么?也许你第一反应是,new 不就和 C 语言中的 malloc 函数一样嘛,就用来动态申请空间的。你答对了一半,看看下面语句: string * ps = new string ( "hello world" ); 你就可以看出 new 和 malloc 还是有点不同的,malloc

C++Primer第五版——习题答案详解(二)

懵懂的女人 提交于 2020-05-07 23:20:35
习题答案目录: https://www.cnblogs.com/Mered1th/p/10485695.html 第3章 字符串、向量和数组 练习3.2 一次读入一整行 #include<iostream> #include<string> using namespace std; int main() { string a; while (getline(cin, a)) { cout << a << endl; } return 0; } 一次读入一个词 #include<iostream> #include<string> using namespace std; int main() { string a; while (cin>>a) { cout << a << endl; } return 0; } 练习3.4 #include<iostream> #include<string> using namespace std; int main() { string a, b; cin >> a >> b; if (a != b) { cout << (a >= b ? a : b); } return 0; } 练习3.5 #include<iostream> #include<string> using namespace std; int main() {

Linux CentOS 7 下的C++ 学习笔记01

ⅰ亾dé卋堺 提交于 2020-05-05 18:09:27
1.虚拟机WMware 通过镜像安装CentOS 7系统(自行百度操作 虚拟机+镜像+安装一套都有) //安装时需要配置网络 //root设置密码 即为登录系统的账号和密码 2. C++ 环境设置 //yum指令是真的好用 //安装gcc yum install gcc-c++ //查看gcc安装版本(验证是否安装成功) gcc -v //创建并编写test.cpp vim test.cpp //按A键 Insert #include<iostream> int main() { std::cout<<"Hello World!"<<std::endl; return 0; } Esc :wq //左下方光标闪烁处(意思是写入并退出write and quit,其他方式自行百度) //编译并生成可执行文件helloworld g++ test.cpp -o helloworld //运行当前目录下可执行文件 ./helloworld 3.会用到的一些基础指令 ls //显示当前目录下文件 rm //删除文件 4.学习书籍:《C++ primer》第五版 参考网页: 1.C++ 环境设置 http://www.runoob.com/cplusplus/cpp-environment-setup.html 2.Linux 基础指令 https://www.cnblogs.com

C++异常处理解析: 异常的引发(throw), 捕获(try catch)、异常安全

泄露秘密 提交于 2020-05-05 12:54:51
前言: C++的异常处理机制是用于将 运行时错误检测和错误处理功能分离的一 种机制(符合高内聚低耦合的软件工程设计要求), 这里主要总结一下C++异常处理的基础知识, 包括基本的如何引发异常(使用throw)和捕获异常(try catch)相关使用注意点, 以及C++标准库提供的一套标准异常类和这些异常类的继承层级结构以及相关使用方法和常用习惯. C++异常的引发(throw): 引发C++异常的语法就是使用throw语句: throw object; 注意这里throw抛出的是一个对象,也就是说是一个实例. 一旦抛出, 发生两件事情: 第一, C++异常机制开始寻找try catch模块, 寻找和抛出的对象的类型相匹配的catch子句找到处理代码进行异常的处理 , 这个过程是一个 栈展开的 过程,也就是说C++讲先从当前的函数体里面寻找try catch模块, 如果没有, 则在调用当前函数(比如我们叫当前函数A)的函数(我们叫调用A的函数B)寻找处理代码(在B里面寻找), 一直寻找直到找到匹配的catch子句, 然后运行catch里面的代码 , 运行完毕以后, 从这个匹配的catch后面的代码继续运行 . 第二件事情是, 栈展开前面的所有函数作用域都失效 (比如, A调用B, B调用C, C调用D, D调用E, E抛出异常同时在C找到了处理异常的catch子句, 那么D,

唐佐林C++学习视频进度及过程中需要复习的内容

为君一笑 提交于 2020-05-02 17:02:23
工作中发现自己对C++掌握的不够扎实,于是利用业余时间系统的复习下C++,看完C++primer之后又买了唐佐林老师的视频,看视频的过程中做了如下笔记。 第一遍过程中需要复习的内容 第一课:学习C++的意义 第二课,C到C++的升级 ,不需要复习,只需要记住中间的三个知识点; C++更强调语言的实用性,所有的变量都可以在需要使用时再定义,(比较典型的例子就是for循环的控制变量可以直接在for后面的括号里面定义),而C语言中的变量都必须在作用域开始的位置定义。 C语言中struct关键字只是定义了一组变量的集合,并没有定义一种新的类型,而C++中的struct定义了一个全新的类型, C++中的 struct Student { const char *name; int age; } 等价于C语言中的 typedef struct _tag_student Student; struct _tag_student { const char* name; int age; } C++中所有的标识符都必须显式的声明类型。 在C语言中,int f()表示返回值为int, 接受任意参数的函数 ,f(void)表示返回值为int的无参函数 在C++中,int f()和int f(void)具有相同的意义,表示返回值为int的 无参函数 。 第三课,进化后的const分析 C语言中

C++Primer第五版——习题答案详解(九)

半腔热情 提交于 2020-05-02 01:07:18
习题答案目录: https://www.cnblogs.com/Mered1th/p/10485695.html 第10章 泛型算法 练习10.1 #include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { int t, n; vector<int> vec; cout << "请输入序列个数:" << endl; cin >> n; cout << "请输入序列:" << endl; for (int i = 0;i < n;i++) { cin >> t; vec.push_back(t); } cout << "请输入要统计的值:" << endl; int num; cin >> num; cout << count(vec.begin(), vec.end(), num) << endl; system("pause"); return 0; } 练习10.2 #include<iostream> #include<algorithm> #include<list> #include<string> using namespace std; int main() { int n; string t; list<string> lst; cout <<

2020BUAA软件工程 第一次个人作业 回顾与展望

Deadly 提交于 2020-04-29 20:39:09
2020BUAA软件工程$\cdot$第一次个人作业 回顾与展望 一、作业要求简介 本文是北京航空航天大学计算机学院软件工程课程的第一次作业。作为一名计算机专业的大三学生,这次作业的目的正是让我们更好地总结过去的学习生涯,做好未来的职业规划。通过阅读前人的职业经历,借鉴他们的成功经验,同时反思自己是否在正确的道路上朝着自己想要的目标前进。 项目 内容 本作业属于北航软件工程课程 博客园班级链接 作业要求请点击链接查看 作业要求 我在这门课程的目标是 获得成为一名软件工程师的能力 这个作业在哪个具体方面帮助我实现目标 总结过去、规划未来 二、正文 第一部分:结缘计算机 问:你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 博客I 中的作者是一位狂热的计算机爱好者,他/她选择从业于计算机完全是出于对行业的爱好。而 博客G 中的主角选择投身写程序并非出于对计算机和写代码的热爱,而是为了生活——" 于是,虽然她从来没有碰过电脑,虽然她不知道什么是编程,但是她已经有了一个理想,那就是做程序员,一个月挣 8000 块钱。 " 我认为,一个人与计算机行业的结缘的原因并不在于其对行业的热爱或信仰,也不在于科班或非科班。而在于其所处的时代背景与个人机缘巧合的选择。 博客I中的作者处于个人计算机刚刚家庭的时代,他当时家里拥有386,和同学一起偷着去老师家里玩电脑

[c++] Why should I use Smart Pointers

感情迁移 提交于 2020-04-26 14:57:45
深入理解智能指针 专有指针 Ref: unique_ptr的使用和陷阱 一、初始化 只可以使用new来分配内存,不可 拷贝和赋值。 unique_ptr< int > up1( new int ()); // okay,直接初始化 unique_ptr < int > up2 = new int (); // error! 构造函数是 explicit unique_ptr < int > up3(up1); // error! 不允许拷贝 二、基本操作 unique_ptr<T> up 空的unique_ptr,可以指向类型为T的对象,默认使用delete来释放内存 unique_ptr <T,D> up(d) 空的unique_ptr同上,接受一个D类型的删除器d,使用删除器d来释放内存 up = nullptr 释放up指向的对象,将up置为空 up.release() up放弃对它所指对象的控制权,并返回保存的指针,将up置为空,不会释放内存 up.reset(…) 参数可以为 空、内置指针,先将up所指对象释放,然后重置up的值. View Code 三、参数、返回值 unique_ptr不可拷贝和赋值,那要怎样传递unique_ptr参数和返回unique_ptr呢? 事实上不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或赋值一个将要被销毁的unique

c语言里面你不知道的break与switch,contiune的用法

删除回忆录丶 提交于 2020-04-24 04:27:00
前言:最近上完课在宿舍闲来无事,就拿起了C Primer Plus 这本书看,是自己入门编程的第一门语言;看了一些基本语法知识点,最让我需要总一下的是就是标题所说的这个语法知识点,记得大一的时候去考计算机二级的时候,里面的好多选择有这个,当时在这里弄晕了,所以想一想,还是总结一下,加深理解与印象。 一、switch语句的用法: 看到这个就让我想起了在学习五一单片机里的矩阵键盘的写法,就用到了这个,哈哈。嗯,还是先来看一下它的基本结构和用法: 1、格式: switch (表达式) { case 常量表达式1: 语句1; case 常量表达式2: 语句2; ....... case 常量表达式n: 语句n; default : 语句n+1; } 说明: 第一、所有case后面的常量表达式为便于描述我们姑且称为标签,这些标签都只能是:a、枚举常量(有些地方叫枚举元素),b、数值常量,c、字符常量 ,d、常变量,e、宏名中的一种,注意普通变量,枚举变量不能作为标签使用的。 第二、swich 后面括号里的"表达式"允许是任何类型。 第三、执行完一个case语句后,流程控制就转移到下一个case语句继续执行下去,"case”常量表达式只是起语句标号的作用,并不是在该处进行条件判断。在执行swtich语句时,根据switch()中表达式的值找到与之匹配的case字句,就从此case

c++ 编译器会绕过拷贝构造函数

纵然是瞬间 提交于 2020-04-22 00:35:10
C++ primer P442 P447: 在拷贝初始化过程中,编译器可以跳过拷贝构造函数,直接创建对象。即,编译器允许将下面的代码   string null_book = " 999 " ;  //1 改写为 string null_book( " 999 " );  //2 由于string的构造函数不是一个explicit的,所以说string类型允许从const char* 到string的隐式转换。 在行1中,首先将"999"隐式转化为一个string的临时对象,然后应该调用string的拷贝构造函数对null_book初始化。即 string temp_str( " 999 " ); string null_book = temp_str; // 或者 string null_book(temp_str); 在这里编译器会进行优化,跳过拷贝构造函数直接创建对象。使临时变量成为所要创建的对象。 类似的下面代码也会跳过拷贝构造函数 string str = string (); 但是在这种情况下,拷贝构造函数必须是public的,否则编译会不通过。可能是因为如果拷贝构造函数是private的话,编译器会理解为不能够使用拷贝构造函数,进而不会进行这种优化。 来源: oschina 链接: https://my.oschina.net/u/4289967/blog