C++第一弹 -- C++基础语法上(命名空间 输入输出 缺省参数 函数重载 引用)

news2024/11/26 14:33:12

目录

  • 前言
  • 一. C++关键字(C++98)
  • 二. 命名空间
    • 1.命名空间的定义
    • 2.命名空间的使用
    • 3.其它部分
  • 三. C++输入&输出
  • 四. 缺省参数
    • 1. 缺省参数的概念
    • 2.缺省参数的分类
  • 五. 函数重载
    • 1.函数重载的概念
    • 2. 为什么C++支持函数重载, 而C语言不支持重载呢?
  • 六. 引用
    • 1.引用的概念
    • 2.引用的特性
    • 3.常引用
    • 4.引用场景
    • 5.引用和指针的区别

前言

C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,本篇将介绍C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等, 为后续类和对象学习打基础

更多好文点击 博客主页: 酷酷学!!! 期待您的关注!


正文开始

一. C++关键字(C++98)

C++总计63个关键字,C语言32个关键字

ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再细讲。

在这里插入图片描述

二. 命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域或者局部作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。

使用命名空间也可以很好的解决我们和库之间或者多个程序员在进行一个项目时, 名称重复的问题, 如下面这个例子

#include<stdio.h>
#include<stdlib.h>

int rand = 10;

int main()
{
	printf("%d\n", rand);
	return 0;
}

这里会报错, 因为rand已经在<stdlib.h>头文件中定义过, 所以再次定义全局变量rand, 作用域都是全局, 会导致名称重复, C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决.

在这里插入图片描述

编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

1.命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

注意: 这里和结构体的区别在于结构体{}后有; 而命名空间没有

  1. 正常的命名空间的定义

命名空间可以定义变量/函数/类型

#include<stdio.h>
#include<stdlib.h>

//int rand = 10;

namespace kkx
{
	int rand = 10;

	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		struct Node* next;
		int val;
	};
}

int main()
{
	//int rand = 20;
	printf("%d\n", kkx::rand);
	return 0;
}
  1. 命名空间可以嵌套
//test.cpp
namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}

	namespace N2
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
  1. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中.

PS:一个工程中的test.h和上面的test.cpp中两个N1会被合并成一个

//test.h
namespace N1
{
	int Mul(int left, int right)
	{
		return left * right;
	}
}

2.命名空间的使用

命名空间中成员该如何使用呢?比如:

namespace N
{
	int a = 10;
	int b = 1;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		struct Node* next;
		int val;
	};
}

int main()
{
	printf("%d\n", a);
	return 0;
}
// 编译报错:error C2065: “a”: 未声明的标识符

编译默认查找
a、当前局部域 : 自留地
b、全局域找 : 村子野地
不会到其他命名空间中去找

命名空间的使用有三种方式:

  • 加命名空间名称及作用域限定符
int main()
{
    printf("%d\n", N::a);
    return 0;    
}
  • 使用using将命名空间中某个成员引入
using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;    
}
  • 使用using namespace 命名空间名称 引入

编译默认查找
/a、当前局部域 : 自留地
b、全局域找 : 村子野地
c、到展开的命名空间中查找 : 相当于张大爷在自己的自留地加了声明,谁需要就来摘

using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

3.其它部分

  • 不同域中可以存在同名的变量, 编译器默认会使用局部变量, 但是如果想使用全局变量时, 不写空间名称直接写作用域限定符即表示访问全局变量
int rand = 10;
int main()
{
	int rand = 20;
	printf("%d\n", ::rand);
	return 0;
}
  • 使用using namespace固然好用, 但不宜过度用, 不同命名空间中有相同的名称, 全部展开, 编译器会报错,例如

namespace N1
{
	int a = 10;
	int b = 1;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		struct Node* next;
		int val;
	};
}
namespace N2
{
	int a = 10;
	int b = 1;
	int Add(int left, int right)
	{
		return left + right;
	}

