![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习笔记
文章平均质量分 82
木凡辰
这个作者很懒,什么都没留下…
展开
-
自定义for循环
首先,这里说的for循环,是指C++中新增的for(a : b)格式的for循环。最近碰到了这样的问题,就来记录一下。如有错漏,还望指摘。C++新增的这种for循环,使用来遍历容器中的每一个元素。但是有时候,我想自定义自己的容器,那能不能也使用这样的for循环呢?答案肯定是可以的。那么需要什么要求呢?for循环的大致逻辑要向弄明白有什么需求,我们首先需要弄明白,这个for循环是怎么实现的。比如对于for(ele : list), 其实大致相当于如下代码:for(auto it = list.b原创 2020-06-03 14:54:24 · 1326 阅读 · 0 评论 -
C++小技巧——将类型typedef成数组
今天学习到一个新的C++小技巧:将一个类型定义成数组。大概像这样:typedef struct _s{ int a = 0;}s[1];这样在定义s的时候可以分配在栈上,但是又因为是数组,在传递的时候是传递指针,而不用额外再定义指针。使用的时候是这样:void func(s input){ input->a++;}int main(){ s tmp; func(tmp); cout << tmp->a <<原创 2020-05-13 15:37:34 · 763 阅读 · 0 评论 -
设计模式——C++版
开一个新坑……边学习边总结。如有错漏,还望指摘。什么是设计模式?设计模式,可以说是个老生常谈的话题了,面试必问,考试必考,敲黑板,送分题。那么什么是设计模式呢?百度一下:软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。简单说就是:前辈们在解决无数问题后总结出来的“三板斧”。这些设计模式可以解决绝大部分问题的同时,还可以保证代码的可读性、可靠性、重用性、易扩展性、可维护性等等。反正学就完事了嗷。起源为了尊重一下前辈,这原创 2020-05-13 09:08:40 · 312 阅读 · 0 评论 -
字符串处理——判断是否是数字或字母
最近写的代码涉及到字符串的判断,主要是判断一个字符是否是十进制数字、十六进制数字、大写字母、小写字母。学到了一些新知识。最开始我采用最简单暴力的方法:char ch;if(ch >= '0' && ch <= '9') //十进制数字if(ch >= '0' && ch <= '9' || (ch >= 'A' &&a...原创 2020-04-23 11:02:44 · 2876 阅读 · 0 评论 -
虚函数的默认值
这两天写的代码涉及到虚函数的默认值,来记个笔记主要是以下case:class Base{public: virtual void print_msg(const char* msg = "Base") { std::cout << msg << std::endl; return; }};class De...原创 2020-04-23 09:31:05 · 491 阅读 · 0 评论 -
socket编程——阻塞、非阻塞、同步、异步
我这里主要是参考了这篇文章。一开始我很疑惑,同步异步和阻塞非阻塞有什么区别么?看了这篇文章感觉有所悟,所以来总结一下。阻塞与非阻塞阻塞所谓阻塞,是指将一个IO操作交给底层之后,底层不执行完毕不返回。也就是程序运行到这里就卡住了,直到底层运行完毕才能继续。比如说一次接收,对于阻塞的recv,如果对面还没有发任何数据,也就是底层没有接收到任何数据,那么程序就会一直卡在这里,直到对面有数据...原创 2019-11-29 10:35:18 · 275 阅读 · 0 评论 -
C++ 计时
我这里主要说的计时器。因为我有时候要测试一下模块性能,所以需要计时。C++中计时主要有两种。clock_t当对于精度要求不高时,使用clock_t。这种方法是毫秒级。使用方法:#include <time.h>int main(){ clock_t start = clock(); Sleep(1000); clock_t end = clock(); in...原创 2019-11-27 12:17:37 · 323 阅读 · 0 评论 -
Windows下的Socket编程——基本步骤
基本流程:客户端:初始化调用socket分配套接字设置套接口模式填充SOCKADDR_IN来说明服务器地址调用connect连接服务器和服务器通信(调用send发送数据,或调用recv接收数据)。调用closesocket关闭套接字结束服务服务器端:初始化调用socket分配套接字设置套接口模式填充SOCKADDR_IN来说明服务器地址调用bind绑定端...原创 2019-11-22 16:11:04 · 2149 阅读 · 0 评论 -
C++宏定义中#和##的用法
前段时间很到了宏定义中的新知识:#与##,感觉打开了新天地的大门。首先来介绍一下这两种功能:##的用法是负责将其后面的东西转化为字符串,比如:#define TO_STRING(str) #strint main(){ cout << TO_STRING(this is a string) << endl; return 0;}这段代码中,TO_S...原创 2019-11-19 16:51:19 · 4358 阅读 · 1 评论 -
线程安全与可重入
今天看到一个新词汇:可重入。来总结一下。可重入和线程安全有什么区别和联系呢?可重入可重入,就是指可以重复进入,不论是多个线程同时调用该函数,还是说函数在执行过程中遇见了中断,而中断处理中又调用了该函数。可重入就是指在这两种情况下,函数并不会产生错误的结果。线程安全线程安全是指,当其他线程运行时,函数不会产生错误的结果,不论其他线程运行的是该函数亦或是其他函数。所以呢,线程安全和可重...原创 2019-10-29 17:03:02 · 215 阅读 · 0 评论 -
do{}while(0)的用法
这几天在看代码的时候遇到了一个好像很神奇的用法:do{ … }while(0)。do{ … }while(1)我能理解,就是一直循环,然后在循环体内设置跳出条件,或者干脆就不跳出。那do{ … }while(0)是干嘛的呢?在内部也改变不了循环条件,然后执行一次就结束,那不就是没循环嘛?赶紧查了一下,原来,这种用法主要是针对宏定义使用的。这里我们来看一下如下代码:#define INCR...原创 2019-10-15 15:46:27 · 744 阅读 · 0 评论 -
禁止拷贝、赋值和单例模式
这几天涉及到禁止类的拷贝与赋值,所以来写一下相关的东西。如有错漏,还望指摘。首先,如果未定义构造函数、拷贝函数和赋值操作符的时候,C++会为类自动生成默认版本的。如果想禁止类的拷贝、赋值,甚至构造,有两种方法。将其设为私有。这种方法很简单,就是写一个拷贝构造函数、赋值操作符,然后将其放在private限定符下。这样当外部想要拷贝或者赋值时,就会发现这个是私有的,禁止访问。使用这种方法时,...原创 2019-10-12 18:01:59 · 1831 阅读 · 0 评论 -
杂注__declspec
今天看到一个一个好玩的东西:__declspec。这是C++提供的一个关键词,配合一些属性可以对标准c++做一些扩充。总结一下其中我觉得有意思的。如有错漏还望指摘~__declspec的用法是:__declspec(属性1 [, 属性2, … ])。其中我学会了的有如下一些属性:deprecated这个属性可以修饰变量、函数、结构体、命名空间等等,用来标明这个名称或者实体,由于效率、...原创 2019-09-05 18:25:26 · 840 阅读 · 2 评论 -
模板特化
上一篇《模板与重载》里,我遇见了想同时使用模板函数与非模板函数的情况。后来才知道,其实并不需要,当我想对某些特定的类型进行特殊操作时,只需要使用模板特化就可以。所谓特化,就是说对于模板函数,对于某些类型可能需要特殊处理,所以进行特殊化。可以分为特化与偏特化,其实就是将模板列表中的模板全部特化还是部分特化。使用 template<> 来告诉编译器,这是一个特化的模板。类模板:...原创 2019-08-07 16:15:31 · 201 阅读 · 0 评论 -
构造函数中的初始化列表,以及构造函数和析构函数的调用顺序
新学到了C++里新的初始化方法,初始化列表。因此来整理一下。若有错漏,还望指摘。构造函数构造函数可分为普通构造函数和拷贝构造函数。普通构造函数构造函数就是在类实例化时,自动调用来生成类的函数。若未定义,则系统自动生成。比如:class test{};test A;在实例化A的时候就会调用普通构造函数。形式为函数名与类名相同,没有也不能声明任何类型的返回值。拷贝构造函数...原创 2019-04-01 18:00:50 · 1019 阅读 · 0 评论 -
C++内存分配
c++运行时,内存主要包括几个部分:堆栈全局区代码区(文字常量区)堆:堆空间最大,链表形式,物理空间不连续,由低地址向上扩展。存储由程序员用new和malloc等函数分配的变量。需要手动释放,不然容易内存泄漏。每个进程有一个堆。每次申请堆内存时,从小到大遍历链表,直到找到大于等于申请空间的内存,然后取出其中等于申请空间的内存,将剩余内存返回堆中。栈:栈存储非静态局部变量,以及一...原创 2019-04-06 11:45:21 · 459 阅读 · 0 评论 -
打印类
为了方便显示,总会有一种方法来使得类可以直接被print,cout等函数直接打印出来。python中是__str__()和__repr__()方法。 其中__str__() 方法是针对用户的,使用print可以直接打印。而__repr__()是针对开发者的,主要是在交互界面进行打印。java中是toString()方法。而C语言中,主要是通过友元函数重载,即对于操作符<<的重载来...原创 2019-04-06 12:05:42 · 291 阅读 · 0 评论 -
进程与线程
面试遇到的问题,进程与线程有什么区别呢?就我查到的资料而言,我的感觉是,进程与线程,就像施工队与工人。怎么讲呢?一个施工队中有好多工人,一个进程底下可以有多个线程。进程拥有资源,有堆内存,就像施工队有个大仓库。但是真正工作的,运行在CPU上的,是线程,就像实际干活的是工人。而且线程拥有的资源很少,只有一个程序计数器,一组寄存器,外加栈(而这些,正是运行程序所必备的资源)。就像工人拿个安全帽...原创 2019-04-06 12:53:32 · 76 阅读 · 0 评论 -
源代码到可执行代码的过程
这一部分一直很好奇,不过一直也没仔细记。这次记一下。源代码 --(预处理、编译、优化)–> 汇编代码 --(汇编)–> 目标文件 --(链接)–> 可执行文件预处理读取源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。主要包括:宏定义,条件编译指令,头文件包含指令,特殊符号(如LINE,FILE)。通常使用以下命令来进行预处理:gcc -E hello.c ...转载 2019-04-06 21:22:44 · 932 阅读 · 0 评论 -
重载,隐藏与虚函数
这几天学了一下继承,对于这几个概念比较一下。共同点:重载、隐藏和虚函数,说的都是重名函数,即函数名相同。不同点:重载:在相同作用域,同名函数,但传入参数不同,没有特定关键字。需要小心传入参数的二义性。根据参数不同调用不同的函数。class A{public: void test(){ cout << "test void" << endl...原创 2019-04-01 16:00:27 · 318 阅读 · 0 评论 -
cin效率
今天在刷LeetCode的时候,发现最快的代码和我的算法一模一样,但是多了两行:std::ios::sync_with_stdio(false);std::cin.tie(0);我把这两行代码加到我的代码中,发现果然快了不少。所以我就好奇,这两行代码究竟是用来干嘛的呢?查了一下才知道:首先,C++为了保证与C的兼容,所以将cin和stdin(如scanf)的流进行了同步,以保证你在代...原创 2019-04-16 19:20:36 · 321 阅读 · 0 评论 -
模板与重载
今天编程遇到一个问题,使用重载会简单不少,但是如果输入类型不在预设的类型中,又会出现问题。使用模板又比较麻烦。所以突发奇想,模板和普通函数同时使用的时候会怎么样?比如如下代码:int type(int){ return 0;}template<class T>int type(T){ return 1;}本以为会报错,毕竟class T里是包含int...原创 2019-08-06 16:34:25 · 704 阅读 · 2 评论 -
new、delete和malloc、free详解与混用问题
以前看到的资料都说,new和delete、new[]和delete[]、malloc和free,必须配套使用,不应该混用。然而我最近遇到一些相关的问题,因此不得不探究一下,混用了会怎么样呢?其实要想知道能不能混用,问题在于:他们有什么区别?其实很简单:malloc只负责分配内存,free只负责释放内存。new在分配内存的同时,还会调用构造函数;delete在释放内存的同时还会调用析构函...原创 2019-08-13 16:24:43 · 4520 阅读 · 4 评论 -
如何在main函数之前和之后执行代码
如何在main函数之前和之后执行代码原创 2019-08-09 14:37:52 · 1769 阅读 · 0 评论 -
内联函数与宏定义函数的异同
面试时被问到了这个问题,当时突然懵了,所以来整理一下。如有疏漏,还望指摘。内联函数与宏定义的函数很相似,都是在运行前,先将一些简短的函数,直接替换为实现代码,以此来省去函数调用时,参数入栈、程序跳转等的时间开支。宏定义的函数:使用宏定义#define定义的函数。其在预编译阶段就被进行简单的替换,因为只是简单的替换,所以无需定义参数和返回值的类型,也不会对参数进行临时拷贝以及析构。如下宏定义函...原创 2019-04-05 13:26:33 · 834 阅读 · 0 评论