深入计算机语言之C++:C到C++的过度
🔑🔑博客主页:阿客不是客
🍓🍓系列专栏:从C语言到C++语言的渐深学习
欢迎来到泊舟小课堂
😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注
一、什么是C++
C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。
我们之前学习的C语言就是一种面向过程的语言,它强调事件的具体实现过程,一般以函数来具体实现。C++就是一门典型的面向对象的语言,它将问题分成多个对象,更强调对象与对象之间的联系。它完善了C语言的许多缺陷,并且引入了面向对象的程序设计思想,包括面向对象的四个特性:封装,继承,多态,抽象。
无论是面向过程还是面向对象的语言,都有其优缺点:
面向过程 | 面向对象 | |
---|---|---|
优点 | 流程化分工明确,效率高 | 结构化更清晰,易维护 |
缺点 | 可维护性差,扩展能力差 | 开销大,性能低 |
二、C++的标准库
标准的 C++ 由三个重要部分组成:
- 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。
- C++ 标准库,提供了大量的函数,用于操作文件、字符串等。
- 标准模板库(STL),提供了大量的方法,用于操作数据结构等。
这三个部分包含了C++这门语言的核心,我们后面的内容就主要围绕上面三个部分展开。
三、第一个C++程序
C++兼容C语言的大多数语法,所以C语言实现的 hello world 依旧可以运行,C++中需要把定义文件代码后缀改成.cpp,vs编译器看到是.cpp就会调用C++编译器,Linux下亚勇g++编译,不再是gcc。
当然C++有一套自己的输入输出,严格说C++版本的 hello world 应该是这么写:
// test.cpp
// 这⾥的std cout等我们都看不懂,没关系,下⾯我们会依次讲解
#include<iostream>
using namespace std;int main()
{cout << "hello world\n" << endl;return 0;
}
四、命名空间
4.1 域作用限定符
作用域限定符: " : ",其作用是通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。当左侧为空时,默认访问的就是全局域。
#include<iostream>int a = 1;int main()
{int a = 0;printf("%d\n", a);printf("%d\n", ::a);return 0;
}
我们知道C语言遵循局部优先的规则,即当局部变量与全局变量冲突时,默认使用局部变量。而在C++中,我们可以通过域作用限定符来访问全局变量。
输出结果为:
0
1
4.2 为什么要存在命名空间
在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决这样的问题。
#include<iostream>
#include<stdlib.h>
int rand = 1;
int main()
{printf("%d\n", rand);return 0;
}
当我们定义rand变量时,就会与stdlib库中的rand函数出现命名冲突,这在C语言中只能通过修改变量名称来解决。但是在C++中,我们可以就可以使用命名空间来解决。
4.3 命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
C++标准库都放在⼀个叫std(standard)的命名空间中。
4.3.1 正常的命名空间定义
namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。
#include<iostream>
#include<stdlib.h>
namespace ake
{int rand = 1;
}
int main()
{printf("%d\n", ake::rand);//使用域作用限定符,指定作用域return 0;
}
输出结果为 :1
4.3.2 命名空间的嵌套定义
namespace只能定义在全局,当然他还可以嵌套定义。
#include<iostream>
using namespace std;
namespace ake1
{int a = 1;namespace ake2//嵌套{int Add(int a, int b){return a + b;}}
}
int main()
{cout << ake1::a << endl;//访问通过限定符依次访问cout << ake1::ake2::Add(1, 1) << endl;return 0;
}
4.3.3 多文件中同名定义合并
在同一个工程中(可以是同一个工程下的不同文件),我们可以定义多个名称相同的命名空间,在编译时命名空间会自动合并,认为是⼀个namespace,不会冲突。
namespace ake
{int a = 1;
}
namespace ake
{int b = 1;
}
//编译时会自动合并
4.4 命名空间的使用
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
4.4.1 指定命名空间访问
这我们在前面已经实验演示过,现在我们来演示一下访问C++标准命名空间。(cout,endl等常用函数都被定义在C++标准命名空间std中)。
#include<iostream>
int main()
{std::cout << "hello bite" << std::endl;return 0;
}
指定命名空间访问,项⽬中推荐这种⽅式。
4.4.2 using 部分展开
在我们书写代码时,可能会频繁调用某个函数,这是我们可以使用using部分展开,来简化代码。使用方式为using 命名空间名称:: 成员。
#include<iostream>
#include<stdlib.h>
namespace ake
{int a = 1;int b = 2;
}using ask::a;int main()
{printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", a);printf("%d\n", ake::b);return 0;
}
项⽬中经常访问的不存在冲突的成员推荐这种⽅式
4.4.3 using namespace 全部展开
除了部分展开,自然也有全局展开。其格式为using namespace 命名空间名。
#include<iostream>
#include<stdlib.h>
namespace ake
{int a = 1;int b = 2;
}using namespace ask;int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}
五、C++的输入和输出
C++的标准输入与输出函数是cin与cout,分别对应C语言的printf与scanf。但是相较于C语言,C++输入输出并不需要指定占位符,如:%d,%c等,输出可以⾃动识别变量类型。
#include<iostream>
using namespace std;//展开命名空间
int main()
{cout << "hello world" << endl;//endl相当于换行符cout << "hello world" << '\n';cout << 'a' << endl;int b = 1;cout << b << endl;cout << &b << endl;return 0;
}
注:在C++中使用 cin 与 cout 以及 endl 都属于C++标准库,需要包含头文件iostream以及std标准命名空间。
六、缺省参数
6.1 缺省参数的使用
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参缺省值,否则使用指定的实参。
void func(int a = 0)
{cout << a << endl;
}
int main()
{func(); // 没有传参时,使用参数的默认值,输出0func(1); // 传参时,使用指定的实参,输出1return 0;
}
运行结果:
0
1
6.2 缺省参数的分类
根据其缺省参数的个数,我们我可以将缺省参数分为全缺省与半缺省。
6.2.1 全缺省
每一个参数都有缺省值。
#include<iostream>
using namespace std;
void func(int a = 0, int b = 1, int c = 2)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;;
}
int main()
{func();//不穿参数func(10, 20);//半传参数func(10, 20, 30);//全传return 0;
}
6.2.2 半缺省
只有一部分参数有缺省值,并且半缺省参数必须从右往左依次来给出,不能间隔着给。同时传参只能从左往右依次传参。
#include<iostream>
using namespace std;
void func(int a ,int b=1,int c=2)
{cout <<"a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
int main()
{func(10,20);//半传参数cout << endl;func(10, 20, 30);//全传return 0;
}
5.2.3 注意
在使用缺省参数时,我们也要知道一些注意事项:
1. 传参时不能间隔传参
void func(int a ,int b=1,int c=2)
{cout <<"a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}
func(,10,20)//error
2. 缺省参数不能在函数的声明和定义同时出现
//test.h
void Func(int a = 10);//声明
// test.cpp
void Func(int a = 20)//定义
{}
七、函数重载
函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
可以通过参数类型,参数个数,参数类型顺序来构成函数重载:
int Add(int a, int b)
{return a + b;
}
double Add(double a, double b)//类型不同
{return a + b;
}
int Add(int a, int b, int c)//个数不同
{return a + b;
}int Add(char a, int c)
{return a + c;
}
int Add(int a, char c)//类型顺序不同
{return a + c;
}
注意:
- 返回值类型不同无法构成函数重载
- 缺省值不同也不能构成函数重载
八、引用
8.1 引用的概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间 。其语法为:
引用对象类型& 引用变量名(对象名) = 引用实体;
引用类似于指针,因为指向同一块空间,所以改变引用变量引用实体也会改变。
#include<iostream>
using namespace std;
int main()
{int a = 1;int& b = a;//引用int& c = b;cout << &a << endl;cout << &b << endl;cout << &c << endl;c++;cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}
8.2 引用的特性
8.2.1 引用时必须初始化
int& b;//错误的,必须初始化int& b = a;
8.2.2 一个变量可以有多个引用(给别名取别名)
int a = 1;
int& b = a;
int& c = a;//多个引用
8.2.3 引用一旦引用一个实体,再不能引用其他实体
int a = 1;
int& b = a;
b = 2;//这时是赋值,相当于a = b = 2;
8.3 引用的使用
8.3.1 作为函数的参数
#include<iostream>
using namespace std;void swap(int& a, int& b)
{int z = a;a = b;b = z;
}int main()
{int a = 1, b = 2;swap(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}
8.3.2 做函数返回值
函数的返回值是存储在一个临时的变量里面。这个变量正常情况下是不可修改的,可以看作一个常量,我们不能对常量进行赋值。
但使用引用作为返回值相当于返回一个引用,没有中间拷贝过程和临时变量,进而同时改变了引用对象(func1(a))和被引用对象(a)。
#include<iostream>
using namespace std;int& func1(int& a)
{a++;return a;
}int main()
{int a = 1;func1(a) = 10;cout << a;return 0;
}
8.3.3 错误示范
1. 引用指向的空间栈帧销毁
int& func()
{int a = 0;return a;
}
返回了a的引用,但当离开函数,函数的栈帧销毁,相当于返回了一个野指针
2. 引用指向的函数多次调用
int& Add(int a, int b)
{int c = a + b;return c;
}
int main()
{int& ret = Add(1, 2);Add(3, 4);cout << ret <<endl;return 0;
}//输出什么
输出结果为:7
那是因为在第二次调用函数Add(3,4)时,会在原来第一次调用Add(1,2)建立栈帧的空间上建立栈帧所以返回值c的值会被重新覆盖,ret是指向Add所在位置的栈帧的别名,所以ret值也会发生改变。
8.4 const引用
8.4.1 对常变量的引用(权限不可放大)
我们可以通过 const 修饰引用来让其变为常引用。这时引用变量是不能被修改的,并且只能将常变量复杂给常引用,不能将常变量赋值给引用,必须用const来引用。
const int a = 10;
// 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &”
// 这⾥的引⽤是对a访问权限的放⼤
//int& ra = a;//这样才可以
const int& a = 10;
// 编译报错:error C3892: “ra”: 不能给常量赋值
//ra++;
8.4.2 const引用普通变量(权限可缩小)
const 引⽤也可以引⽤普通变量,因为对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤。
// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20; const int& rb = b;
// 编译报错:error C3892: “rb”: 不能给常量赋值
//rb++;
8.4.3 const可以引用含有常性的对象
含有常性的变量包括常数,函数返回值等。
const int& ra = 30;
int a = 1, b = 2;
const int& ra = a * 3;
const int& rb = a + b;
double d = 12.34;
// 编译报错:“初始化”: ⽆法从“double”转换为“int &”
// int& rd = d;
int rc = d;//隐式类型转换
const int& rd = d;
不需要注意的是类似 int& ra = a*3; int& rb = a + b; int& rd = d; 这样⼀些场景下 a*3 的运算结果和 a 保存在⼀个临时对象中。 int& rd = d 也是类似,引用时进行类型转换被称为隐式类型转换,在类型转换中会产⽣临时对象存储中间值。也就是此时,ra 和 rd 引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。
所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。
注:
const int a = 10;
int& ra = a;//权限放大
int rb = a;//权限没有放大
a处于一块临时对象,只拥有读取权限,没有写入权限,此时 int& ra 是指向a所在的空间(别名),要求读取和写入的权限,所以就产生了权限放大。第二个只是将 a 的值读取拷贝给 rb,并没有产生权限放大。
const 引用传参在未来学习模板类的时候会有进行运用。
8.5 引用与指针的区别
- 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个地址的变量,要开空间。
- 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
- 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
- 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
- sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
- 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。
九、内联函数
在C语言中,无论宏常量还是宏函数虽能提升程序运行效,但都有易出错,无法调试等缺陷。而C++为了弥补这一缺陷,引入了内联函数的概念代替宏函数。
以关键字inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
#include<iostream>
using namespace std;
inline int Add(int x, int y)
{return x + y;
}
int main()
{Add(1, 2);return 0;
}
vs编译器 debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下以下两个地⽅。
C/C++:常规——调试信息格式改成程序数据库,优化——内联函数扩展改成只适用于_inline
注意:
- 内联函数是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。内联函数的优势减少了调用开销,提高程序运行效率,缺陷就是可能会使目标文件变大。
- inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
- inline不能声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
因为内联函数会在调用时直接展开,编译器默认认为不需要地址,如果声明与定义分离内联函数的地址根本不会进入符号表,链接时就无法找到定义的函数,就会发生链接错误。
十、nullptr
在C语言中,定义了一个宏NULL,在传统的C头文件(stddef.h)中,可以看到如下代码 :
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
由此我们知道NULL既可以代表数字0,也可以代表空指针。这种模棱两可的定义就可能引出一些问题,比如下面这段代码:
#include<iostream>
using namespace std;
void func(int a)
{cout << "func(int)" << endl;
}
void func(int*p)
{cout << "func(int*)" << endl;
}
//函数重载
int main()
{func(0);func(NULL);func((int*)NULL);return 0;//输出??
}
我们的本意可能是将NULL当成一个指针,但是在默认情况下NULL被编译器当做数字0。这种问题是我们并不想看见的,所以C++11引入了nullptr来代替NULL。
C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。
相关文章:

深入计算机语言之C++:C到C++的过度
🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 一、什么是C C(c plus plusÿ…...

HR面试篇
一.面试中被问职业规划 HR感兴趣的不是你的职业规划,感兴趣的是你的职业规划和他们公司有没有关系。 或者说他们公司能不能去帮助你去实现你的职业规划。 切忌不要讲不合实际的,比如要在公司赚多少钱等等。 要根据公司的特点,找到切入点,只要讲得积极向上就可以。 二.…...

深度探索Kali Linux的精髓与实践应用
Kali Linux简介 Kali Linux作为全球网络安全领域的首选操作系统之一,其强大的功能性及广泛的适用范围令人瞩目。除了上述基础介绍外,让我们深入探究Kali Linux的几个关键特性及其在实际操作中的具体应用案例。 Kali工具集成:全面的安全工具…...

【在Linux世界中追寻伟大的One Piece】DNS与ICMP
目录 1 -> DNS(Domain Name System) 1.1 -> DNS背景 2 -> 域名简介 2.1 -> 域名解析过程 3 -> 使用dig工具分析DNS 4 -> ICMP协议 4.1 -> ICMP功能 4.2 -> ICMP报文格式 4.3 -> Ping命令 4.4 -> traceroute命令 1 -> DNS(Domain Na…...

信息安全工程师(41)VPN概述
前言 VPN,即Virtual Private Network(虚拟专用网络)的缩写,是一种通过公共网络(如互联网)创建私密连接的技术。 一、定义与工作原理 定义:VPN是依靠ISP(Internet Service Provider&…...

算法:双指针系列(一)
双指针系列 一、移动零(一)题目分析(二)代码展示二、复写零(一)题目分析(二)代码展示三、快乐数(一)题目分析(二)代码展示(…...

跟《经济学人》学英文:2024年09月28日这期 The curse of the Michelin star
The curse of the Michelin star Restaurants awarded the honour are more likely to close, research finds 原文: The twelve new restaurants added to the New York Michelin Guide this month, serving up cuisine ranging from “haute French” to “eco…...

Java Set 的介绍与实现原理
什么是 Set 在 Java 中,Set 是一种集合类型,它不允许重复的元素。Set 接口是 Java Collections Framework 的一部分,主要用于存储不重复的值。常见的实现类包括 HashSet、LinkedHashSet 和 TreeSet。 实现原理 1. HashSet HashSet 是最常…...

我谈均值平滑模板——给均值平滑模板上升理论高度
均值平滑(Mean Smoothing),也称为盒状滤波(Box Filter),通过计算一个像素及其周围像素的平均值来替换该像素的原始值,从而达到平滑图像的效果。 均值平滑通常使用一个模板(或称为卷…...

WordPress添加https协议致使后台打不开解决方法
由于删除WordPress缓存插件后操作不当,在加上升级处理,致使茹莱神兽博客的首页出现了https不兼容问题,WordPress后台也无法登陆,链接被误认为是定向重置次数过多,在网上找了好久的答案。 还有就是求助了好些人…...

如何使用pymysql和psycopg2执行SQL语句
在Python中,pymysql和psycopg2是两个非常流行的库,用于与MySQL和PostgreSQL数据库进行交互。本文将详细介绍如何使用这两个库来执行SQL查询、插入、更新和删除操作。 1. 准备工作 首先,确保已经安装了pymysql和psycopg2库。如果尚未安装&a…...

linux无法使用ll命令
ll命令是ls -l的别名,无法使用通常是该用户没有该别名配置,只需要简单添加即可使用 修改~/.bashrc # 备份 cp ~/.bashrc ~/.bashrc.source # 编辑 vim ~/.bashrc添加如下内容 # 别名 alias llls -l加载配置 source ~/.bashrc...

STM32输入捕获模式详解(上篇):原理、测频法与测周法
1. 前言 在嵌入式系统的开发过程中,常常需要对外部信号进行精确的时间测量,如测量脉冲信号的周期、频率以及占空比等。STM32系列微控制器提供了丰富的定时器资源,其中的输入捕获(Input Capture, IC)模式能实现对信号的…...

面试中遇到的关于Transformer模型的问题有哪些?
Transformer是深度学习中极具影响力的模型架构之一,广泛应用于自然语言处理、计算机视觉等领域。它通过自注意力机制和并行计算等特点,取得了比传统模型(如RNN、LSTM)更优异的性能。本文将针对Transformer的多个关键问题进行详细探…...

【UE】自动添加Megascans所有资产到自己的账户
1. 复制如下代码: ((async (startPage 0, autoClearConsole true) > {const getCookie (name) > {const value ; ${document.cookie};const parts value.split(; ${name});if (parts.length 2) return parts.pop().split(;).shift();}const callCacheA…...

【函数】4.函数的单调性
本节课没有笔记示例,自己做好笔记! 复合函数的单调性 最值 没讲 提醒我...
网格剖分-耳切法效果展示
1.前言 将简单多边形转换成一组由同样顶点组成的三角形集合是计算机图形学中的一个经典问题。问题中,简单多边形是指由一组有序顶点组成的,点V0~点Vn-1。相邻的顶点之间通过边(Vi,Vi-1)连接,并且边(Vn-1,V0)连接起始点…...

电磁力、强相互作用力、弱相互作用力、强核力,以及它们之间的关系
电磁力、强相互作用力、弱相互作用力、强核力,以及它们之间的关系: 电磁力 (Electromagnetic Force): 定义:电磁力是带电粒子之间通过电荷相互作用产生的力。它由电场和磁场共同作用,影响带电粒子的运动。传递粒子:电磁…...

2.安装keepalived详细过程
1.下载地址: keepalived-2.3.1 keepalived-2.1.2 keepalived-2.0.18 三个版本tar包 2.keepalived安装详细过程 (1) 解压keepalived tar包 tar -zxvf keepalived-2.0.18.tar.gz(2)进入keepalived目录然后配置 #进入keepalived目录 cd keepalived-2.0.18/ #配置keepalived[配…...

面试题1-fail-safe机制与fail-fast 机制
1.定义 Fail-safe 和 Fail-fast,是多线程并发操作集合时的一种失败处理机制。 1.1.Fail-Safe机制 1.1.1.定义 Fail-Safe 机制的设计目标是在发生故障时,系统仍然能够继续运行,尽量避免导致整个系统崩溃。即使发生错误或异常,系统…...

C/C++复习(一)
1.sizeof 关于sizeof我们是经常使用的,所以使用方法就不需要提及了,这里我们需要注意的是,sizeof 后面如果是表达式可以不用括号,并且sizeof实际上不参与运算,返回的是内容的类型大小(size_t类型࿰…...

iOS Object-C 将数组倒置(倒叙)
使用NSArray自带的对象方法:reverseObjectEnumerator 代码如下: NSArray * tempArray [[NSArray alloc]initWithObjects:"a","b","c","d", nil]; //将tempArray转换成["d","c","b","a"]; …...

动态轻量级线程池项目
动态线程池: 使用线程池ThreadPoolExecutor过程中你是否有以下痛点呢? ① 代码中创建了一个ThreadPoolExecutor,但是不知道参数设置多少比较合适。 ② 凭经验设置参数值,上线后发现需要调整,改代码重新发布服务&…...

【AI知识点】批归一化(Batch Normalization)
更多AI知识点总结见我的专栏:【AI知识点】 AI论文精读、项目和一些个人思考见我另一专栏:【AI修炼之路】 有什么问题、批评和建议都非常欢迎交流,三人行必有我师焉😁 批归一化(Batch Normalization,BN&…...

【低代码】前端低代码开发日记2:遇到的问题(1)双向绑定
在前期的快速迭代阶段,虽然界面有些杂乱,但整体功能尚能凑合运行。真正让人头疼的,还是接下来几个关键功能的实现。 遇到的问题 双向绑定 在Vue中,v-model提供了方便的双向绑定功能,它是modelValue属性和onUpdate:m…...

10.9作业
1、鼠标和键盘事件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QMouseEvent>widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this);this->setWindowFlag(Qt::Fram…...

Go 语言中的错误和异常:设计理念与优势
Go 语言中的错误和异常:设计理念与优势 在软件开发中,错误处理是一个至关重要的环节。不同的编程语言对于错误和异常的处理方式各有不同。Go 语言将错误和异常进行了明确区分,这种设计理念带来了许多独特的优势。本文将深入探讨 Go 语言中错误…...

sqli-labs less-20 less-21 less-22 cookie注入
COOKIE 作用:是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络行为有关,记录了当前用户的状态 形式:keyvalue 例如:当我们登录某个账号后,服务器会在cookies进行记录 个人理解…...

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决
1.File is read-only”可能原因 写代码时想要修改这个静态变量的值,把这个语句注释掉,发现在这个文件中File is read-only无法编辑修改,于是想去掉这个状态 网上查看的解释大多是在File栏目或File->File Properties下可以找到Make File W…...

MySQL【知识改变命运】03
表的基本操作 1:查看所有表2:创建表3:查看表结构4:修改表5: 删除表 前言:我们先了解一个知识: MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…...