当前位置: 首页 > news >正文

类和对象(一)(C++)

类和对象:

类的引入:

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现, 会发现struct中也可以定义函数

typedef int DataType;
struct Stack
{//成员函数void Init(size_t capacity){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr == _array){perror("malloc申请空间失败");return;}_capacity = capacity;_size = 0;}void Push(const DataType& data){// 扩容_array[_size] = data;++_size;}DataType Top(){return _array[_size - 1];}void Destroy(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}//成员变量DataType* _array;size_t _capacity;size_t _size;
};

但c++更喜欢用class来代替:

类的两种定义方式:

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::,

这些在之后都会经常用到

成员变量命名规则:

class Date{public:void Init(int year){// 这里的year到底是成员变量,还是函数形参?
year = year;}private:int year;};

为了区分开来,会在成员变量前加_来区分,也可以用其他方式

类的访问限定符:

1.pubic,公有 2.protected,保护 3.private,私有

1. public修饰的成员在类外可以直接被访问

2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4. 如果后面没有访问限定符,作用域就到}即类结束。

5. class的默认访问权限为private,struct为public(因为struct要兼容C)

我们一般对成员变量设为私有,成员函数设为公有

如何计算类的大小:

一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐,成员函数会放在公共的代码段,因为多个对象调用同一份函数,如果按照此种方式存储,当一 个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间

但空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象,即证明这个类存在

class A
{};
int main()
{cout << sizeof(A) << endl;return 0;
}

this指针:

特点:

1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值

2. 只能在“成员函数”的内部使用

3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针,this存储在栈上

4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传

我们在类中也可以直接使用this指针来更好的理解

void Print()
{
// this = nullptr;
cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};int main()
{
Date d1;
Date d2;
d1.Init(2024, 4, 2);
d2.Init(2024, 4, 3);
}

this指针可以为空吗?

public:void Print(){cout << "Print()" << endl;}private:int _a;};int main(){A* p = nullptr;p->Print();return 0;}

class A{ 
public:void PrintA() {cout<<_a<<endl;}private:int _a;};int main(){A* p = nullptr;p->PrintA();return 0;}

以上两个代码,第一个不会报错,第二个报错,原因是第一个没有对this指针解引用,而第二个对this空指针解引用了,会进行报错

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数 

类的6个默认成员函数:

1.构造函数:

构造函数的主要任务并不是开空间创建对象,而是初始化对象

特征:

1. 函数名与类名相同。

2. 无返回值。

3. 对象实例化时编译器自动调用对应的构造函数。

4. 构造函数可以重载。

class Date
{
public:Date()//无参,打印值默认{}Date(int year, int month, int day)//有参,打印传参值{_year = year;_month = month;_day = day;}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year ;int _month;int _day;
};
int main()
{Date d1;// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明d1.Print();Date d2(1, 2, 3);d2.Print();return 0;
}

如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦 用户显式定义编译器将不再生成。

C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类 型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,对于内置类型,没有规定要不要做处理(部分编译器会处理),对自定义类型才会调用无参构造

但:

C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在 类中声明时可以给默认值

class Time{private:int _hour;int _minute;int _second;};
class Date{private:// 基本类型(内置类型)int _year =1;int _month = 1;int _day = 1;// 自定义类型
Time _t;};int main(){Date d;return 0;}

内置类型可处理可不处理,自定义类型会调用默认构造,如果没有,就会报错(可以进行自定义类型的多重嵌套)

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。否则会存在使用冲突

2.析构函数

特点:

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值类型。

3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

 当没有显式析构函数时,编译器自动生成的析构函数,对内置类型不做处理,自定义类型调用析构函数

class Time{public:~Time(){cout << "~Time()" << endl;}private:int _hour;int _minute;int _second;};class Date{private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型
Time _t;};int main(){Date d;return 0;}

 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类

 stack::~stack(){if (_a) {cout << "Destroy" << endl;_capacity = 0;_top = 0;free(_a);_a = NULL;}}