	struct Node
	{
		struct Node* next;
		int val;
	};
}
using namespace N1;
using namespace N2;

三. C++输入&输出

C++的输入输出需要包含头文件 < isotream > , 直接使用cout(console out 从控制台输出) 和 endl(end line 换行) 会发生报错, 这是因为官方为避免与我们自己定义的名称和库重复, 所以将库的函数名称包含在了std命名空间里面, 所以我们如果使用需要按照命名空间的使用方法使用std

#include<iostream>

int main()
{
	cout << "Hello World!!!" << endl;
	return 0;
}

在这里插入图片描述

正确用法:

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
	cout<<"Hello world!!!"<<endl;
	return 0;
}

//或者

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using std::cout;
using std::endl;
int main()
{
	cout<<"Hello world!!!"<<endl;
	return 0;
}

说明:

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理。

注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。

#include <iostream>
using namespace std;

int main()
{
	int a;
	double b;
	char c;

	// 可以自动识别变量的类型
	cin >> a;
	cin >> b >> c;

	cout << a << endl;
	cout << b << " " << c << endl;
	return 0;
}

ps:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我们再配合文档学习

std命名空间的使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

四. 缺省参数

1. 缺省参数的概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

void Func(int a = 0)
{
	cout << a << endl;
}

int main()
{
	Func();// 没有传参时,使用参数的默认值
	Func(10);// 传参时,使用指定的实参
	return 0;
}

2.缺省参数的分类

  • 全缺省参数
 void Func(int a = 10, int b = 20, int c = 30)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
  • 半缺省参数
 void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }

传值时只能顺序传,不能跳着传

int main()
{
	F2(1, 2, 3);
	F2(1, 2);
	F2(1);
	F2();

	// 必须顺序传,不能跳跃着传
	// F2(1, ,2);

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现, 如果缺省参数的声明和定义分离, 以声明的值为主.
  //a.h
  void Func(int a = 10);
  
  // a.cpp
  void Func(int a = 20)
 {}
  
  // 注意:注意:如果生命与定义位置同时出现,以声明为主
  1. 缺省值必须是常量或者全局变量
  2. C语言不支持(编译器不支持)

五. 函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

1.函数重载的概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

即同一作用域, 参数个数不同, 参数类型不同, 类型顺序不同, 三种情况构造重载关系

#include<iostream>
using namespace std;

//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 << "void f(int a)" << endl;
}

//3.参数类型顺序不同

void f(int a, char b)
{
	cout << "void f(int a, char b)" << endl;
}

void f(char a, int b)
{
	cout << "void f(char a, int b)" << endl;
}

int main()
{
	Add(10, 20);
	Add(10.1, 20.2);

	f();
	f(10);

	f(10, 'a');
	f('a', 10);
	return 0;
}

不同作用域, 可以同名
同一作用域, 可以同名, 满足重载规则

 //不同作用域 可以同名
namespace N1
{
	void Swap(int* pa, int* pb)
	{
		cout << "void Swap(int* pa, int* pb)" << endl;
	}
}

namespace N2
{
	void Swap(int* px, int* py)
	{
		cout << "void Swap(int* pa, int* pb)" << endl;
	}
}


// 同一作用域 可以同名,满足重载规则
void Swap(double* pa, double* pb)
{
	cout << "void Swap(double* pa, double* pb)" << endl;
}

using namespace N1;
using namespace N2;
// 他们两依旧是ok,不是重载关系

int main()
{
	int a = 0, b = 1;
	double c = 0.1, d = 1.1;
	// 调用歧义
	//Swap(&a, &b);

	Swap(&c, &d);

	return 0;
}

这段代码N1, N2 不在同一作用域, 可以同名, 不构成重载, 但是命名空间全部展开, 会引发调用歧义.

下面两个构造函数重载
f()但是这样调用存在歧义

void f()
{
	cout << "f()" << endl;
}

void f(int a = 10)
{
	cout << "f(int a)" << endl;
}

