【c++】——类和对象(中)——默认成员函数(上)
- 1. 类的6个默认成员函数
- 2. 构造函数
- 3. 析构函数
- 4. 拷贝构造函数
目录
一.类的6个默认成员函数
二. 构造函数
2.1 概念
2.2.特性
三.析构函数
3.1.概念
3.2 特性
四.拷贝构造函数
4.1.概念
4.2.特性
一.类的6个默认成员函数
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
class Date {};
二. 构造函数
2.1 概念
class Date
{
public:void init(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.init(2023, 11, 05);d1.print();return 0;
}
构造函数是一个特殊的成员函数,1.名字与类名相同,2.创建类类型对象时由编译器自动调用,以保证每个数据成 员都有 一个合适的初始值3.在对象整个生命周期内只调用一次。
2.2.特性
构造函数 是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造构造函数的主要任务 并不是开 空间创建对象,而是 初始化对象。特征如下:
- 1. 函数名与类名相同。
- 2. 无返回值。
- 3. 对象实例化时编译器自动调用对应的构造函数。
- 4. 构造函数可以重载。
5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。构造函数可以分成2类——无参构造函数和有参构造函数
class Date { public:/*void init(int year, int month, int day){_year = year;_month = month;_day = day;}*/// 1.无参构造函数Date(){}// 2.有参构造函数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; // 调用无参构造函数Date d2(2015, 1, 1); // 调用带参的构造函数d1.print();d2.print();return 0; }
注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则
就成了函数声明 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
Date d3()不是很惯用的函数声明,我换种形式 int func(),这样看是不是更清楚了,这就是相当于无参函数的声明。int func(void).

特性5:
5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
- 类中显式定义构造函数,就是显示上面的代码段,编译器就不用给出帮助,因为自己传参了。
![]()
![]()
- 类中没有显示定义构造函数,C++编译器会自动生成一个无参的默认构造函数。然后给出的成员变量的值都是随机值。
![]()
我们看一下这下面的代码段,为什么显示“没有合适的默认构造函数可用”??
![]()
错误原因:在Date类中定义了其他构造函数,那么,编译器不会为你创建默认构造函数;然而,在编译器调用Date的默认构造函数时,就会找不到,d1是无参的对象,而上面的默认构造函数是存在参数的,所以编译器显示没有合适的默认构造函数可用。
解决方法:加入默认构造函数,与之匹配。
如果Date创建的对象d1传参和上面的构造函数参数个数类型匹配,就说明找到合适的默认构造函数可用,否则都得创建一个与之对应参数个数类型的默认构造函数即可。
特性6:
6. 关于编译器生成的默认成员函数,很多童鞋会有疑惑:不实现构造函数的情况下,编译器会生成默认的 构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象 _year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??
解答: C++把类型分成内置类型(基本类型)和自定义类型。
- 内置类型: 就是语言提供的数据类型,如: int/char...,
- 自定义类型: 就是我们使用class/struct/union等自己定义的类型,
看看下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数(构造函数)大家看这里的Date类与上面那个有什么区别,是不是它的成员变量里既有内置类型又有自定义类型啊。但是我们现在并没有给Date类写构造函数,那我们在main函数里直接拿Date去创建一个对象,它自然就会去调用编译器自动生成的构造函数,那内置类型不做处理,我们不是还有一个自定义类型Time _t;呢,我们说对于自定义类型,编译器会自动去调用它对应的默认构造函数。
那我们在Time 类的默认构造函数里面故意加了一个打印:这里很明显编译器对于自定义类型成员_t去调用构造函数。
注意: C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即: 内置类型成员变量在类中声明时 可以给默认值.这样如果我们不写构造函数,内置类型的初始化就会按给定的缺省值进行初始化。
这里我需要强调一下,自定义类型和内置类型的区别:系统会默认给内置类型初始化一个随机值,但是随机值是没有意义的,虽然后来打了补丁可以给缺省值,但是我们未来还会用到更多的类型例如自定义类型,这时我们就需要自定义类型,因此自定义所构造的构造函数可以更好的帮助我们进行初始化。
特性7:
7. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
我们上面的特性说了,只能有一个默认构造函数,这里出现了俩个默认构造函数,所以就导致了对重载函数的调用不明确,因为不知道到底调哪个默认构造函数。
这里我们要特别区分俩个名词:默认成员函数和默认构造函数
- 默认成员函数:任何类在什么都不写时,编译器会自动生成以下6个默认成函数。
- 默认构造函数:类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数。
三.析构函数
我们在之前数据结构的学习中,在学到栈的时候,有一个与栈相关的非常经典的题目——括号匹配问题。
来看一下我们C语言写出来的代码,我们进行判断之后,需要return的地方可能有好几处,但是呢,每次return之前,其实最好都要去调用一下
StackDestroy
把我们动态开辟的空间给销毁一下,但是我们可能很容易会忘掉导致内存泄漏。那现在我们学了C++,有没有什么好的办法可以帮助我们解决这个问题呢?
可不可以像上面的构造函数自动初始化一样自动对对象中的资源进行清理呢?
那当然是有的,就是我们接下来要学习的析构函数。先了解概率吧。
3.1.概念
通过前面构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没呢的?—— 析构函数: 与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
3.2 特性
析构函数 是特殊的成员函数,其 特征如下:
- 1. 析构函数名是在类名前加上字符 ~。(~就相当于运算符里面的按位取反操作符)
- 2. 无参数无返回值类型。
- 3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
注意:析构函数不能重载
- 4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
typedef int DataType; class Stack { public:Stack(size_t capacity = 3){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc申请空间失败!!!");return;}_capacity = capacity;_size = 0;}void Push(DataType data){// CheckCapacity();_array[_size] = data;_size++;}// 其他方法...~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}} private:DataType* _array;int _capacity;int _size; }; int main() {Stack s;s.Push(1);s.Push(2); return 0; }
特性5:
5. 关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认析构函数,对自定类型成员调用它的析构函数。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显式定义析构函数,那d声明周期结束时,就会调用编译器自己生成的默认析构函数,那里面的内置类型不做处理,当然也不用处理,关键在于自定义类Time _t
;
申请的资源需要清理,那我们看编译器自己生成的默认析构函数会不会调用Time _t类的析构函数:
这是上面代码的运行结果。显然是调用了。
这时候我们就应该想一个问题了?——在main方法中根本没有直接创建Time类的对象,为什么最后会调用Time类的析构函数?因为:main方法中创建了Date对象d,而d中包含4个成员变量,其中_year, _month, _day三个是内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可;而_t是Time类对象,所以在 d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。但是:main函数中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数,目的是在其内部调用Time 类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁,main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数。注意:创建哪个类的对象则调用该类的析构函数,销毁那个类的对象则调用该类的析构函数。
特性6:
6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类 。
四.拷贝构造函数
4.1.概念
在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。
那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?拷贝构造函数: 只有单个形参 ,该形参是对本 类类型对象的引用 ( 一般常用 const 修饰 ) ,在用 已存在的类类型 对象创建新对象时由编译器自动调用 。
4.2.特性
拷贝构造函数也是特殊的成员函数, 其特征如下:
- 1. 拷贝构造函数是构造函数的一个重载形式。
因为我们刚才上面说了嘛,它的作用其实也是用来初始化对象的,只不过参数类型指定了是我们当前类的类型嘛。所以它算是构造函数的一种重载形式。
- 2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
我们按照上面形式传参,会导致显示一个错误编译,没有运行就错了。
那相信大家刚才也注意到上面的概念了,在拷贝构造函数的概念中其实就指明了说它的参数类型应该是类对象的引用。
确实,我们这样修改之后就可以了。
2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。
结合下面这张图给大家解释一下:
ps:图中还在形参前加了const,大家可以先不管,后面会解释。
大家想一下,首先我们这里是用已有的类对象去创建一个相同的新对象(类对象的拷贝),所以会调用拷贝构造函数,那要调用函数是不是要先传参啊,而传值调用传的是啥(形参是实参的一份临时拷贝),是不是传的实参的拷贝,那要拷贝实参,是不是又是一个类对象的拷贝啊,那既然是类对象的拷贝,就又要调用拷贝构造函数,那就又需要传参,一传参就会再次调用拷贝构造函数,那这样是不是就陷入一个死递归了。
直接用“
=
”也可以,这样也是拷贝构造。
上面一开始拷贝构造函数的概念中说它的形参一般用const修饰:
为什么要加个const呢?
其实很容易理解,大家想形参d是用来干嘛的, 是用来初始化我们新创建的对象的,那我们肯定不希望形参d被修改,所以加个const修饰:
这样我们如果不小心写反了啥的是不是就直接报错了。另外,加const还有什么好处呢?
大家想,如果我们不加const,但传过来的参数是const修饰的,这样的话是不是根本就接收不了啊,这个问题我们之前也讲了,是不是属于权限放大了,是不行的。但是如果我们加了const,传过来的不管是否加const,是不是都可以接收啊。
特性3:
3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成 拷贝,这种拷贝叫做浅拷贝,或者值拷贝。🆗,那我们上面说了拷贝构造函数是构造函数的一种重载形式,那其实就也属于是构造函数了,那构造函数我们不写的话编译器不是会自动生成嘛,那拷贝构造函数是不是也具有这样的特性呢?
是的,对于拷贝构造函数来说,若未显式定义,编译器也会生成默认的拷贝构造函数。我们刚才不是对Date类实现了一个拷贝构造函数嘛,先我们现在把它屏蔽调:class Date { public://构造函数Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//拷贝构造函数/*Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}*/void Print() {cout << _year << "-" << _month << "-" << _day << endl; } private:int _year;int _month;int _day; }; int main() {Date d1;d1.Print();Date d2(d1);d2.Print();Date d3 = d1;d3.Print();return 0; }
注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。
那既然编译器自动生成的拷贝构造函数就可以帮助我们完成类对象的拷贝了,那我们还需要自己写吗?
特性4:
那为了解决这个问题,我们再来看这样一个类:4. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?当然像日期 类这样的类是没必要的。那么下面的类呢?验证一下试试?typedef int DataType; class Stack { public:Stack(int capacity = 4){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (NULL == _array){perror("malloc申请空间失败!!!");return;}_capacity = capacity;_size = 0;}void Push(DataType data){// CheckCapacity();_array[_size] = data;_size++;}// 其他方法...~Stack(){cout << "~Stack" << endl;free(_array);_array = NULL;_capacity = 0;_size = 0;} private:DataType* _array;int _capacity;int _size; };
还是我们之前用过的这个栈Stack类,大家看它的成员变量是不是也都是内置类型啊,前面提到过指针也属于内置类型嘛。
那对于Stack这个类,我们也是没写拷贝构造函数的,那编译器自动生成的能不能完成下面这样的拷贝呢?
int main() {Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);Stack s2(s1);return 0; }
为什么会这样呢,刚才Date类不也都是内置类型,为啥就没事呢?
大家有没有注意到我们上面的特性3,后面的一句话是:
默认的拷贝构造函数 拷贝对象 按内存存储字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。在这里其实就是对逐个成员变量依次进行拷贝,里面存的是啥就把啥拷过去。
首先对于Date类来说,进行这样的浅拷贝有没有问题啊。
![]()
是不是没问题啊,一共12个字节的内容,直接拷贝过去就行了嘛
但是,对于Stack类来说呢?
我们还是这样进行浅拷贝的话:
我们有没有想过,_array指向的空间在堆区malloc(是在堆区),在销毁对象的时候要销毁对象内部的成员变量,在成员变量中有一个变量是指向该堆区内存的指针,因此每销毁一个对象就要销毁对应的内存地址,而浅拷贝会导致被销毁的两个对象中的那两个成员指针变量指向同一块内存,从而导致该内存被销毁两次。
比如一个文件f1里面包含了各种资料,我们需要再继续创建一个不同名文件f2但是文件里面的内容相同,然后删除这个原本文件f1之前,我们是不是需要拷贝这个文件,然后才能删除。我们想想,内容是在不同的文件里面的,虽然是相同的,我们销毁f1文件里面的内容,是不是销毁f1文件,销毁f2文件里面的内容,是不是销毁f1和f2文件内容是占据不同的文件。
这就是深拷贝,就是将内容构造拷贝时,_array需要开一快同样的大小空间。
这样对两个对象进行操作就不会互相影响了。
Stack(const Stack& st){_array = (DataType*)malloc(sizeof(DataType) * st._capacity);if (NULL == _array){perror("malloc申请空间失败!!!");exit(-1);}memcpy(_array, st._array, sizeof(DataType) * st._size);_capacity = st._capacity;_size = st._size;}
没有问题了。
注意: 类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构 造函数是一定要写的,否则就是浅拷贝。总结:在编译器生成的默认拷贝构造函数中,内置类型是按照浅拷贝(值拷贝)进行拷贝的,而自定义类型是调用其对应的拷贝构造函数完成拷贝的。
特性5:
5. 拷贝构造函数典型调用场景:
- 使用已存在对象创建新对象
- 函数参数类型为类类型对象
- 函数返回值类型为类类型对象
为了提高程序效率,一般对象传参时,尽量使用引用类型(减少拷贝),返回时根据实际场景,能用引用尽量使用引用。
考研,还是就业?
相关文章:

【c++】——类和对象(中)——默认成员函数(上)
【学习目标】 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 目录 一.类的6个默认成员函数 二. 构造函数 2.1 概念 2.2.特性 三.析构函数 3.1.概念 3.2 特性 四.拷贝构造函数 4.1.概念 4.2.特性 一.类的6个默认成员函数 如果一个类中什么成员…...

钉钉企业微应用开发C#-HTTP回调接口
官方的STREAM回调推送的方式,试了几次都认证不过,就放弃了还是用HTTP的模式吧。 /// <summary>/// 应用回调/// </summary>/// <param name"model"></param>/// <returns></returns>public static Dictio…...

Rust编程基础之条件表达式和循环
1.if表达式 if 表达式允许根据条件执行不同的代码分支, 以下代码是一个典型的使用if表达式的例子: fn main() {let number 3; if number < 5 {println!("condition was true");} else {println!("condition was false");} } 所有的 if 表达式都以…...

MATLAB算法实战应用案例精讲-【人工智能】ROS机器人(补充篇)
目录 前言 ROS 机器人导航调参 1 速度和加速度 2 全局路径规划 3 局部路径规划...

基于8086汽车智能小车控制系统
**单片机设计介绍,基于8086汽车智能小车控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于 8086 的汽车智能小车控制系统是一种将微处理器技术应用于汽车控制的系统。下面是其主要的设计介绍: 硬…...

全光谱大面积氙光灯太阳光模拟器老化测试
氙灯光源太阳光模拟器广泛应用于光解水产氢、光化学催化、二氧化碳制甲醇、光化学合成、光降解污染物、 水污染处理、生物光照,光学检测、太阳能电池研究、荧光材料测试(透射、反射、吸收) 太阳能电池特性测试,光热转化,光电材料特性测试,生物…...

linux添加一条到中间路由器的路由
有时候需要配置一些明细路由,不能直接通过网关进行路由转发 配置示例 ip route add 10.0.12.0/24 via 10.0.41.1 dev bond0 这个命令是用于在Linux操作系统上配置IP路由的命令。具体来说,这个命令的含义是: ip route add: 这部分表示要添加…...

不同MySQL服务的表以及库的数据迁移(/备份)
目标: 将本地主机上usernameroot,passwordroot,port3307的MySQL服务中migration_one数据库的table_11数据表导出到本地的D:\start_java\XinQiUtilsOrDemo\testMigrationMySQL\table_11.bak注意:目前D:\start_java\XinQiUtilsOrDemo\testMigrationMySQL该…...

聊聊芯片超净间的颗粒(particle)
在芯片制造领域,颗粒的存在可能对生产过程产生巨大影响。其中,每个微小的颗粒,无论是来自人员、设备,还是自然环境,都有可能在制程中引发故障,从而对产品性能产生负面影响。这就是为什么在芯片厂中…...

服务器(windows Server 2019为例)中的日志中文乱码的解决办法
1. 首先,打开控制面板,找到区域(Region),把Format设置为国语简体中文,点击高级(Administrative)后设置Current system locale为国语简体中文,按照图中步骤:...

Linux 学习(CentOS 7)
CentOS 7 学习 Linux系统内核作者: Linux内核版本 内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。 Linux内核版本又分为稳定版和开发版,两种版本是相互关联&am…...

架构决策记录 ADR
在项目和产品开发过程中,软件工程团队需要做出架构决策以实现其目标。这些决策可以是技术性的,也可以与流程相关。 技术决策:例如决定使用JBOSS Data Grid作为缓存解决方案还是选择Amazon Elasticache,或者决定使用AWS Network L…...

SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
redis整合redis的注解式开发及应用场景redis的击穿穿透雪崩 1.redis整合 mysql整合 pom配置; String-fmybatis.xml --> mybatis.cfg.xml: 包扫描; 注册了一个jdbc.properties(url/password/username/...); 配置数据源(数据库连…...

数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
数据库性能优化是提升数据库系统整体性能和响应速度的一系列技术和策略。它可以通过多种方式来实现,包括优化查询语句、索引设计、硬件升级、负载均衡等手段。 合适的数据模型设计 正确的数据模型设计是性能优化的基石。合理的表结构和关系设计可以减少冗余数据&…...

谁说 Linux 不能玩游戏?
在上个世纪最早推出视频游戏的例子是托马斯戈德史密斯(Thomas T. Goldsmith Jr.)于1947年开发的“「Cathode Ray Tube Amusement Device」”,它已经显着发展,并且已成为人类生活中必不可少的一部分。 通过美国游戏行业的统计数据&…...

发电机负载测试方案
发电机负载测试是为了评估发电机在不同负载条件下的性能和稳定性。下面是一个可能的发电机负载测试方案: 测试前准备: - 确定测试的负载范围和条件,包括负载大小、负载类型(如电阻性、感性或容性负载)、负载持续时间等…...

Flask三种文件下载方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来实现文件下载。在本文中,我们将介绍三种不同的方法,以便你能够选择最适合你应用程序的方法。 方法一:使用 send_file 函数 send_file 函数是 Flask 中最常用的文件下载方法…...

OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》
OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》 一、结果演示二、NCC模板匹配2.1、OpenCV matchTemplate2.2、多角度2.3、多目标2.4、NMS非极大值抑制三、代码实现3.1 制作模板3.1 单目标匹配3.1.1 模板图像旋转3.1.2 旋转目标坐标3.2 多目标匹配3.2.1 制作模板3.2.…...

【书籍篇】Spring实战第4版 第2部分 Web中的Spring
Spring实战第4版 第2部分 Web中的Spring 五. 构建Spring Web应用程序5.1 SpirngMVC请求流程5.2 搭建Spring MVC5.2.1 配置DispatcherServlet5.2.2 配置WebConfig5.2.3 配置RootConfig 5.3 编写基本的控制器5.4 Spittr首页5.6 复杂的控制器5.6.1 定义类级别的请求处理5.6.2 传递…...

IC - 基础知识 - SOC与MCU
说明 工作中有涉及到SOC和MCU,非嵌入式专业,对两个概念理解不是很清晰。 共同点 MCU和SOC是两种常见的集成电路 (IC) 设计形式,它们的区别在于它们的设计目的和应用场景。工作中将MCU和SOC都称为IC也是没问题的,但是专业人员会…...

【elasticsearch+kibana基于windows docker安装】
创建网络:es和kibana容器互联 docker network create es-net加载镜像 docker pull elasticsearch:7.12.1运行 docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -v $…...

VMware网络设置 桥接模式 NAT VMNET0 1 8
1.桥接模式 虚拟机与主机并列 可拥有独立IP 主机与虚拟机之间,以及各虚拟机之间都可以互访。对应虚拟机就被当成主机所在以太网上的一个独立物理机来看待,各虚拟机通过默认的 VMnet0 网卡与主机以太网连接,虚拟机间的虚拟网络为 VMnet0。这…...

【MongoDB】MongoExport如何过滤数据导出
问题 使用MongoDB处理导出数据时,想增加数据过滤操作。 例如:导出所有isGirl为true的所有数据。 分析 在mongoexport说明文档中找到了query字段和queryFile字段,用来进行数据查询匹配导出。 query字段 后面直接跟 json格式数据。 queryF…...

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限
一、什么是分类问题? 在分类问题中,我们试图预测的变量𝑦是离散的值,通常表示某种类别或标签。这些类别可以是二元的,也可以是多元的。分类问题的示例包括: 判断一封电子邮件是否是垃圾邮件(二…...

C语言 用字符串比较函数cmp来做一个门禁:账号密码是否匹配 (干货满满)
#include<stdio.h> #include<string.h> void fun04() {for (int i 0; i < 3; i){char *str01 "hello";char uname[100] ;printf("请输入账号");scanf("%s",uname);char *str02 "123456";char pword[100];printf(&qu…...

Uniapp实现多语言切换
前言 之前做项目过程中,也做过一次多语言切换,大致思想都是一样的,想了解的可以看下之前的文章C#WinForm实现多语言切换 使用i18n插件 安装插件 npm install vue-i18n --saveMain.js配置 // 引入 多语言包 import VueI18n from vue-i18n…...

企业数字化转型与供应链效率-基准回归复刻(2007-2022年)
参照张树山(2023)的做法,本团队对来自统计与决策《企业数字化转型与供应链效率》一文中的基准回归部分进行复刻。文章实证检验企业数字化转型对供应链效率的影响。用年报词频衡量上市公司数字化转型程度,以库存周转天数来衡量供应…...

支持向量机 (SVM):初学者指南
照片由 Unsplash上的 vackground.com提供 一、说明 SVM(支持向量机)简单而优雅用于分类和回归的监督机器学习方法。该算法试图找到一个超平面,将数据分为不同的类,并具有尽可能最大的边距。本篇我们将介绍如果最大边距不存在的时候…...

UnityShader(五)
这次要用表面着色器实现一个水的特效。先翻到最下边看代码,看不懂再看下面的解释。 首先第一步要实现水的深浅判断,实现深水区和浅水区的区分。 这里需要用到深度图的概念。不去说太多概念,只去说怎么实现的,首先我们的水面是在…...

Java中的类和对象
文章目录 一、类和对象的基本概念二、类和对象的定义和使用1.创建类的语法2.创建类的对象3.范例(创建一个类的对象) 三、this引用1.什么是this引用2.this引用的特性 四、构造方法五、封装1.封装的概念2.访问限定符3.封装扩展包3.1包的概念3.2常见的包 六、static成员1.static修…...