3.拷贝构造

 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用

特点:

1. 拷贝构造函数是构造函数的一个重载形式。

2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。

class Date
{
public:void Print(){cout << _year << " " << _month << " " << _day << endl;}Date(int year=1,int month=1,int day=1) {cout << "构造" << endl;_year = year;_month = month;_day = day;}Date(const Date& d)//防止被修改{cout << "拷贝" << endl;_year = d._year;_month = d._month;_day = d._day;}
private:int _year=1 ;int _month=1;int _day=1;
};
int main()
{Date d;d.Print();Date d1=d;//Date d1(d);两者等价d1.Print();return 0;
}

拷贝构造参数用const 修饰,防止被修改 

为了理解无穷递归,在这里举个例子

void func(Date& d)
{d.Print();
}
int main()
{Date d2;func(d2);return 0;
}

这里用引用传递实参和形参都是d2,而值传递的话会先拷贝d2给d,进入到拷贝函数中d2和d地址也不同 

若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请 时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

如stack中的深拷贝:

 stack::stack(const stack& st){_a = (int*)malloc(sizeof(int) * st._capacity);if (_a == nullptr){return;}_capacity = st._capacity;_top = st._top;memcpy(_a, st._a, _capacity * sizeof(int));//深拷贝}//不这样写只是浅拷贝

 4.运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似

函数名字:关键字operator后面接需要重载的运算符符号。

注意:

不能通过连接其他符号来创建新的操作符:比如operator@

作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this

.*   ::   sizeof   ?:   . 注意以上5个运算符不能重载。

 .*很少见,下面给一个场景

class OB
{
public:void func(){cout << "void func()" << endl;}
};typedef void(OB::* PtrFunc)();//成员函数指针类型int main()
{PtrFunc fp = &OB::func;//定义成员函数指针p指向函数funcOB temp;//定义ob类对象temp(temp.*fp)();return 0;
}

运算符重载成全局的就需要成员变量是公有的,封装性不能保证。

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
//private:int _year;int _month;int _day;
};
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}

 这里先写一个判断日期相等的函数,可以看到,如果写成全局的函数,私有的变量就需要变为公有,所以我们就重载成成员函数 

这里可以用我们用重载成成员函数解决

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}bool operator==(const Date& d){return _year == d._year&& _month == d._month&& _day == d._day;}
//private:int _year;int _month;int _day;
};

赋值运算符重载:

格式:

参数类型:const T&,传递引用可以提高传参效率

返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值 ,检测是否自己给自己赋值

返回*this :要复合连续赋值的含义

对返回值类型进行深究:

传值返回:生成一个拷贝作为返回值

传引用返回:不会拷贝

Date func()
{Date d;return d;//出作用域析构d
}//传值返回临时对象,具有常性,需要拷贝
int main()
{Date& ref = func();//报错const Date& ref = func();//正确return 0;
}

这里使用传值返回, 在func中建立d,返回d的值时会拷贝d的值给一个临时变量,调用拷贝函数,临时变量具有常性,需要const 接收,并且d的值,出函数作用域会调用析构

Date& func()
{Date d;return d;
}
int main()
{Date& ref = func();//ref类似于野指针了,指向的空间可能会改变return 0;
}

这里传引用是有问题的,d出作用域就会销毁,再返回其地址类似于野指针了,指向空间可能会改变

但如果改成这样的话,就不会报错了,因为d相当于在全局域了

Date& func()
{
static	Date d;return d;
}//可以引用返回

所以总结一下, 