2. 为什么C++支持函数重载, 而C语言不支持重载呢?

这是因为在函数定义与声明分离时, 编译阶段无法直接获得函数地址, 只是通过函数声明,语法可以通过, 链接阶段, C语言直接通过函数名字进行查找, 不支持函数重载, 而C++是使用修饰后的函数名字去查找就可以支持函数重载.

具体过程如下:

  1. 一个项目工程中, 声明和定义通常是分离的, 声明在.h文件中, 定义在.cpp文件中, 如下图
    在这里插入图片描述
    代码在变成可执行程序需要经过编译和链接, 编译分为三个过程, 首先经过预处理, 将.h与.cpp文件进行结合, 进行头文件展开, 宏替换, 条件编译等等, 生成.i文件, 此时就没有.h文件的事情了. 然后, 通过编译, 检查语法, 生成汇编代码, 此时语法通过, 检查语法匹配, 但没有函数地址. 最后通过汇编转成二进制机械码, 但是有函数的定义, 才能生成一堆汇编指令, 所以在链接阶段, 需要查找函数地址, 也就是将Test.o和Stack.o链接在一起.

在这里插入图片描述
如图所示, 转成汇编代码, 在调用StackInit()函数时, 语法通过, 然后执行下一句, jmp指令会通过StackInit()函数名去查找函数地址
在这里插入图片描述
函数有一对要执行的指令, 函数地址就是第一句指令的地址.
在这里插入图片描述
那么,也就是说在声明与定义分离时, 链接过程中需要通过函数名字去找函数地址, 而C语言直接使用函数名字查找,不支持重载, 而C++使用过修饰后的名字查找, 支持重载.

如下图, 我们先将函数定义注释, 就可以看到, 发上了链接错误, 此时我们再看如何进行修饰的, Windows平台下, C++会根据参数列表(参数个数 或 类型 或 类型顺序) 进行函数名字的修饰, 函数重载, 修饰出来的名字不一样, 那就可以区分. 而C语言则没有对函数名字进行修饰

在这里插入图片描述

不同从操作系统对函数名字的修饰规则也不太一样, 比如在Linux操作系统下,对这三个函数的修饰就很直观, 以首字母进行修饰

在这里插入图片描述

在这里插入图片描述
而我们将文件改成.c 就可以发现C语言没有对函数名字修饰, 所以不支持重载

在这里插入图片描述

对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但道理都是类似的,我们就不做细致的研究了。

六. 引用

1.引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。

在这里插入图片描述

类型& 引用变量名(对象名) = 引用实体;

void TestRef()
{
	int a = 10;
	int& ra = a; //定义引用类型
	printf("%p\n", &a);
	printf("%p\n", &ra);

}
int main()
{
	TestRef();

	return 0;
}

在这里插入图片描述
注意: 引用类型必须和引用实体是同种类型的

2.引用的特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体, 再不引用其它实体
void TestRef()
{
    int a = 10;
    int& ra = a;//<====定义引用类型
    printf("%p\n", &a);
    printf("%p\n", &ra);
}

3.常引用

void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 该语句编译时会出错,a为常量
    const int& ra = a;
    // int& b = 10; // 该语句编译时会出错,b为常量
    const int& b = 10;
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    const int& rd = d;
}

4.引用场景

  1. 做参数

之前我们在另一个函数交换值需要传地址, 有了引用就可以直接传引用,此时left就相当于a的别名, 而right就相当于b的别名.

void Swap(int& left, int& right)
{
   int temp = left;
   left = right;
   right = temp;
}

int main()
{
	int a = 10;
	int b = 20;
	Swap(a,b);
	return 0;
}
  1. 做返回值

后面我们在细讲

5.引用和指针的区别

typedef struct ListNode
{
	int val;
	struct ListNode* next;
}LTNode;

//之前我们不带哨兵位的链表插入结点需要传递二级指针
void ListPushBack(LTNode** phead, int x);

