- 博客(39)
- 收藏
- 关注
原创 函数模板.
重载与函数模板函数模板与函数重载看起来大同小异,但是重载的类不能传入与之相同类型的参数,从而使得要多建几个代码框架相同的函数,使程序代码冗余,可读性降低。宏定义只是在编译时进行简单的宏展开,避开了类型检查机制,容易产生隐藏错误。(x):(y))//替换后:((a++)>(b++)?像这样,我们调用max宏定义替换时,a和b会产生多次自增,而我们需要的只是一次自增函数模板模板可以轻松地解决上述问题,减少隐式错误和减少代码冗余。x : y;
2025-12-18 17:55:04
691
原创 多继承与虚基类
多继承派生类的语法格式:多继承派生类对象的构造和析构:派生类构造执行顺序是按照:基类对象、成员对象、普通变量的高到低优先级执行的,其中其中基类对象的调用顺序和声明继承关系的顺序有关。但是析构函数的执行顺序与之相反,先调用派生类的析构函数,再调用对象成员的析构函数,最后调用基类的析构函数。这里在调用f()和value时会出现二义性,因为编译器不知道你访问的是A和B中的哪一个()和value。所以在此我们需要填写他的“绝对路径”,类名对成员加以限定:改成:第二种情况:这一二义性的冲突是因为B1、B2
2025-12-17 17:45:47
840
原创 虚函数/纯虚数及抽象类笔记
C++提供的新机制,虚函数允许函数调用与函数体的匹配在运行时才确定,是一种动态绑定机制。正常来说,通过基类引用或指针所能看到的是一个基类对象,派生类中的成员对于基类引用或指针来说是不可见的,无法通过基类的指针或引用指向派生类。public:cout << "这是基类Base" << endl;public:cout << "这是派生类Derived" << endl;b2 = &b1;b2->demo();//这是基类Baseb2 = &d1;b2->demo();
2025-12-17 16:37:36
517
原创 模板(初识)
C++添加了模板,可以让让编译器根据不同的类型利用该模子来生成代码,就如模板一样,可以使用多种类型在同一个类里面使用。语法:template<typename T1,typename T2,typename T3,……,typename Tn>//要传几个类型写几个模板类型 模板名(参数){举个例子:通过模板我们可以在写代码时可以省略很多重复性的代码:但要注意一点,虽然都是同一个模板复用,但用的函数却不是同一个,而是编译器按照这个模板进行对应类的生成。模板引出。
2025-11-18 22:12:45
312
原创 内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;
2025-11-16 21:13:54
926
原创 C++ 类和对象·其一
和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。bool operator<(){Date d1,Date d2}//小于比较bool operator==(){Date d1,Date d2}//等于比较int main()Date d1();Date d2();d1 == d2;//两种调用方法return 0;重载运算符函数的参数个数和该运算符作用的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元。
2025-09-21 21:28:00
606
原创 C++初认、命名规则、输入输出、函数重载、引用+coust引用
放在两个文件里使用分离会导致链接错误,因为inline被展开,就没有函数地址,链接时会出现报错一个简单的加法宏函数:
2025-09-13 21:37:26
855
原创 SpringBoot
Maven是一个项目管理工具。基于POM(Project Object Model,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。大白话: Maven是一个项目管理工具, 通过pom.xml文件的配置获取jar包,而不用手动去添加jar包。Maven提供的功能非常多, Maven在咱们课程中的体现主要是以下两个方面:1. 项目构建2. 管理依赖IDEA本身已经集成了Maven, 我们可以直接使用, 无需安装。
2025-07-28 18:37:28
705
原创 JQuery
•$() 是一个函数, 它是 jQuery 提供的一个全局函数, 用于选择和操作 HTML 元素.点击、鼠标移动选择,输入修改,这些都是在浏览器产生的一个个的事件,js捕获到了后将会进行操作。可以看到empty()将所选的标签保留了下来,而remove()连带所选择的标签一起删掉了。除此以外还有很多事件,这里就不放了,由于我也是初学这里是笔记部分的原因就不放了……下面是运行结果,以及换一下#div1和ol位置的运行结果,注意看f12的代码。可以看到,明明是百度的链接在f12里看到的却是有道的链接。
2025-07-16 12:56:56
859
原创 JavaScript认识+JQuery的依赖引用
</head><body><script>// 函数定义// // 第二种写法// }sum(10,20);sum(10,30);sum(1)sum("10")</script></body></html>可以看到,和java定义函数大差不差,但是在传参这方面非常松,甚至可以多传或者少传,传入不类型。<head>
2025-07-15 13:40:55
1109
原创 HTML 初识
type(必须有),取值种类很多,button,checkbox,text,file,image,password,radio等.。如果不想要边框,我们可以在table接着添加其他的参数,如:cellspacing = "0"可以去掉空白线。test1.html是本机上的一个html文件,我们也可以通过指定本机的绝对路径或者是相对路径进行转跳。href内填的是网页的连接地址,target是转跳方式,在这里_blank是以新页面打开超链接。div是独占⼀⾏的,是⼀个⼤盒⼦,span不独占⼀⾏,是⼀个⼩盒⼦。
2025-04-18 23:51:20
956
原创 网络编程 套接字
就如同身份证一般,身份证上有着你的个人信息,是属于你的物品,即使弄丢了他还是属于你,而不是身份证长在你身上才是你的,离开了就不是了。DatagramSocket(int port):创建一个UDP的数据报套接字的Socket,绑定到本机的指定端口(一般用于服务端,区分同一个主机上不同的应用程序)将路由器/交换机转发的数据看出跑动的汽车,路由器/交换机看成一个一个的十字路口,当路由器/交换机需转发的数据量超过数据转发数据量的上限,就会出现。getPort():从接收的数据报中,获取发送端主机的端口号;
2025-04-14 00:47:03
1119
原创 网络原理
2:数据链路层会按照以太网协议将收集到的数据进行解析,把其中以太网的报头和报尾取出,再往上传递给网络层。用于通信双方发送接收数据格式的约定,是网络通讯的关键,就如同我们的语言一般,都说普通话,能让对方听得懂,亦或者外国说的英语,这就相当两套通信协议。路由器收到主机发送的数据时,会通过物理层、数据链路层、网络层解析,重新生成一个网络数据包,构造出以太网数据帧,进行二进制转换转发出去。4:IP协议继续调用数据连路层的api,把ip数据包交给数据连路层,在数据连路层,以太网协议会继续在网络层的数据包上加工。
2025-04-10 22:08:16
649
原创 文件IO 1(接上多线程14)
接上上一篇利用代码创建文件,这里则是利用代码删除文件 ://删除文件//在进程退出时候删除可以自行去运行一下,我们可以打开存放当前文件目录,观察变化,这里就不放图了,直接说结果:file1和file2同时被创建,但过了1秒后,file1被删除,再过了10秒,进程结束之后,file2才被删除。
2025-03-31 23:44:50
610
原创 多线程14(哈希表与文件操作IO)
将一个大任务分成多个子任务,使用多线程执行子任务,从而提高效率。那么如何衡量这些子任务都完成了呢?这就要用到CountDownLatch1:指定指定的参数,描述拆分的任务数量2:每个线程都执行完毕后,都执行一次CountDownLatch,当执行次数等于指定的参数时候,确认执行完毕。
2025-03-22 20:17:26
974
原创 多线程12(CAS带PV操作开头)
cas全程叫compare and swap,字面意思是比较交换。标准库中提供了 java.util.concurrent.atomic 包,⾥⾯的类都是基于这种⽅式来实现的. 典型的就是AtomicInteger类.其中的getAndIncrement相当于i++操作.将内存中的原数据看作V,寄存器1的值看作A,寄存器2的值看作B,那么她的运行逻辑是:步骤1.A与V比较。步骤2.若相等,B写入V。步骤3.返回值。
2025-03-09 22:39:13
1040
原创 多线程11(锁策略)
单独的读是始终线程安全的,但一旦设计到写方面就极大概率会出现线程安全问题,如果在读和写之间加上普通锁,那就意味着冲突会非常严重,极大拖慢线程效率。在JVM内部,会统计每个锁竞争的激烈程度,如果锁竞争激烈,那么synchronized就会按照挂起等待锁逻辑执行;锁之间的关系:无锁(synchronized)->偏向锁(两个及以上的线程)->轻量级锁(线程竞争过于激烈)->重量级锁。:预测在接下来的锁竞争非常激烈,针对这样的情况做一些额外的工作。:加锁的时候,预测接下来的锁竞争不激烈,不需要额外的工作。
2025-03-06 21:32:11
315
原创 多线程10(计时器)
在线程池中,最重要的目的就是往线程池里添加任务的操作(submit操作,任务是runnable)在运行完毕后,线程池里的线程还没有结束(前台线程),导致运行完提供的任务后线程还在阻塞,没有弹出停止。我们可以将前台线程设置为后台线程(t.setDaemon(true);)来结束他的影响。在使用线程池的时候,我们则可以通过shutdown();来关闭。shutdown() 方法是让在线程池中执行完正在执行的任务和队列中等待的任务后才彻底关闭,若后续还有任务试图加入队列,会执行拒绝策略。
2025-03-03 21:58:24
317
原创 多线程9
在put实现里面,队列满了就用this.wait阻塞,队列没满就用this.notify唤醒take线程的wait。take线程也同理,在空阻塞和不空唤醒put线程方法也是一样的。注意,wait线程不一定会被notify线程给唤醒,还有可能会被interrupt线程这种给错误唤醒的情况。在这前提下,throws InterruptedException的方法将异常外抛,不会出现错误,而我们用if配try catch方法,就会导致size是空或者满的时候阻塞被唤醒,接着往下走出现错误。
2025-02-26 21:22:17
700
原创 多线程8
阻塞队列有以下特性1.提供线程安全2.阻塞特性队列为空,出队列阻塞到队列被添加元素,队列为满,入队列阻塞到队列元素被取走。阻塞队列主要用于构建阻塞队列就是生产者消费者的链接场所。生产者将元素放入阻塞队列,消费者将元素从阻塞队列里拿出。
2025-02-24 22:56:46
347
原创 多线程7
例如,在t1线程已经经过了if判断和加锁解锁出来,线程切换到了t2,t2在进行判断的时候就发现instance不是null,没有在空间构造对象直接跳过来到内存空间的首地址赋值给引用变量。于是就会得到一个未初始化的变量。上面懒汉模式在多线程运行中,t1和t2先后运行,在两个线程在运行到if判断的时候都是空,t1先实例化了,但是由于t2已经通过的if判断,所以会覆盖原有的再实例化一次,开销也成倍增加。上述多线程运行的时候一个线程对在进行读操作,一个线程在进行写操作,由于内存优化,很容易出现内存可见性问题。
2025-02-24 10:54:02
329
原创 多线程6(接5)
在“多线程5”末尾提到线程安全我呢提,原因在于每个线程都有一个自己的内存,同时他们又共享一个主内存,当线程要循环读取主内存的变量的时候,线程就会把主内存的变量拷贝到自己的线程内存里面读取,所以后续对主内存进行修改,线程仍然在自己的线程内存里面读取之前拷贝过来的变量,感知不到主内存的变化。
2025-02-20 18:11:30
348
原创 多线程5(接4)
在敲代码的时候如果一不小心写出这样的锁中锁,,第一次加锁的时候,没人争抢可以顺利拿到。第二把锁却因为第一把锁没有释放掉,所以会阻塞等待,进入死等。或者两个线程都在试图抢锁对方的锁而进入死等,如下例子,两个锁都在试图抢夺对方没释放的锁,导致死等。这样的问题叫做死锁是一种非常严重的BUG,为了解决锁套娃这个问题,java中的synchronized引入了可重入锁的概念。所以,在运行第一串代码的时候,没有真正的产生死锁。:当某一个线程加锁成功后,在里面加锁,不会触发阻塞,可以继续往下走。
2025-02-08 14:27:54
445
原创 多线程4(接3)
在线程三中提到了线程安全,在下面代码中,t1和t2中都运行五万次,但是合计起的结果却没有十万次,并且每次运行结果都不一样这就是并发执行导致的线程安全。此时就是对的。这是因为count++这个过程可以详细拆分为三步:第一步是把寄存器也就是count的值存储到cpu里。(load)第二步就是将寄存器的值加一(add)第三步就是把寄存器的值返回(save)在t1和t2两个线程并发执行的时候,这三步不是一次性完成的,而是像下面的运行一样,出现结果被吞掉的事情。1.这个是操作系统决定的,我们解决不了。
2025-01-24 17:47:31
266
原创 多线程3 (书接上回:多线程2)
在这情况下,interrupted尝试去终止线程t。这是因为每次执行循环的时候,线程t绝大多数时间都在sleep中,在主线程调用interrupted,会唤醒sleep,然后sleep抛出异常,转入break语句。如果将break注释掉,就无法终止t线程。原因是调用interrupt会修改isInterrpted的标志位为true,但是sleep被唤醒后会将标志位修改回false。在没有break结束循环的话就会再次判断成功,开始循环。
2025-01-19 16:32:48
372
原创 多线程1
为了解决进程创建与销毁开销大的问题,我们引入了线程。线程的创建销毁的开销更小,能有效地节省计算机资源。线程和进程都相当于一个要执行的任务,但是二者的关系进程是操作系统分配资源的基本单位,在进程内部的多个线程会共享其内存资源和硬盘资源,第一个线程(和线程一起创建)创建的时候是会申请资源,后续创建线程不会再申请资源;在进程销毁的时候进程才会释放资源.在其中再有创建和销毁线程都不会申请和销毁资源。1.(提高稳定性)线程是CPU上调度执行的基本单位,具体怎样调度执行是由操作系统内部调度器执行。
2025-01-10 11:20:12
564
原创 笔记 String
String是字符串类型,C语言里面没有这个类型。对于内置类型,==比较的是变量中的值;对于引用类型==比较的是引用中的地址用equals来比较。比较字符串的大小要用s1和s2比,s1比s2要大那么会返回正数,小的话返回负数,相等返回0。与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值。
2024-06-09 22:58:42
657
原创 继承与多态2
在调用play这个方法的时候, 参数类型为 Animal (父类), 此时在该方法内部并不知道, 也不关注当前的引用指向的是哪个类型(子类)的实例。B 的构造方法中调用了 func 方法, 此时会触发动态绑定,会调用到 D 中的 func 此时 D 对象自身还没有构造,此时 num 处在未初始化的状态。3.访问权限不能比父类中被重写的方法的访问权限更低。注意:尽量不要在构造器中调用方法(如果这个方法被子类重写,就会触发动态绑定,但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。
2024-06-01 18:40:04
523
原创 个人介绍与学习目标
至于要怎么学习嘛……网上学习C语言的视频那么多,总能找到适合自己的老师,对吧。再适当发挥发挥传统优良品德死皮赖脸不懂就问,也能找到能回答我问题的前辈(*'▽'*)♪。时间对我来说还算比较充裕,目前也是无业游民一个?每天拿出三小时学习还是够的,也许会根据情况适当延长学习时间。学习C语言,我想到的是给自己编个小游戏分享出来,希望能被大家喜欢;假如,能学C语言到如火纯青的地步,我也会考虑要不要去大厂混混,比如腾讯´•ﻌ•`本人喜欢玩,热爱所拥有的一切。前段时间开始对C语言感兴趣,现在准备专攻C语言。
2023-11-20 21:52:07
140
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