![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习笔记
文章平均质量分 75
不会code的菜鸟
这个作者很懒,什么都没留下…
展开
-
设计模式之观察者模式(C++)
设计模式之观察者模式(C++)Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实例 Model/View/Control( MVC) 结构在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。在 MFC 中, Doc/View(文档视图结构)提供了实现 MVC 的框架结构。在 Java 阵容中, Struts 则提供和 MFC 中 Doc/View 结构类似的实现 MVC 的框架。另外 Java 语言本身就提供了 Observer转载 2020-11-01 17:39:57 · 182 阅读 · 0 评论 -
堆区和栈区的区别
一、程序内存的区域1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们说的栈,,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存。2、堆区(heap)一般由程序员分配释放,若是程序员不释放,程序结束时可能由操作系统回收,类似于链表,在内存中的分布是不连续的,它们是不同区域的内存块通过指针链接起来的。一旦某一节点从链中断开,我转载 2020-06-09 16:23:13 · 611 阅读 · 0 评论 -
malloc/free和new/delete的区别
摘自:C和C++程序员面试秘籍malloc与free是C++/C的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此,C++需要一个能够完成动态内存分配和初始化工作的运算符ne原创 2020-06-09 14:45:06 · 177 阅读 · 0 评论 -
C++中的delete和delete[ ]的区别
以前看书的时候,书上说使用new申请的内存,释放时用delete,使用new [ ]申请的内存释放时要用delete [ ]才行,这两个一定要记住,申请时用了方括号,则释放时也要加上方括号,否则就会出错。但是并没有解释为什么这样,会出什么错。今天正好看到这个,记录下。关于动态申请的内存,分两种情况:基本数据类型的分配和自定义数据类型的分配。两者不同。1、基本数据类型对于基本数据类型,假如有如下代码int *a = new int[10];.......delete a; //方式1转载 2020-06-08 20:18:21 · 1284 阅读 · 0 评论 -
纯虚函数设置为public、protected和private的区别
我们把一个仅仅含有纯虚函数的类称为接口,我们也好像已经习惯了将这个接口中的所有纯虚函数全声明为public,而且按照这样的设计,一切都工作得不错。比如COM正是这样做的,它的接口中几乎不会存在private的纯虚函数。那么,让我们想一想,纯虚函数或者虚函数可以为private吗?如果这种方式是可行的,那么什么时候可以将(纯)虚函数设为private了?这些都是本文将要讨论的主题。一起来看看。一....转载 2020-05-05 18:42:58 · 3164 阅读 · 2 评论 -
C++: 类型转换函数 与 explicit
类型转换函数 与 explicit1. 类型转换函数在C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function)将一个类对象转换为其他类型的数据。我们直接通过一个简单的代码介绍转换函数:#include <iostream>using namespace std;class Fraction...转载 2020-04-26 09:23:51 · 383 阅读 · 0 评论 -
C++: log4cpp日志管理系统的简单介绍
一、Layout,设置日志输出风格有BasicLayout、SimpleLayout、PatternLayout,其中BasicLayout,SimpleLayout主要是提供的成型的简单日志风格,实际中基本不会使用,主要是使用PatternLayout对日志做格式输出,Layout是加载到Appender中去的。涉及头文件:#include<log4cpp/BasicLayout.h...原创 2020-04-25 17:03:03 · 568 阅读 · 0 评论 -
Understanding the meaning of lvalues and rvalues in C++
Understanding the meaning of lvalues and rvalues in C++A lightweight introduction to a couple of basic C++ features that act as a foundation for bigger structures.I have been struggling with the con...转载 2020-04-15 21:57:14 · 767 阅读 · 0 评论 -
C++Primer 拷贝控制示例Message类和Folder类的实现
我们将概述两个类的设计,这两个类可能用于邮件处理应用中。两个类命名为Message和Folder,分别表示电子邮件消息和消息目录。每个Message对象可以出现在多个Folder中。但是,任意给定的Message的内容只有一个副本。这样,如果一条Message的内容被改变,则我们从它所在的任何Folder来浏览此Message时,都会看到改变后的内容。为了记录Message位于哪些Folder...原创 2020-01-31 16:10:44 · 994 阅读 · 0 评论 -
C++Primer : 第十四章 :函数调用运算符
函数调用运算符函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符,相互之间应该在参数数量或类型上有所区别。如果类定义了调用运算符,则该类的对象称为函数对象。含有状态的函数对象类函数对象除了operator()之外也可以包含其他成员。函数对象类通常含有一些数据成员,这些成员被用于定制调用运算符中的操作。定义一个打印string实参内容的类。默认情况下,我们的类会将内容写入...原创 2020-01-28 23:23:57 · 544 阅读 · 0 评论 -
C++Primer : 第十四章 :成员访问运算符
在迭代器类与智能指针类中常常用到解引用运算符(*)和箭头运算符(->)class StrBlobPtr {public: string& operator*() const { auto p = check(curr, "dereference past end"); return (*p)[curr]; //(*p)是对象所指的vector } strin...原创 2020-01-28 15:23:19 · 286 阅读 · 0 评论 -
C++Primer : 第十四章 :递增和递减运算符
定义递增和递减运算符的类应该同时定义前置版本和后置版本。这些运算符通常应该被定义成类的成员。定义前置递增/递减运算符class StrBlobPtr {public: StrBlobPtr& operator++(); StrBlobPtr& operator--();};为了与内置版本保持一致,前置运算符应该返回递增或递减后对象的引用。递增和递减运算符的工作机理...原创 2020-01-28 14:22:03 · 327 阅读 · 0 评论 -
C++Primer : 第十四章 :下标运算符
表示容器的类通常可以通过元素在容器中的位置访问元素,这些类一般会定义下标运算符operator[]。下标运算符必须是成员函数为了与下标的原始定义兼容,下标运算符通常以访问元素的引用作为返回值,这样的好处是下标可以出现在赋值运算符的任意一端。进一步,我们最好同时定义下标运算符的常量版本和非常量版本,当作用于一个常量对象时,下标运算符返回常量引用以确保我们不会给返回的对象赋值。如果一个类包含下标...原创 2020-01-28 12:17:35 · 937 阅读 · 0 评论 -
C++Primer : 第十四章 :赋值运算符
赋值运算符赋值运算符可以把类的一个对象赋值给该类的另一个对象。此时,类还可以定义其它赋值运算符以使用别的类型作为右侧运算对象。在拷贝赋值和移动赋值之外,标准库vector类还定义了第三种赋值运算符,该运算符接受花括号内的元素列表作为参数。我们能以如下的形式使用该运算符:vector<string> v;v = {"a", "an", "the"};同样,也可以把这个运算符添...原创 2020-01-28 11:30:13 · 256 阅读 · 0 评论 -
C++Primer : 第十四章 :算术与关系运算符
通常情况下,我们把算术和关系运算符定义成非成员函数以允许对左侧或右侧的运算对象进行转换。因为这些运算符一般不需要改变运算对象的状态,所以形参都是常量的引用。算术运算符通常会计算它的两个对象并得到一个新值,这个值有别于任意一个运算对象,常常位于一个局部变量之内,操作完成后返回该局部变量的副本作为其结果。如果类定义了算术运算符,则它一般也会定义一个对应的复合赋值运算符。此时,最有效的方式是使用复合赋...原创 2020-01-28 10:32:16 · 271 阅读 · 0 评论 -
C++Primer : 第十四章 :运算符重载与类型转化基本概念
重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。和其他函数一样,重载的运算符也包含返回类型、参数列表以及函数体。重载运算符函数的参数数量与该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个。对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数。除了重载的函数调用运算符operator()之外,其...原创 2020-01-27 14:54:55 · 226 阅读 · 0 评论 -
C++Primer : 第十四章 :重载输入和输出运算符
重载输出运算符<<通常情况,输入运算符的第一个形参是一个非常量ostream对象的引用。之所以ostream是非常量是因为向流写入内容会改变其状态;而该形参的引用是因为我们无法直接复制一个ostream对象。第二个形参一般来说是一个常量的引用,该常量是我们想要打印的类类型。第二个形参是引用的原因是我们希望避免复制实参;而之所以该形参可以是常量是因为打印对象不会改变对象的内容。为了...原创 2020-01-27 18:32:55 · 285 阅读 · 0 评论 -
C++ 文件操作I/O流
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化C++中对文件操作需要包含头文件 < fstream >文件类型分为两种:文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们操作文件的三大类 :1、ofstream:写操作2、ifstream: 读操作...原创 2020-01-20 19:23:57 · 538 阅读 · 1 评论 -
C++Primer : 第十二章 :智能指针weak_ptr类
weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个由一个shared_ptr管理的对象。将一个weak_ptr绑定到shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。即使有weak_ptr指向对象,对象还是会被释放weak_ptr<T> w //空weak_ptr可以指向类型为T...原创 2020-01-21 16:44:53 · 303 阅读 · 0 评论 -
C++Primer : 第十二章 : 智能指针unique_ptr类
unique_ptr类:某个时刻只能有一个unique_ptr指向一个给定对象,当unique_ptr被销毁时,它所指向的对象也被销毁。与shared_ptr不同,没有类似make_shared的标准库函数返回一个unique_ptr。当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针上。类似shared_ptr,初始化unique_ptr必须采用直接初始化形式:uniq...原创 2020-01-20 20:38:15 · 274 阅读 · 0 评论 -
C++Primer : 第十二章 :allocator类
当分配一大块内存时,我们通过计划在这块内存上按需求构造对象。在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但是真正需要时才真正执行对象创建操作。标准库allocator类定义在头文件memory中,它将内存分配和对象构造分开allocator<string> alloc; //可以分配string的allocator对象auto const ...原创 2020-01-20 12:32:33 · 215 阅读 · 0 评论 -
C++Primer : 第十二章 :智能指针和异常
智能指针和异常即时程序块过早结束,智能指针类也能确保在内存不再需要时将其释放void f(){ shared_ptr<int> sp(new int(42)); //分配一个新对象 //这段代码抛出一个异常,且在f中未被捕获} //在函数结束时shared_ptr自动释放内存与之对应的,当发生异常时,我们直接管理的内存是不会自动释放的。如果使用内置指针管理内存,且...原创 2020-01-20 00:23:48 · 183 阅读 · 0 评论 -
C++Primer :第十二章:shared_ptr和new的结合使用
shared_ptr和new的结合使用如果我们不初始化一个智能指针,它就会被初始化为一个空指针,我们可以用new返回的指针来初始化智能指针接受指针参数的智能指针构造函数是explicit的。因此,我们不能将一个内置指针隐式转化为一个智能指针,必须使用直接初始化形式来初始化为一个智能指针shared_ptr<int> p1 = new int(1024); //错误:必须使用直...原创 2020-01-19 23:38:42 · 492 阅读 · 0 评论 -
C++Primer :第十二章:直接管理内存 new and delete
使用new动态分配和初始化对象在自由空间分配的内存是无名的,因此new无法为其分配的对象命名,而是返回一个指向该对象的指针:int *pi = new int; //pi指向一个动态的、未初始化的无名对象此new表达式在自由空间构造一个int类型的对象,并返回指向该对象的指针默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象的值是未定义的,而类类型对象将用默认构...原创 2020-01-19 22:42:48 · 166 阅读 · 0 评论 -
C++Primer:第十二章:智能指针shared_ptr类
静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁。除了静态内存和栈内存,每个程序还拥有一个内存池。这部分内存称为自由空间或者堆。程序用堆来储存动态分配的对象。那些在程...原创 2020-01-19 18:41:13 · 644 阅读 · 0 评论 -
C++Primer 内联函数关键字inline
调用函数一般比求等价表达式的值要慢一些。在大多数的机器上,一次函数调用其实包含着一系列的工作:调用前要先保存寄存器,并在返回时恢复;可能需要拷贝实参;程序转向一个新的位置继续执行内联函数可避免函数调用时的开销将函数指定为内联函数(inline),通常就是将它在每个调用点上“内联地”展开。在函数的返回类型前面加上关键字Inline就可以将它声明成为内联函数了在C++中,在类的设计中,类的成员...原创 2020-01-19 15:56:40 · 277 阅读 · 0 评论 -
atoi()函数
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)函数原型:int atoi(const char *str);头文件:#include <stdlib.h>//以下程序输出结果为 1#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>...原创 2020-01-19 15:48:17 · 6527 阅读 · 1 评论 -
C++Primer 交换操作
除了定义拷贝控制成员,管理资源的类通常还定义了一个名为swap的函数。为了交换两个对象我们需要进行一次拷贝和两次赋值。HasPtr temp = v1; //创建v1的值的一个临时副本v1 = v2; //将v2的值赋予v1()v2 = temp; //将保存的v1的值赋予v2拷贝一个类值的HasPtr会分配一个新string并将其拷贝到HasPtr指向的位置,而这些拷...原创 2020-01-19 15:33:07 · 443 阅读 · 0 评论 -
C++Primer 动态内存管理StrVec类的实现
StrVec类的设计vector类将其元素保存在连续的内存中。为了获得可接受的性能,vector预先分配足够的内存来保存可能需要的更多元素。vector的每个添加元素的成员函数会检查是否有空间容纳更多的元素。如果有,成员函数会在下一个可用位置构造一个对象。如果没有可用空间,vector就会重新分配空间:它获得新的空间,将已有元素移动到新空间中,释放旧空间,并添加元素。在StrVec类中采用类似...原创 2020-01-19 11:44:59 · 603 阅读 · 0 评论 -
C++Primer 拷贝控制和资源管理
类型对象的拷贝语义,一般来说,有两者选择:可以定义拷贝操作,使类的行为看起来像一个值或者一个指针。类的行为像一个值,意味着它应该也有自己的状态。当我们拷贝一个像值的对象时,副本和原对象是完全独立的。改变副本也会改变原对象,反之亦然。行为像指针的类则共享状态。副本和原对象使用相同的底层数据,改变副本也会改变原对象。在我们使用过的标准库类中,标准库容器和string类的行为像一个值。而share...原创 2020-01-18 19:01:20 · 553 阅读 · 0 评论 -
C++Primer const限定符
用关键字const对变量的类型加以限定,可以将变量定义成一个常量。因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化const int bufsize = 512; //bufsize被定义为一个常量,任何试图为bufsize赋值的行为都会引发错误const int i = get_size(); //正确,运行时初始化const int j = 42; ...原创 2020-01-18 15:29:25 · 212 阅读 · 0 评论 -
C++Primer 变量与引用
变量和对象对于C++程序员来说,一般可以互换使用初始值:当对象在创建时获得了一个特定的值,我们就说这个对象被初始化了在C++语言中,初始化是一个异常复杂的问题,很多程序员对于用=来初始化变量的方式倍感困惑,这种方式让人认为初始化是赋值的一种。实事上在C++语言中,初始化和赋值是两个完全不同的操作。初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以...原创 2020-01-16 18:37:20 · 285 阅读 · 0 评论 -
C++Primer 拷贝、赋值与销毁
拷贝构造函数:如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数拷贝构造函数的第一个参数必须是一个引用类型,此参数几乎总是一个const的引用,因为拷贝构造函数在几种情况下都会被隐式地使用,所以拷贝构造函数通常不应该是explicit的合成拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中。编译器从给定对象中依次将每个非static成员拷贝...原创 2020-01-15 19:22:08 · 318 阅读 · 0 评论 -
heap(堆)和stack(栈)的区分
静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自己创建和销毁对于栈对象,仅在其定义的程序块运行时才存在;static对象在使用之前分配,在程序结束时销毁除了静态内存和栈内存,每个程序还有一个内存池。这部分内存被称作自由空间(free store)或堆(heap)。程序...原创 2019-12-23 20:20:36 · 174 阅读 · 0 评论 -
C++_智能指针的基本原理
智能指针的核心思想是将资源(内存)与指针对象的生命周期绑定起来,创建对象的同时立即为其分配资源,对象销毁时立即释放资源。1、智能指针和资源的绑定将裸指针和它相关的操作封装成一个类,并在创建对象时必定要调用的构造函数中,分别进行资源的分配和释操作。当然,为了保证对象的操作方式看起来与裸指针相同,这个封装类起码还要重载operator->和operator *一个简单的,在其生命周期中绑定...原创 2019-12-22 17:30:21 · 220 阅读 · 0 评论 -
无返回值函数(void和return;)
参考资料:C++_Primer 5th没有返回值的return语句只能用在返回类型是void的函数中。返回void的函数不要求非得有return语句,因为在这类函数的最后一句后面会隐式执行return.通常情况下,void函数如果想在它的中间位置提前退出,可以使用return语句。return的这种用法有点类似于我们用的break语句退出循环。void swap(int &v1, i...原创 2019-12-20 15:41:49 · 14675 阅读 · 4 评论 -
C++中inline笔记
转载百度百科inline词条inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。1.in...转载 2019-12-19 17:37:53 · 111 阅读 · 0 评论 -
static关键字作用总结
前言之前讲到final关键字的作用是每次面试的时候我必问求职者的两个问题之一,另外一个问题就是文本会写到的static。final和static一样,都是一个小问题可以看到一个人的基础是否扎实以及平时是否有钻研精神。静态变量和静态方法static关键字最基本的用法是:1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来2、被static修饰的方法...转载 2019-12-18 16:45:44 · 89 阅读 · 0 评论 -
C++中explicit关键字的作用
explicit用来防止由构造函数定义的隐式转换。要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。例如:class things{ public: things(const std::string&name =""): m_name(name),height(0),wei...转载 2019-12-18 16:26:57 · 89 阅读 · 0 评论 -
C++_STL容器vector和List学习笔记
向量vector的仿真#include<iostream>using namespace std;template<typename Ty>class MyVector{public: //内嵌类型表 typedef Ty value; typedef Ty* viter;public: //构造函数 MyVector(int nlen = 0) :...原创 2019-12-08 12:01:18 · 187 阅读 · 0 评论