//这里也可以传递phead指针的引用
void ListPushBack(LTNode*& phead, int x);

//有的教材还可能这样写
typedef struct ListNode
{
	int val;
	struct ListNode* next;
}LTNode, * PNode;
//其本质也是一样的,只是将struct ListNode* 类型重命名为PNode
void ListPushBack(PNode& phead, int x);

这段代码, 是将z赋值给y, 因为引用一旦引用实体,就不可以引用别的实体

int main()
{
	// int& a;

	int x = 0;
	int& y = x;
	int z = 1;
	// y变成z的别名呢?
	// 还是z赋值给y
	y = z;

	return 0;
}

不管是引用普通变量还是指针变量, 只能权限的缩小, 而不能权限的放大 ,指针赋值也是, 因为被const修饰的地址不可以修改

int main(){

	int x = 0;
	int& y = x; //权限的平移,可以
	const int& z = x;//权限的缩小,可以
	y++;//可以,z++不可以




	const int m = 0;
	// int& n = m;m是只读的,n变成我的别名,n的权限是可读可写,权限的放大,不可以

	const int& n = m; //可以,不是权限的放大

	int p = m;// m拷贝的给p,p的修改不影响m

	// 权限的放大
	// p1可以修改 *p1不可以,const修饰是的*p1
	const int* p1 = &m;
	// p1++;
	// int* p2 = p1;//不可以,p1的内容不可以修改
	const int* p2 = p1;//可以,常量赋值给常量

	// 权限的缩小,可以
	int* p3 = &x;
	const int* p4 = p3;

	return 0;
}

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
    int main()
    {
    int a = 10;
    int& ra = a;
    cout<<"&a = “<<&a<<endl;
    cout<<”&ra = "<<&ra<<endl;
    return 0;
    }
    int main()
    {
    int a = 10;
    int& ra = a;
    ra = 20;
    int* pa = &a;
    *pa = 20;
    return 0;
    }
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

感谢点赞, 关注, 收藏!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车报价资讯app小程序模板源码

蓝色实用的汽车报价&#xff0c;汽车新闻资讯&#xff0c;最新上市汽车资讯类小程序前端模板。包含&#xff1a;选车、资讯列表、榜单、我的主页、报价详情、资讯详情、询底价、登录、注册、车贷&#xff0c;油耗、意见反馈、关于我们等等。这是一款非常全的汽车报价小程序模板…

ThreadPoolExecutor - 管理线程池的核心类

下面是使用给定的初始参数创建一个新的 ThreadPoolExecutor &#xff08;构造方法&#xff09;。 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,…

缓冲器的重要性,谈谈PostgreSQL

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

Static关键字的用法详解

Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可以用于多种上…

【Java探索之旅】初识多态_概念_实现条件

文章目录 &#x1f4d1;前言一、多态1.1 概念1.2 多态的实现条件 &#x1f324;️全篇总结 &#x1f4d1;前言 多态作为面向对象编程中的重要概念&#xff0c;为我们提供了一种灵活而强大的编程方式。通过多态&#xff0c;同一种操作可以应用于不同的对象&#xff0c;并根据对象…

数据库系统原理 | 查询作业2

整理自博主本科《数据库系统原理》专业课自己完成的实验课查询作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; ​ ​ ———— 本次实验使用到的图形化工具&#xff1a;Heidi…

深入分析SSL/TLS服务器的证书(C/C++代码实现)

SSL&#xff08;Secure Sockets Layer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;是网络安全领域的重要协议&#xff0c;它们在保护网络通信中发挥着至关重要的作用。这些协议通过加密和身份验证机制&#xff0c;确保数据在传输过程中的机密性和完整性…

cs231n作业1——SVM

参考文章&#xff1a;cs231n assignment1——SVM SVM 训练阶段&#xff0c;我们的目的是为了得到合适的 &#x1d44a; 和 &#x1d44f; &#xff0c;为实现这一目的&#xff0c;我们需要引进损失函数&#xff0c;然后再通过梯度下降来训练模型。 def svm_loss_naive(W, …

