C++常见概念
第一个 C++ 程序
#include<iostream>using namespace std;int main()
{cout << "helloworld" << endl;return 0;
}
命名空间
#include<stdio.h>int rand = 10;int main()
{printf("%d", rand);return 0;
}
#include<stdio.h>
#include<stdlib.h>int rand = 10;
//编译报错:error C2365:
//“rand”: 重定义;以前的定义是“函数”int main()
{printf("%d", rand);return 0;
}
在 C 语言中,有大量的变量和函数存在于全局作用域中,可能会导致很多的命名冲突。因此,C++ 中引入命名空间的目的是对这些标识符的名称进行本地化,以避免命名冲突和名字污染。
namespace
定义命名空间,需要使用`namespace`关键字。命名空间中可以定义变量、函数、类型等。namespace namespace_name
{//成员
}
namespace
的本质是定义一个命名空间域,这个域跟全局域各自独立,不同的域可以定义同名变量。C++ 中,域包括函数局部域,全局域,命名空间域,类域。其中,局部域和全局域不仅会影响编译查找逻辑,还会影响变量的生命周期;而命名空间域和类域不影响变量生命周期。
域影响的是编译时语法查找一个变量/函数类型出处的逻辑,所以有了域的隔离,命名冲突得以解决。
编译查找的逻辑:
- 先局部,后整体
- 指定域查找
namespace
只能定义在全局中。namespace
支持嵌套定义。- 项目工程中多文件中定义的同名
namespace
会认为是同一个namespace
,不会冲突。
命名空间的使用
编译时查找一个变量的定义/声明时,默认只会在局部域或全局域中寻找。我们要使用命名空间中定义的变量/函数,有一下三种方式:- 指定命名空间访问
使用域作用限定符::
#include<iostream>using namespace std;int a = 10;namespace space
{int a = 0;int b = 1;
}int main()
{int a = 20;cout << ::a << endl;//全局域,输出 20cout << a << endl;//局部域,输出 10cout << space::a << endl;//命名空间域,输出 0return 0;
}
- 展开命名空间中的全部成员
使用using namespace
指令展开命名空间,这样在使用命名空间时就可以不用在前面加上命名空间的名称。
using namespace namespace_name;
#include<iostream>using namespace std;namespace space
{int a = 0;int b = 1;
}using namespace space;int main()
{cout << a << endl;return 0;
}
- 展开命名空间中的某个成员
使用using
指令展开命名空间中的某个成员。
using namespace_member_name;
#include<iostream>using namespace std;namespace space
{int a = 0;int b = 1;
}using space::a;int main()
{cout << a << endl;cout << space::b << endl;return 0;
}
注意:使用using
展开时,在存在同名变量的情况下,若存在局部域变量,则局部域变量的优先级最高;若仅存在全局域变量与命名空间变量,会报错。
#include<iostream>using namespace std;int a = 10;namespace space
{int a = 0;int b = 1;
}using namespace space;int main()
{int a = 20;cout << a << endl;//输出 20return 0;
}
#include<iostream>using namespace std;int a = 10;namespace space
{int a = 0;int b = 1;
}using namespace space;int main()
{cout << a << endl;//编译报错:error C2872//“a”: 不明确的符号return 0;
}
输入与输出
iostream.h
是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
在 C++ 中,标准库都放在名为std
的命名空间中。
std::cin
是iostream
类的对象,它主要面向窄对象(char
类型的变量)的标准输入流。std::cout
是iostream
类的对象,它主要面向窄字符的标准输出流。std::endl
是一个函数,在流插入输出时,相当于插入一个换行符并刷新缓冲区。<<
是流插入运算符,>>
是流提取运算符号。
C++ 的输入输出方式相较于scanf
和printf
,C++ 的输入输出可以自动识别变量类型(本质通过函数重载实现),并且能够更好的支持自定义类型对象的输入和输出。
#include<iostream>using namespace std;int main()
{int a = 0;double b = 0.1;char c = 'x';cin >> a >> b >> c;cout << a << " " << b << " " << c << endl;return 0;
}
注意:
在VS2022
编译器中,iostream
编译器中间接包含了scanf
和printf
函数,因此没有包含stdio.h
也可以使用scanf
和printf
函数,但其他编译器可能会报错。
#include<iostream>
using namespace std;
int main()
{// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码// 可以提⾼C++IO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
}
缺省参数
缺省参数是声明或定义函数时**为函数的参数指定一个缺省值**。在调用该函数时,如果**没有指定实参,则采用该形参的缺省值,否则使用指定的实参**。缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
- 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++ 规定,半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
- 带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。
- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须在函数声明中给缺省值。
#include<iostream>using namespace std;void Func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}void Func2(int a, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);//不支持Func1(,,3)Func2(1);Func2(1, 2);Func2(1, 2, 3);
}
例如在栈的实现中,我们便可以通过使用缺省参数来简化栈的初始化。
Stack.h
Stack.c
#include<iostream>
#include<assert.h>typedef int STDataType;typedef struct Stack
{STDataType* arr;int top;int capacity;
}ST;void STInit(ST* ps, int n = 4);
#include"Stack.h"void STInit(ST* ps, int n)
{assert(ps);STDataType* tmp = (STDataType*)malloc(n * sizeof(STDataType));if (tmp == NULL){perror("malloc");exit(1);}ps->arr = tmp;ps->top = 0;ps->capacity = n;
}
通过缺省参数,在我们已知所需要的内存时,就不需要反复扩容,能够提升代码运行效率;在不能预知所需要的参数时,则不传入n
的值,开辟4 * sizeof(STDataType)
个字节的空间。
函数重载
C 语言是支持同一作用域中出现同名函数的。C++ 支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同、类型不同或者参数类型顺序不同。这样 C++ 函数调用就表现出了多态行为,使用更灵活。
// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}
double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}// 2、参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
易错:
// 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}//下⾯两个函数构成重载
//但是调⽤时,会报错
//在不输入参数的情况下,存在歧义,编译器不知道调⽤谁
void f1()
{cout << "f()" << endl;
}
void f1(int a = 10)
{cout << "f(int a)" << endl;
}
引用
概念与定义
引用是给**已存在的变量**取一个别名,编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。类型 & 引用别名=引用对象;
#include<iostream>using namespace std;int main()
{int a = 0;int& b = a;int& c = b;//c也相当于是a的引用c++;//a,b,c的值相同cout << a << " " << b << " " << c << endl;//a,b,c的地址相同cout << &a << endl;cout << &b << endl;cout << &c << endl;return 0;
}
引用的特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用不能改变指向,一旦引用一个实体,就不能再引用其他实体
#include<iostream>using namespace std;int main()
{int a = 10;int& b = a;//int& b;//编译报错:“b” :必须初始化引⽤int c = 20;b = c;//此处并非让b引用c,因为C++中引用不能改变指向//此处是一个赋值cout << a << " " << b << endl;//输出 20 20//a和b的地址与c不同cout << &a << endl;cout << &b << endl;cout << &c << endl;return 0;
}
引用的使用
引用在实践中主要用于引用传参和引用做返回值,使得减少拷贝提高效率和改变引用对象的同时改变被引用对象。
- 引用传参和指针传参的功能是类似的,且引用传参相对更加方便。
- 在部分 C 语言实现的数据结构中,可以使用 C++ 引用代替指针传参,在需要使用二级指针等复杂的指针时,可以简化程序。
#include<iostream>using namespace std;void swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}int main()
{int a = 1;int b = 2;swap(&a, &b);cout << a << " " << b << endl;swap(a, b);cout << a << " " << b << endl;return 0;
}
- 引用作返回值,能够对返回对象进行修改。
#include<iostream>
#include<assert.h>using namespace std;//使用引用来实现栈
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;int capacity;
}ST;void STInit(ST& rs, int n = 4)
{rs.arr = (STDataType*)malloc(n * sizeof(STDataType));rs.top = 0;rs.capacity = n;
}void STPush(ST& rs, STDataType x)
{assert(rs.arr);if (rs.top == rs.capacity){int newcapacity = rs.capacity == 0 ? 4 : 2 * rs.capacity;STDataType* tmp = (STDataType*)realloc(rs.arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("malloc");exit(1);}rs.arr = tmp;rs.capacity = newcapacity;}rs.arr[rs.top++] = x;
}//...int& STTop(ST& rs)//返回的是别名,是一个左值,能够修改返回对象
{assert(rs.arr);return rs.arr[rs.top - 1];
}
/*
int STTop(ST& rs)
编译报错:“+=” :左操作数必须为左值
返回值为拷贝的临时变量,是一个右值,具有常性
*/int main()
{ST st1;STInit(st1);STPush(st1, 1);STPush(st1, 2);STPush(st1, 3);cout << STTop(st1) << endl;STTop(st1) += 10;cout << STTop(st1) << endl;return 0;
}
int& func(int x, int y)
{return x + y;
}
//结果将产生野引用
注意:不是所有的函数都可以将引用作为返回值。
STTop
函数结束,栈帧销毁,但STTop
的返回对象不在栈帧中,可以将引用作为返回值。
Func
函数结束,栈帧销毁,但Func
的返回对象在帧帧中,不可以将引用作为返回值。
const引用
> + 引用一个`const`对象必须用`const`引用,但是`const`引用可以引用普通对象。这是因为**对象的访问权限可以缩小,但不能变大**。 > + 临时对象就是编译器需要一个空间暂存值时临时创建的一个未命名的对象, C++ 中把这个未命名对象叫做临时对象。 临时对象包括**函数传值返回**,**表达式运算**和**类型转换**。C++ 中规定,临时对象具有常性,因此使用普通引用将会触发权限放大,必须要使用常引用。 >#include<iostream>using namespace std;int main()
{const int a = 10;const int& ra = a;//int& ra = a;//编译报错:error C2440 : “初始化” :⽆法从“const int”转换为“int& ”//这⾥的引⽤是对a访问权限的放⼤//ra++;//编译报错:error C3892 : “ra”:不能给常量赋值int b = 20;const int& rb = b;//这里的引用是对b访问权限的缩小//但是并不会印象b的访问权限//rb++;//编译报错:error C3892 : “rb”:不能给常量赋值int c = 10;const int& rc = 3 * c;//int& rc = 3 * c;//编译报错: “初始化” :⽆法从“int”转换为“int& ”double d = 12.34;const int& rd = d;//int& rd = 3 * d;//编译报错: “初始化” :⽆法从“double”转换为“int& ”return 0;
}
指针和引用
C++ 中指针和引用的功能有重叠性,但是各有自己的特点,互相不可替代。
- 语法概念上引用是一个变量的取别名,不开辟新的空间,而指针是存储一个变量地址,需要开辟新的空间。
- 引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
- 引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。
- 引用可以直接访问指向对象,指针需要解引用才是访问指向对象。
sizeof
中,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。- 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。
inline
用`inline`修饰的函数叫做内联函数,编译时 C++ 编译器会在调用的地方展开内联函数,这样调用内联函数就不需要建立栈帧,可以提高效率。
inline
对于编译器而言只是一个建议,也就是说,加了inline
,编译器也可以选择在调用的地方不展 开。不同编译器关于inline
什么情况展开的情况各不相同,因为 C++ 标准没有规定。一般而言,inline
适用于频繁调用的短小函数。对于递归函数或代码多些的函数,加上inline
,也会被编译器忽略。- C语言 实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不方便调试,C++ 设计了
inline
目的就是替代 C 语言 的宏函数。 在 C++ 中,通常会使用inline
代替的 C 语言中的宏函数,使用const
和enum
替代 C 语言中的宏常量。vs2022
的debug
版本下默认是不展开inline
的,这样方便调试,debug
版本想展开,需要设置一下 以下两个地方。
inline
存在的问题是一定程度会让编译后的可执行程序变大。
#include<iostream>using namespace std;inline int ADD(int x, int y)
{int ret = x + y;return ret;
}int main()
{//可以通过汇编观察程序是否展开//有call ADD语句则说明没有展开//函数编译好后变为一串指令//函数的地址就是第一行指令的地址//call的本质就是跳跃过去执行指令int ret = ADD(2, 3);cout << ret << endl;return 0;
}
#include<iostream>using namespace std;int ADD(int x, int y)
{int ret = x + y;return ret;
}int main()
{int ret = ADD(2, 3);cout << ret << endl;return 0;
}
inline
不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline
被展开不是调用,因此内联函数不会进入符号表,就找不到内联函数的函数地址,链接时会出现报错。因次,内联函数一般直接定义在.h
文件中。
`nullptr`
`NULL`实际是一个宏,在`stddef.h`中,可以看到以下代码:#ifndef NULL#ifdef __cplusplus#define NULL 0 #else#define NULL ((void*)0) #endif
#endif
#include<iostream>
using namespace std;void f(int x)
{cout << "f(int x)" << endl;
}
void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}
int main()
{f(0);f(NULL);//本想通过f(NULL)调⽤指针版本的f(int*)函数//但是由于NULL被定义成0,调⽤了f(intx),因此与程序的初衷相悖。f((int*)NULL);//需要强制类型转换才能调用函数// f((void*)NULL);// 编译报错:error C2665 : “f”: 2个重载中没有⼀个可以转换所有参数类型f(nullptr);return 0;
}
C++ 中NULL
可能被定义为字面常量 0
,或者 C 中被定义为无类型指针(void*)
的常量。不论采取何种定义,在使用空值的指针时,不可避免的会遇到一些麻烦。
C++11 中引入nullptr
,nullptr
是⼀个特殊的关键字,nullptr
是⼀种特殊类型的字面量,它可以转换 成任意其他类型的指针类型。使用nullptr
定义空指针可以避免类型转换的问题,因为nullptr
只能被隐式地转换为指针类型,而不能被转换为整数类型。
相关文章:

C++常见概念
第一个 C 程序 #include<iostream>using namespace std;int main() {cout << "helloworld" << endl;return 0; }命名空间 #include<stdio.h>int rand 10;int main() {printf("%d", rand);return 0; }#include<stdio.h> #…...

结构型模式---享元模式
概念 享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态:就…...

2025年渗透测试面试题总结- 深某服-漏洞研究员实习(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 深信服-漏洞研究员实习 1. 在XX实习时做了什么 2. 渗透测试的思路简单描述 3. 护网中承担什么角色 4…...

(13)Anaconda 安装配置详解
1. Anaconda 简介 Anaconda 是一个用于科学计算和数据分析的 Python 发行版,它集成了 Python 解释器、大量常用的科学计算库以及强大的包管理工具。 2. Anaconda 主要特点 丰富的库集合:包含了超过 1500 个用于科学计算、数据分析、机器学习等领域的常用 Python 库,例如 N…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革
随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…...

[内网安全] Windows 域认证 — Kerberos 协议认证
🌟想系统化学习内网渗透?看看这个:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Kerberos 协议简介 Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…...

[Computer Vision]实验七:图像检索
目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”(vision vocabulary) 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…...

C++之thread_local变量
C之thread_local变量_c threadlocal-CSDN博客 thread_local简介 thread_local 是 C11 为线程安全引进的变量声明符。表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在…...

【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!
🗺️博客地图 📍一、下载地址 📍二、 系统安装 本文基于Windows操作系统vmware虚拟机安装 一、下载地址 官网:产品试用申请国产操作系统、麒麟操作系统——麒麟软件官方网站 下载自己需要的版本,完成后,…...

(接“使用js去复制网页内容的方法”)js中的execCommand怎么复制富文本内容解析
document.execCommand(copy) 是传统的剪贴板操作方法,但它主要用于复制纯文本内容。如果你想复制富文本内容(包括 HTML 标签和样式),需要结合一些技巧来实现。以下是具体方法: 方法:通过创建隐藏的富文本元…...

npm ERR! code 128 npm ERR! An unknown git error occurred
【问题描述】 【问题解决】 管理员运行cmd(右键window --> 选择终端管理员) 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因,这里执行npm install --registryhttps:…...

解决Leetcode第3470题全排列IV
3470.全排列IV 难度:困难 问题描述: 给你两个整数n和k,一个交替排列是前n个正整数的排列,且任意相邻两个元素不都为奇数或都为偶数。 返回第k个交替排列,并按字典序排序。如果有效的交替排列少于k个,则…...

MyBatis 配置文件核心
MyBatis 配置文件核心标签解析 以下是针对你的笔记中的三个核心标签的详细解析,帮助你全面理解它们的用途和配置逻辑。 1. properties 标签:动态加载外部配置 功能 将环境相关的配置(如数据库连接、密钥等)与 MyBatis 核心配置…...

bert模型笔记
1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型,Base和Large。Uncased是意味着输入的词都会转变成小写,cased是意味着输入的词会保存其大写(在命名实体识别等项目上需要)。Multilingual是支持多语言的࿰…...

微信小程序接入deepseek
先上效果 话不多说,直接上代码(本人用的hbuilder Xuniapp) <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…...

推荐算法和推荐系统入门第一趴
以下是推荐系统技术总结的架构梳理和建议表达思路: 从原理到生产环境:推荐系统核心技术与实战代码解析 一、推荐算法的演进图谱 传统算法三剑客 ![推荐系统算法分类示意图] (使用Mermaid绘制算法分类关系图,清晰展示技术演进&am…...

unity pico开发 四 物体交互 抓取 交互层级
文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部(LeftHandController)添加XRDirInteractor脚本 并添加一个球形碰撞盒,勾选isTrigger,调整大小为0.1 …...

基于深度学习的青花瓷图像检索系统开发与实现
目录 1.研究背景与目的 1.1课题背景 1.2研究目的 二、调研资料情况 2.1图像分割研究现状 2.2图像检索调研 2.2.1选择深度学习进行检索的原因及优势 2.2.2基于深度学习的图像检索技术的发展 2.2.3基于深度学习的图像检索的研究重点 2.3基于深度学习的图像检索方法调研 …...

uniapp 系统学习,从入门到实战(八)—— Vuex 的使用
全篇大概 4500 字(含代码),建议阅读时间 30min 📚 目录 Vuex核心概念解析在 UniApp 中集成Vuex状态管理与数据共享实践总结 一、Vuex 核心概念解析 1.1 什么是状态管理 在跨多组件的大型应用中,不同页面/组件需要共享和修改相同数据时&am…...

Vue Hooks 深度解析:从原理到实践
Vue Hooks 深度解析:从原理到实践 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 Vue Hooks 深度解析:从原理到实践一、背景…...

django中序列化器serializer 的高级使用和需要注意的点
在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

靶场(二)---靶场心得小白分享
开始: 看一下本地IP 21有未授权访问的话,就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…...

PHP Error处理指南
PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...

视频输入设备-V4L2的开发流程简述
一、摄像头的工作原理与应用 基本概念 V4L2的全称是Video For Linux Two,其实指的是V4L的升级版,是linux系统关于视频设备的内核驱动,同时V4L2也包含Linux系统下关于视频以及音频采集的接口,只需要配合对应的视频采集设备就可以实…...

【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
DeepSeek 之后,又一个AI沸腾,冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨,全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队(隶属中国夜莺科技)推出的“全球首款通用AI…...

Mybatis集合嵌套查询,三级嵌套
三个表:房间 玩家 玩家信息 知识点:Mybatis中级联有关联(association)、集合(collection)、鉴别器(discriminator)三种。其中,association对应一对一关系、collectio…...

thinkphp5.1 在fetch模版就超时
场景 当被渲染模版不存在,请求不响应任何内容,过一会就timeout 排查过程 使用xdebug,追踪代码,发现走到D:\temporary_files\m40285_mini\40285_mini\thinkphp\library\think\exception\Handle.php,进入死循环,一直…...

Dockerfile 深入浅出:从基础到进阶全解析
Dockerfile 深入浅出:从基础到进阶全解析 各位同学,大家好!欢迎来到今天的 Dockerfile 课程。Docker 技术在当今的软件开发和部署领域可以说是非常热门,而 Dockerfile 作为构建 Docker 镜像的关键文件,掌握它对于我们…...

CAD2025电脑置要求
Windows 系统 操作系统:64 位 Microsoft Windows 11 和 Windows 10 version 1809 或更高版本。 处理器 基本要求:2.5-2.9GHz 处理器,不支持 ARM 处理器。 推荐配置:3GHz 以上处理器(基础),4GHz …...

android App主题颜色动态更换
如何在Android开发中更换主题颜色,现在他们又问了关于动态更换应用主题颜色的问题。看来他们可能在实现过程中遇到了困难,或者需要更详细的动态切换指导。首先,我需要回顾之前的回答,看看是否已经覆盖了动态切换的部分,…...