返回对象是局部变量或临时对象,用引用返回存在风险,虽然减少了拷贝
 返回对象是全局变量,用引用就行

  出了作用域,返回对象还在没有析构,那就可以用引用返回,减少拷贝
 a、返回对象生命周期到了,会析构,传值返回
 b、返回对象生命周期没到,不会析构,传引用返回

 连续复制,如果知识两个值进行运算的话,我们是可以将返回类型设为void的,但d1=d2=d3怎么办呢,这个式子从右向左依次赋值,所以返回类型要修改为Date&

			Date& operator=(const Date& d)//void不支持三个数连续等于//传值返回会拷贝构造{cout << "赋值" << endl;if (this != &d)//防止自己给自己赋值{_year = d._year;_month = d._month;_day = d._day;}return *this;}

5..取地址及const取地址操作符重载 

class A {
public:A* operator&(){return this;}const A* operator&()const {return this;}
};
int main()
{A a1;const A a2;cout << &a1<< endl;cout << &a2 << endl;return 0;
}

这两个函数重载依靠this指针类型的不同,但我们不写编译器会自动生成

日期类的实现:

class Date
{
public:friend ostream& operator<<(ostream& out, const Date& d);///ostream抢不过第一个参数形参//istream& operator>>(const Date& d);参数问题friend istream& operator>>(istream& in,Date& d);Date(int year = 1900, int month = 1, int day = 1);int CheckDate(){if (_month > 12 || _month < 1||_day>Get_day(_year,_month)){cout << "输入错误" << endl;return 1;}else{return 0;}}void Print();int Get_day(int year, int month){assert(month > 0 && month < 13);static int data[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//多次调用if (month==2&&(year%100==0&&year%4!=0||year%400==0)){return 29;}return data[_month];}Date& operator+=(int day);Date operator+(int day)const;Date& operator-=(int day);Date operator-(int day)const;Date operator++(int);Date operator--(int);Date& operator--();Date& operator++(); bool operator>(const Date& d)const;bool operator>=(const Date& d) const;bool operator<=(const Date& d) const;bool operator<(const Date& d) const;bool operator==(const Date& d) const;bool operator!=(const Date& d) const;int operator-(const Date& d) const;private:int _year;int _month;int _day;
};
Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
void Date::Print()
{cout << _year <<" "<< _month <<" "<< _day << endl;
}
Date& Date::operator+=(int day)
{if (day < 0){*this-=-day;return *this;}_day += day;while (_day > Get_day(_year, _month)){_day -= Get_day(_year, _month);_month++;if (_month == 13){_month = 1;_year++;}}return *this;
}
Date Date::operator+(int day) const
{Date tmp = *this;tmp += day;return tmp;
}
Date& Date::operator-=(int day) 
{if (day < 0){*this += -day;return *this;}_day -= day;while (_day <= 0){--_month;if (_month == 0){_month = 12;_year--;}_day += Get_day(_year, _month);}return *this;
}
Date Date::operator-(int day) const
{Date tmp = *this;tmp -= day;return tmp;
}
Date Date::operator++(int)
{Date tmp = *this;(*this) += 1;return tmp;
}
Date Date::operator--(int)
{Date tmp = *this;(*this)-=1;return tmp;
}
Date& Date::operator--()
{(*this) -= 1;return *this;
}
Date& Date::operator++()
{(*this) += 1;return *this;
}
bool Date::operator>(const Date & d) const 
{if (_year> d._year){return true;}else if (_year == d._year){if (_month > d._month){return true;}else if (_month == d._month){if (_day > d._day){return true;}}}return false;
}
bool Date::operator>=(const Date& d) const
{return *this == d || *this > d;
}
bool Date::operator<=(const Date& d)const
{return !(*this > d);
}
bool Date::operator<(const Date& d)const
{return !(*this >= d);
}
bool Date::operator==(const Date & d)const{return _year == d._year && _month == d._month && _day == d._day;}
bool Date::operator!=(const Date & d)const{return !(*this == d);}
int Date:: operator-(const Date& d)const//算有多少天
{Date big = *this;Date small = d;//拷贝构造int flag = 1;if (big < small){big = d;small = *this;flag = -1;}int n = 0;while (small < big){small++;n++;}return n*flag;
}
ostream& operator<<(ostream& out, const Date& d)
{out << d._year <<" "<< d._month <<" "<< d._day << endl;return out;
}
istream& operator>>(istream& in, Date& d)//传引用,不支持拷贝构造,被禁用了
{cout << "请输入年月日" << endl;in >> d._year >> d._month >> d._day;if (d.CheckDate()){cout << "日期非法" << endl;}return in;
}

 日期类的实现有一些需要注意的点,我在这里一一说明:

1.对于多次调用的Get_day函数,我们直接在类中展开写,其会自动转化为内联函数,包括data数组,我们也要多次使用,所以在前面加上static修饰,变为全局变量

2.对于*this不能改变的函数,我们在函数声明后加上const修饰(比较特殊),可以发现,传引用返回并且对*this进行操作的一般不加const修饰

3.前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载 , C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器 自动传递

4.cout和cin无法对自定义成员进行处理,进行运算符重载要将其转化为友元类才符合输出格式(重载为全局破坏封装性,重载为成员函数(不是友元)输出格式不符合,第一个参数为this形参,不能是cout或cin)

相关文章:

类和对象(一)(C++)

类和对象&#xff1a; 类的引入&#xff1a; C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。比如&#xff1a; 之前在数据结构初阶中&#xff0c;用C语言方式实现的栈&#xff0c;结构体中只能定义变量&#…...

【免费Web系列】JavaWeb实战项目案例六

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 员工信息-删除&修改 前面我们已经实现了员工信息的条件分页查询以及新增操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 删除员工 修改员工 除了员工管理的功能之外&#x…...

git分布式版本控制系统(四)

目前世界上最先进的分布式版本控制系统 官方网址&#xff1a;https://git-scm.com 学习目标&#xff1a; 1 了解 git 前世今生 2 掌握 git 基础概念、基础操作 3 各种 git 问题处理 4 互联网常用 gitflow(工作流程规范) 5 git 代码提交规范 6 git 分支管理及命名规范 常见问…...

【React篇】简述React-Router 的实现原理及工作方式

React Router 路由的基础实现原理分为两种&#xff0c;如果是切换 Hash 的方式&#xff0c;那么依靠浏览器 Hash 变化即可&#xff1b;如果是切换网址中的 Path&#xff0c;就要用到 HTML5 History API 中的 pushState、replaceState 等。在使用这个方式时&#xff0c;还需要在…...

Django里多app

在 Django 里的某一个项目&#xff0c;里面得包含很多 App (功能)&#xff0c;那么如何在该项目里管理这么多App呢&#xff1f; 先说明下背景&#xff1a;未先创建 apps 文件夹来存各个app文件夹&#xff0c;直接在项目文件目录里创建各个app。为了便于管理&#xff0c;得将各…...

Prime1 - 信息收集和分析能力的试炼

主机发现 nmap扫描与分析 端口22、80 详细扫描&#xff1b;linux、ubuntu、 udp扫描 端口都是关闭的 脚本扫描 web渗透 打开只有一张图片&#xff1b;源码有图片和一个alt&#xff1a;hnp security不知道有啥用&#xff0c;先记录下来吧 继续web渗透思路走吧&#xff0c;目录…...

3.location的写法

location的写法 一、location的写法1、 精确匹配2、~ 以正则表达式匹配请求&#xff0c;区分大小写3、~* 以正则匹配请求&#xff0c;不区分大小写4、^~ 不以正则的方式匹配请求 二、stub_status模块显示工作状态三、url地址重写 rewrite模块1、语法2、针对项目结构有变化3、网…...

AndroidStudio设置允许APP获取定位权限

1. 在AndroidManifest.xml中声明权限 常用的定位权限有以下两种&#xff1a; <uses-permission android:name"android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION"/>2. …...

Spring Boot 统一数据返回格式