python基础篇(8):异常处理

在Python编程中&#xff0c;异常是程序运行时发生的错误&#xff0c;它会中断程序的正常执行流程。异常处理机制使得程序能够捕获这些错误&#xff0c;并进行适当的处理&#xff0c;从而避免程序崩溃。 1 错误类型 代码的错误一般会有语法错误和异常错误两种&#xff0c;语法错…

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…

nginx相关概念(反向代理、负载均衡)

1 Nginx 是什么 Nginx是一款轻量级的Web 服务器&#xff0c;其特点是占有内存少&#xff0c;并发能力强 2 Nginx 反向代理 正向代理代替客户端去发送请求反向代理代替服务端接受请求 2.1 正向代理 若客户端无法直接访问到目标服务器 server 则客户端需要配置代理服务器 pr…

云渲染技术对电影24帧和游戏60帧渲染需求及时间效率的影响

随着云计算技术的飞速发展&#xff0c;云渲染正重塑着影视和游戏产业的制作流程。它如何影响传统电影24帧和现代游戏60帧的渲染需求与时间效率&#xff1f;本文将深入探讨云渲染带来的变革。 一、电影24帧和游戏60帧作用 电影通常以24帧每秒&#xff08;fps&#xff09;的标准…

数字化精益生产系统--IFS财务管理系统

IFS财务管理系统是一款功能丰富、高效且灵活的企业财务管理软件&#xff0c;广泛应用于多个行业和不同规模的企业中。以下是对IFS财务管理系统的功能设计&#xff1a;

Linux shell编程学习笔记63:free命令 获取内存使用信息

0 前言 在系统安全检查中&#xff0c;内存使用情况也是一块可以关注的内容。Linux提供了多个获取内存信息的命令很多。今天我们先研究free命令。 1 free命令的功能、用法和选项说明 1.1 free命令的功能 free 命令可以显示系统内存的使用情况&#xff0c;包括物理内存、交换…

SSM高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…

入门PHP就来我这(高级)11 ~ MySQL

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 PHP操作MySQL数据库的方法 PHP操作数据库现在用的多的是mysqli拓展库&#xff0c;mysqli扩…

【Python机器学习】模型评估与改进——多分类指标

多分类问题的所有指标基本是上都来自于二分类问题&#xff0c;但是要对所有类别进行平均。多分类的精度被定义为正确分类的样本所占的比例。同样&#xff0c;如果类别是不平衡的&#xff0c;精度并不是很好的评估度量。 想象一个三分类问题&#xff0c;其中85%的数据点属于类别…

可视化作品集(07):网格化管理领域

网格化管理可视化大屏是指利用大屏幕显示设备&#xff0c;通过数据可视化的方式展示网格化管理的相关信息和指标。网格化管理是一种以网格为基础的城市管理模式&#xff0c;通过将城市划分为不同的网格单元&#xff0c;实现对城市各项管理工作的全覆盖、全时空监控和全过程管理…

中国星坤X1224系列线对板连接器:小巧稳定,助力物联网终端高效运行

在物联网、电器和消防等领域&#xff0c;终端设备的安全稳定运行至关重要。为了满足这些领域对连接器高可靠性、小巧轻便和耐高温的需求&#xff0c;X1224系列线对板连接器应运而生。这款连接器以其独特的设计和卓越的性能&#xff0c;成为了终端设备中不可或缺的一部分。 一、…

中英双语介绍加拿大(Canada)

加拿大国家简介 中文版 加拿大简介 加拿大是位于北美洲北部的一个国家&#xff0c;以其广袤的土地、多样的文化和自然美景著称。以下是对加拿大的详细介绍&#xff0c;包括其地理位置、人口、经济、特色、高等教育、著名景点、国家历史和交通条件。 地理位置 加拿大是世界…