在 Spring Boot 项目中&#xff0c;统一的数据格式返回是一种良好的实践&#xff0c;它提高了代码的可维护性和一致性&#xff0c;并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。 1 为什么需要统一数据返回格式 ⽅便前端程序员更…...

Android 项目Gradle文件讲解(Groovy和Kotlin)

Android 项目Gradle文件讲解&#xff08;Groovy和Kotlin&#xff09; 前言正文一、Gradle的作用二、Gradle的种类① 工程build.gradle② 项目build.gradle③ settings.gradle④ gradle.properties⑤ gradle-wrapper.properties⑥ local.properties 三、Groovy和Kotlin的语言对比…...

python-最接近target的值

【问题描述】&#xff1a;给定一个数组&#xff0c;在数组中找到两个数&#xff0c;使它们的和最接近目标值的值但不超过目标值&#xff0c;然后返回它们的和。 【问题示例】&#xff1a;输入target15,array[1,3,5,11,7],输出14&#xff0c;31114。 完整代码如下&#xff1a; …...

转换张量形状:`nlc_to_nchw` 函数详解

在深度学习和计算机视觉领域&#xff0c;张量的形状转换是一个常见的操作。本文将详细讲解一个用于形状转换的函数 nlc_to_nchw&#xff0c;它能够将形状为 [N, L, C] 的张量转换为 [N, C, H, W] 的张量。 函数定义 def nlc_to_nchw(x, hw_shape):"""Convert …...

「架构」云上自动化运维及其应用

随着云计算的普及,自动化运维成为企业提升运营效率和降低成本的关键。本文通过分析一家中型企业实施云上自动化运维(CloudOps)的案例,探讨了自动化监控、配置管理和持续集成/持续部署(CI/CD)三个核心模块的实际应用。文章详细阐述了每个模块的技术选型、实施原因、优缺点…...

分布式和集群的区别

分布式系统&#xff08;Distributed System&#xff09;和集群&#xff08;Cluster&#xff09;是两个经常被提及的计算机科学概念&#xff0c;它们在提高系统性能和可靠性方面都扮演着重要角色&#xff0c;很多同学会觉得这俩个是同一种东西&#xff0c;但事实上它们之间有着本…...

最新h5st(4.7.2)参数分析与纯算法还原(含算法源码)

文章目录 1. 写在前面2. 加密分析3. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...

Spark大数据 掌握RDD的创建

在Apache Spark中&#xff0c;弹性分布式数据集&#xff08;Resilient Distributed Dataset&#xff0c;简称RDD&#xff09;是一个核心的数据结构&#xff0c;用于表示不可变、可分区、可并行操作的元素集合。理解并掌握RDD的创建是使用Spark进行大数据处理的关键步骤之一。 …...

Chrome谷歌浏览器如何打开不安全页面的禁止权限?

目录 一、背景二、如何打开不安全页面被禁止的权限&#xff1f;2.1 第一步&#xff0c;添加信任站点2.2 第二步&#xff0c;打开不安全页面的权限2.3 结果展示 一、背景 在开发过程中&#xff0c;由于测试环境没有配置 HTTPS 请求&#xff0c;所以谷歌浏览器的地址栏会有这样一…...

3D目标检测入门:探索OpenPCDet框架

前言 在自动驾驶和机器人视觉这两个飞速发展的领域中&#xff0c;3D目标检测技术扮演着核心角色。随着深度学习技术的突破性进展&#xff0c;3D目标检测算法的研究和应用正日益深入。OpenPCDet&#xff0c;这个由香港中文大学OpenMMLab实验室精心打造的开源工具箱&#xff0c;…...

JS异步编程

目录 概念定时器Promise对象概念 单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程。事实上,JavaScript 引擎有多个线程,…...

多元联合分布建模 Copula python实例

多元联合分布建模 Copula python实例 目录 库安装 实例可视化代码 库安装 pip install copulas 实例可视化代码 import numpy as np import pandas as pd from copulas.multivariate import GaussianMultivariate# Generate some example data np.random.seed(42) data = …...

单号日入50+,全自动挂机赚钱

大家好&#xff01;今天我为大家精心挑选了一个极具潜力的副业项目——“游戏工作室自由之刃2&#xff1a;单号日入50&#xff0c;全自动挂机赚钱”。 传奇游戏&#xff0c;无疑是许多人心中那段青春时光的珍贵回忆。 即便是其手游版本&#xff0c;也依旧保持着极高的热度和人…...

LabVIEW老程序功能升级:重写还是改进?

概述&#xff1a;面对LabVIEW老程序的功能升级&#xff0c;开发者常常面临重写与改进之间的选择。本文从多个角度分析两种方法的利弊&#xff0c;并提供评估方法和解决思路。 重写&#xff08;重新开发&#xff09;的优势和劣势&#xff1a; 优势&#xff1a; 代码清晰度高&a…...

chrome谷歌浏览器开启Gemini Nano模型

前提 确保您的操作系统语言设置为英语&#xff08;美国&#xff09; 可能还需要将 Chrome 浏览器的语言更改为英语&#xff08;美国&#xff09;。 下载dev或Canary版本Chrome Chrome Canary Chrome Dev 注意&#xff1a;确认您的版本高于 127.0.6512.0。 其中一个Chrome版本…...

C语言王国——内存函数

目录 1 memcpy函数 1.1 函数表达式 1.2 函数模拟 2 memmove函数 2.1 函数的表达式 2.2 函数模拟 3 memset函数 3.1 函数的表达式 3.2 函数的运用 4 memcmp函数 4.1函数的表达式&#xff1a; 4.2 函数的运用 5 结论 接上回我们讲了C语言的字符和字符串函数&#…...

【计算机组成原理】1.1计算机的软硬件组成(记录学习计算机组成原理)

文章目录 1.早期的冯诺依曼机2.早期冯诺依曼机的基本运行框图3.早期冯诺依曼机的特点4.现代计算机的结构5. 小结 本次及以后有关于计算机组成原理的文章&#xff0c;旨在做学习时的记录和知识的分享。不论是应对期末考试&#xff0c;还是考研都是很有帮助的。希望大家多多支持更…...

Qt xml学习之calculator-qml

1.功能说明&#xff1a;制作简易计算器 2.使用技术&#xff1a;qml,scxml 3.项目效果&#xff1a; 4.qml部分&#xff1a; import Calculator 1.0 //需要引用对应类的队友版本 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 1.4 import QtScxml…...

低代码开发系统是什么?它有那些部分组成?

低代码开发系统是什么&#xff1f;它有那些部分组成&#xff1f; 一、引言 在当今快速变化的商业环境中&#xff0c;企业对于快速响应市场需求、降低开发成本和提高开发效率的需求日益增强。低代码开发系统&#xff08;Low-Code Development Platform&#xff09;应运而生&am…...

2024年西安交通大学程序设计竞赛校赛

2024年西安交通大学程序设计竞赛校赛 文章目录 2024年西安交通大学程序设计竞赛校赛D瑟莉姆的宴会E: 雪中楼I: 命令行(待补)J&#xff1a;最后一块石头的重量(待补)K: 崩坏&#xff1a;星穹铁道(待补)M&#xff1a;生命游戏N: 圣诞树 D瑟莉姆的宴会 解题思路&#xff1a; ​ …...

【学习Day5】操作系统

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 学习编辑文章的时间不太够用&#xff0c;先放思维导图&#xff0c;后续复习完善细节。...

学习小记录——python函数的定义和调用

今日小好运&#xff0c;未来有好运。&#x1f381;&#x1f496;&#x1fad4; 分享个人学习的小小心意&#xff0c;一起来看看吧 函数的定义 函数通常来说就是带名字的代码块&#xff0c;用于完成具体的工作&#xff0c;需要使用的时候调用即可&#xff0c;这不仅提高代码的…...