二、类与对象(三)

17 初始化列表

17.1 初始化列表的引入

之前我们给成员进行初始化时,采用的是下面的这种方式:

class Date
{
public:
    Date(int year, int month, int day)//构造函数
    {
        _year = year;
        _month = month;
        _day = day;
    }
private:
    int _year;
    int _month;
    int _day;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是实际上并不能将其称为对对象中成员变量进行初始化,因为构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

例:

#include <iostream>
using namespace std;
class A
{
public:
	int _a1;
	int _a2;
	//const int _x;
    //const int _x = 1;
};
int main()
{
	A aa;
	return 0;
}

const int _x;前运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

const int _x;后运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

const int _x = 1;后运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么加了const int _x;这条语句后运行起来编译器就报错了呢?这是因为const变量必须在定义的位置初始化,而A aa;是整体定义的地方,并不能在那里对_x进行初始化,虽然我们可以将语句修改为const int _x = 1;,但是这样做的实质并不是初始化,而是给了_x一个缺省值,而且这个特性只有在C++11之后才有,那么在C++11之前该怎么办呢?所以说,必须给每个成员变量找一个定义的位置,不然像const这样的成员将不好处理。

所以为了解决这样的问题,C++引入了初始化列表这样的方式。

17.2 初始化列表的特性

  1. 初始化列表由以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。

例:

class Date
{
public:
	Date(int year, int month, int day)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
  1. 哪个对象调用构造函数,初始化列表就是它所有成员变量定义的位置。不管成员变量是否在初始化列表中显示,编译器都会对每个成员变量进行定义。

例:

#include <iostream>
using namespace std;
class A
{
public:
	A()
		:_x(1)
		,_a2(1)
	{
		_a1++;
		_a2--;
	}
	void Print()
	{
		cout << _a1 << " " << _a2 << " " << _x << endl;
	}
	int _a1 = 2;
	int _a2 = 2;
	const int _x;
};
int main()
{
	A aa;
	aa.Print();
	return 0;
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

调试结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从调试结果可以看到,在上述例子中,当初始化列表对_a1进行初始化时,由于_a1未在初始化列表中显式设置,所以使用了缺省值对其进行初始化,而对_a2_x则直接用( )中的值进行初始化。等初始化完成后,初始化列表再去执行{ }中的操作。

  1. 类中包含以下成员,必须放在初始化列表位置进行初始化:
    1. 引用成员变量
    2. const成员变量
    3. 自定义类型成员变量(且该类没有默认构造函数时)

例:

#include <iostream>
using namespace std;
class A
{
public:
	A(int a)//不是A的默认构造函数
		:_a(1)
	{}
	void Print()
	{
		cout << _a;
	}
private:
	int _a;
};
class B
{
public:
	B(int a = 1, int ref = 1)
		: _aobj(1)
		, _ref(ref)
		, _n(10)
	{}
	void Print()
	{
		_aobj.Print();
		cout << " " << _ref << " " << _n << endl;
	}
private:
	A _aobj;      // 没有默认构造函数
	int& _ref;	  // 引用
	const int _n; // const 
};

int main()
{
	B bb;
	bb.Print();
	return 0;
}

初始化列表中无_aobj(1)时运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化列表中无_ref(ref)时运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化列表中无_n(10)时运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正常运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:尽量使用初始化列表初始化,因为不管是否使用初始化列表,对于自定义类型的成员变量,一定会先使用初始化列表进行初始化。

  1. 每个成员变量在初始化列表中只能出现一次,因为只能初始化一次。
  2. 成员变量在类中声明的次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

例:

#include <iostream>
using namespace std;
class A
{
public:
    A(int a)
        :_a1(a)
        , _a2(_a1)
    {}

    void Print() {
        cout << _a1 << " " << _a2 << endl;
    }
private:
    int _a2;
    int _a1;
};
int main() 
{
    A aa(1);//构造函数
    aa.Print();//
}

输出结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,由于_a2在类中声明的次序在_a1的前面,所以_a2会比_a1先初始化,而_a2在初始化列表中又是用_a1的值进行初始化,_a1在没有被初始化之前又是随机值,所以_a2初始化所得到的也是随机值。

18 explicit关键字

18.1 explicit关键字的引入

引入explicit关键字之前,我们先来看下面一段代码:

#include <iostream>
using namespace std;
class A
{
public:
    A(int a)
        :_a1(a)
    {}

    void Print() {
        cout << _a1 << " " << _a2 << endl;
    }
private:
    int _a2;
    int _a1;
};
int main() 
{
    A aa1(1);//构造函数
    A aa2 = 1;//编译能通过吗?
    aa1.Print();
    aa2.Print();
    return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,A aa2 = 1;这条语句的左右两边明明不是同一个类型,编译却通过了,这是因为这里发生了隐式的类型转换。

也就是说,A aa2 = 1;这条语句会先生成一个1的具有常性的临时变量,将这个临时变量的类型转换为A后再用来给aa2初始化。

例:

#include <iostream>
using namespace std;
class A
{
public:
    A(int a)
        :_a1(a)
    {}

    void Print() const
    {
        cout << _a1 << " " << _a2 << endl;
    }
private:
    int _a2;
    int _a1;
};
int main() 
{
    A aa1(1);//构造函数
    const A& ref = 10;//类型转换
    //A& ref = 10;
    ref.Print();
    return 0;
}

const修饰A& ref的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不用const修饰A& ref的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,由于类型转换时生成的临时变量具有常性,如果被赋值的对象不具有常性的话编译器就会报错。

实际上,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

如果不想让这种类型转换发生,就需要引入explicit关键字。

18.2 explicit关键字的特性

  1. 对于单参构造函数,使用explicit修饰后将禁止类型转换。
  2. 对于第一个参数无默认值其余均有默认值的构造函数,使用explicit修饰后也将禁止类型转换。

例:

#include <iostream>
using namespace std;
class Date
{
public:
	// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用
	 Date(int year)
		:_year(year)
	{}
	// 2. 虽然有多个参数,但是创建对象时后两个参数有默认值,使用explicit修饰,禁止类型转换
	/*explicit Date(int year, int month = 1, int day = 1)
	: _year(year)
	, _month(month)
	, _day(day)
	{}*/
	Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};
void Test()
{
	Date d1(2022);
	// 用一个整形变量给日期类型对象赋值
	// 实际编译器背后会用2023构造一个临时对象,而后用临时对象给d1对象进行赋值
	d1 = 2023;
}
int main()
{
	Test();
	return 0;
}

屏蔽单参构造函数后的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

屏蔽多参构造函数后的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

19 static成员

19.1 static成员的引入

引入static成员之前,我们先来看一道面试题。

题目:实现一个类,计算程序中创建出了多少个类对象。

在我们学C语言的时候,可以通过定义一个全局变量count来计数,但到了C++之后,如果还用这样的方式那么类的封装性就无法体现了,所以在C++中引入了static成员来解决这个问题。

C++规定,声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数。

19.2 static成员的特性

  1. 静态成员变量一定要在类外进行定义和初始化,定义时不添加static关键字,在类中只起声明作用。
  2. 静态成员为所有类对象所共享,它不属于某个具体的对象,而是存放在静态区。
  3. 类静态成员的访问方式:
    1. 类名::静态成员
    2. 对象.静态成员
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受publicprotectedprivate访问限定符的限制。

掌握了static成员的特性,我们就可以用它来解答刚才的问题了。

#include <iostream>
using namespace std;
class A
{
public:
	A() { ++_scount; }
	A(const A& t) { ++_scount; }
	~A() { --_scount; }
	int GetACount() { return _scount; }
private:
	static int _scount;
};
int A::_scount = 0;
int main()
{
	A a1, a2;
	A a3(a1);
	A* ptr = nullptr;
	cout << a1.GetACount() << endl;
	cout << a2.GetACount() << endl;
	cout << ptr->GetACount() << endl;
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,不仅用对象.静态成员的方式可以访问到静态成员,当对象的指针为空时也可以进行访问。

类名::静态成员这样的访问方式有什么应用场景呢?

我们可以考虑这样一个问题:当我们想知道一个函数内部创建了多少个对象时,该怎么做呢?

由于这个时候对象是在函数内部创建的,那么我们在函数外部再使用对象.静态成员的方式进行访问就明显不合适了,那该怎么办呢?

有人提出了下面这种方法:

#include <iostream>
using namespace std;
class A
{
public:
	A(int a = 0) { ++_scount; }
	A(const A& t) { ++_scount; }
	int GetACount() { return _scount; }
private:
	static int _scount;
};
int A::_scount = 0;
void Test()
{
	A a1 = 1, a2 = 1;
	A a3(a1);
}
int main()
{
	Test();
	A a4;
	cout << a4.GetACount()-1 << endl;
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从输出结果可以看到,这种方法通过在函数外再创建一个对象,然后用这个对象去访问静态成员之后再减1,就得到了函数内部所创建对象的个数。

这个方法虽然能够达到效果,但是总归是有点撇脚的,有没有什么更好的办法呢?

这个时候就可以考虑用类名::静态成员的方式来进行访问。

采用这种方式的话,我们就需要用staticGetACount函数修饰为静态成员函数,由于静态成员函数没有this指针,所以它就可以通过指定类域来进行调用。

#include <iostream>
using namespace std;
class A
{
public:
	A(int a = 0) { ++_scount; }
	A(const A& t) { ++_scount; }
	static int GetACount() { return _scount; }
private:
	static int _scount;
};
int A::_scount = 0;
void Test()
{
	A a1 = 1, a2 = 1;
	A a3(a1);
}
int main()
{
	Test();
	cout << A::GetACount() << endl;
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

19.3 练习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这道题本身其实不难,可是题目要求不能使用乘除法、forwhileifelseswitchcase等关键字及条件判断语句(A?B:C),就让问题比较棘手了。

那么在这里,其实我们就可以利用static的特性,通过在一个类里面声明静态成员变量_i_sum,一个用于自增,一个用于求和。而后在类里面定义一个求和函数Sum,让其实现每调用一次_sum就加_i,同时_i自增以实现等差求和。

#include <iostream>
using namespace std;
class Sum
{
public:
	Sum()
	{
		_sum += _i;
		++_i;
	}
	static int GetSum()//用于获取私有成员_sum
	{
		return _sum;
	}
private:
	static int _i;
	static int _sum;
};
int Sum::_i = 1;
int Sum::_sum = 0;

class Solution
{
public:
	int Sum_Solution(int n)
	{
		Sum a[n];
		return Sum::GetSum();
	}
};

需要注意的是,由于部分老版的编译器不支持变长数组,所以在编译器上运行时可能会报错,但是在oj上是可以正常通过的。

20 友元

20.1 友元的引入

之前我们想把一个日期类Date输入,是采用这样的方式:

#include <iostream>
using namespace std;
class Date
{
public:
    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(2023, 10, 5);
    d1.Print();
    return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样虽然能够实现输出的功能,但每次都要通过对象去调用Print函数才能实现,有没有什么办法能够像内置类型那样直接用cout输出呢?

有人想到如果能将流插入运算符<<重载,那样就好办了,我们不妨来试一下:

#include <iostream>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
        : _year(year)
        , _month(month)
        , _day(day)
    {}
    ostream& operator<<(ostream& _cout, const Date& d)
    {
        _cout << d._year << "-" << d._month << "-" << d._day << endl;
        return _cout;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Date d1(2023, 10, 5);
    cout << d1 << endl;
    return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编译器报错了,这是什么原因呢?

实际上,这是因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置,this指针默认是第一个参数也就是左操作数,但是实际使用中cout需要是第一个形参对象,如果要将operator<<重载为成员函数,当前就只能通过下面的方式:

#include <iostream>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
        : _year(year)
        , _month(month)
        , _day(day)
    {}
    ostream& operator<<(ostream& _cout)
    {
        _cout << _year << "-" << _month << "-" << _day << endl;
        return _cout;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Date d1(2023, 10, 5);
    d1 << cout << endl;// d1 << cout; -> d1.operator<<(&d1, cout);
    return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然这样确实比刚才调用Print函数要方便了,但这明显是不符合常规的调用逻辑的。

要让cout是第一个形参对象,还有个方法就是将operator<<重载成全局函数。

#include <iostream>
using namespace std;
class Date
{
public:
    Date(int year, int month, int day)
        : _year(year)
        , _month(month)
        , _day(day)
    {}
//private:
    int _year;
    int _month;
    int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
    _cout << d._year << "-" << d._month << "-" << d._day << endl;
    return _cout;
}
int main()
{
    Date d1(2023, 10, 5);
    cout << d1 << endl;
    return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个时候好像就能满足我们的要求了,但是新的问题又出现了:类外要访问成员只能将成员变为公有,但这样一来封装性又无法得到保证了。

要解决这个问题,此时就需要友元来解决。

20.2 友元函数的特性

  1. 友元函数是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
  2. 友元函数可访问类的私有和保护成员,但不是类的成员函数。
  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符的限制。
  4. 一个函数可以是多个类的友元函数。
  5. 友元函数的调用与普通函数的调用原理相同。
  6. 当模板函数作为类模板的友元函数时,不能像普通函数那样在类里面友元声明函数名即可,要直接在类模板中定义友元函数

知道了以上友元函数的特性,我们不仅可以用cout来输出自定义类型,还可以用cin来输入自定义类型。

#include <iostream>
using namespace std;
class Date
{
	friend ostream& operator<<(ostream& _cout, const Date& d);
	friend istream& operator>>(istream& _cin, Date& d);
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
	_cout << d._year << "-" << d._month << "-" << d._day;
	return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
	_cin >> d._year;
	_cin >> d._month;
	_cin >> d._day;
	return _cin;
}
int main()
{
	Date d;
	cin >> d;
	cout << d << endl;
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

20.3 友元类的特性

友元类的所有成员函数都可以是另一个类的友元函数,且都可以访问另一个类中的非公有成员。

关于友元类,有以下几点特性:

  1. 友元关系是单向的,不具有交换性。比如上述的Date类,如果我们还想再加一个Time类,并在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有成员变量则不行。
  2. 友元关系不能传递。也就是说,如果CB的友元,BA的友元,则不能说明CA的友元。
  3. 友元关系不能继承。(该特性会在后续讲到继承的时候再详细介绍)

例:

#include <iostream>
using namespace std;
class Time
{
    friend class Date;   // 声明日期类为时间类的友元类,则在Date类中就可以直接访问Time类中的私有成员变量
    friend ostream& operator<<(ostream& _cout, const Date& d);
    friend istream& operator>>(istream& _cin, Date& d);
public:
    Time(int hour = 0, int minute = 0, int second = 0)
        : _hour(hour)
        , _minute(minute)
        , _second(second)
    {}

private:
    int _hour;
    int _minute;
    int _second;
};
class Date
{
    friend ostream& operator<<(ostream& _cout, const Date& d);
    friend istream& operator>>(istream& _cin, Date& d);
public:
    Date(int year = 1900, int month = 1, int day = 1)
        : _year(year)
        , _month(month)
        , _day(day)
    {}

    void SetTimeOfDate(int hour, int minute, int second)
    {
        // 直接访问时间类私有的成员变量
        _t._hour = hour;
        _t._minute = minute;
        _t._second = second;
    }

private:
    int _year;
    int _month;
    int _day;
    Time _t;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
    _cout << d._year << "年" << d._month << "月" << d._day << "日"
          << d._t._hour << "时" << d._t._minute << "分" << d._t._second << "秒" << endl;
    return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
    _cin >> d._year;
    _cin >> d._month;
    _cin >> d._day;
    _cin >> d._t._hour;
    _cin >> d._t._minute;
    _cin >> d._t._second;
    return _cin;
}
int main()
{
    Date d1;
    cin >> d1;
    cout << d1;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社招面试题:说一说SPI是什么,有哪些使用场景?

大家好&#xff0c;我是小米&#xff01;今天在这里和大家分享一个在技术面试中常被问到的话题——SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;这是一个令人着迷的技术领域&#xff0c;也是很多Java开发者必须要熟悉的概念。不废话&#xff0c;让我们一…

TikTok短视频互动:设计引人入胜的玩法体验

在数字社交的浪潮中&#xff0c;TikTok以其独特的短视频形式和丰富多彩的互动玩法&#xff0c;成为了全球年轻一代热衷的社交平台。本文将深入剖析TikTok短视频互动的精髓&#xff0c;探讨其设计背后的原理&#xff0c;以及为何这种互动体验如此吸引人。 创意挑战的魅力 TikTok…

机器视觉在智能交通与无人驾驶领域的应用及前景

​引言 机器视觉算法对于智能交通系统和无人驾驶技术是十分重要的。机器视觉技术是无人驾驶汽车感知环境、做出决策的关键&#xff0c;它使得车辆能够理解周围的世界并安全地导航。在智能交通系统中&#xff0c;机器视觉也发挥着至关重要的作用&#xff0c;从提高交通效率到增…

Unity Shader 实现X光效果

Unity Shader 实现X光效果 Unity Shader 实现实物遮挡外轮廓发光效果第五人格黎明杀机火炬之光 实现方案操作实现立体感优化总结源码 Unity Shader 实现实物遮挡外轮廓发光效果 之前看过《火炬之光》、《黎明杀机》、《第五人格》等不少的游戏里面人物被建筑物遮挡呈现出不同的…

【Java干货教程】JSON,JSONObject,JSONArray类详解

一、定义 JSON&#xff1a;就是一种轻量级的数据交换格式&#xff0c;被广泛应用于WEB应用程序开发。JSON的简洁和清晰的层次结构&#xff0c;易于阅读和编写&#xff1b;同时也易于机器解析和生成&#xff0c;有效的提升网络传输效率&#xff1b;支持多种语言&#xff0c;很多…

「年终总结」生成人工智能的奇妙年份

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

MySQL之复合查询

单表查询回顾 在讲解多表查询前&#xff0c;我们先回顾一下单表查询&#xff0c;这是因为多表查询本质上依然是单表查询&#xff08;其原因在下文中讲解多表查询时再说明&#xff09;&#xff0c;只要掌握了单表查询&#xff0c;那么想掌握多表查询是非常简单的。 在<<…

【Electron】富文本编辑器之文本粘贴

由于这个问题导致&#xff0c;从其他地方复制来的内容 粘贴发送之后都会多一个 换行 在发送的时候如果直接&#xff0c;发送innerHTML 就 可以解决 Electron h5 Andriod 都没问题&#xff0c;但是 公司的 IOS 端 不支持&#xff0c;且不提供支持&#xff08;做不了。&#xff…

2023年华为OD机试(python)B卷-符合要求的结对方式

一、题目 题目描述&#xff1a; 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入输出 输入描述: 5 1 2 2 2 3 4 第一行为…

个人用户免费,亚马逊正式推出 AI 编程服务 CodeWhisperer

亚马逊于 2022 年 6 月以预览版的形式&#xff0c;推出了 AI 辅助编程服务 CodeWhisperer。2023年4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用&#xff0c;同时推出的还有供所有开发人员免费使用的个人版&#xff08;Code…

深入理解Mysql MHA高可用集群搭建:从实验到实战

1. 简介 MHA&#xff08;Master High Availability&#xff09;是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim&#xff08;前DeNA员工&#xff0c;现在Facebook&#xff09;创建&#xff0c;MHA支持MySQL的主从复制架构&#xff0c;自动化主节点故障转移。当…

Lunix的奇妙冒险————权限篇

文章目录 一.什么是权限二.用户权限和类别。1.用户2.角色3.更换文件角色 三.文件的类别和对应权限1.文件的类别。2.文件属性权限1.权限说明。2.默认生成文件权限来源3.更改权限 3.文件的执行与删除 四.不同用户共同在一个目录下的权限。1.普通用户家目录2.在同一目录下文件的权…

springcloud中使用openfeign来优化接口调用

简单介绍在springcloud中使用openfeign来优化接口调用 目录 一、引入依赖二、为服务提供者编写openfeign接口三、服务消费者调用定义的openfeign接口四、项目结构五、日志级别配置1、通过配置类进行全局配置2、通过配置类进行局部配置3、通过配置文件配置 一、引入依赖 <!-…

工业信息采集平台 软件界面介绍

关键字&#xff1a;蓝鹏测控典型界面,蓝鹏测控交互界面,蓝鹏测控图形界面,蓝鹏测控历史界面,蓝鹏测控自定义界面 软件测控平台对UI程序界面&#xff0c;实现形式没有要求&#xff0c;也就是说&#xff0c;客户可以根据自己的需要设计任何样式的交互界面。 &#xff08;1&…

大数据前馈神经网络解密:深入理解人工智能的基石

文章目录 大数据前馈神经网络解密&#xff1a;深入理解人工智能的基石一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函…

突破PHP disable_functions方法

1. 利用 LD_PRELOAD 环境变量 知识扫盲 LD_PRELOAD&#xff1a;是Linux系统的一个环境变量&#xff0c;它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv()&#xff1a;PHP函数&#xff0c;可以设置环境变量mail()&#xff0c;error_log()&#xff1a;PHP函数&…

ERROR: No matching distribution found for torch==2.0.1解决方案

大家好&#xff0c;我是水滴~~ 本文主要介绍在安装 stable-diffusion-webui 时出现的 ERROR: No matching distribution found for torch2.0.1 问题的解决方案&#xff0c;希望能对你有所帮助。 《Python入门核心技术》专栏总目录・点这里 文章目录 问题描述解决方案离线安装 …

基于ssm潍坊理工学院就业信息网的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本潍坊理工学院就业信息网就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数…

VSCode安装Go环境

VSCode安装Go 1.点击Go官网&#xff0c;根据自己环境下载go安装包&#xff0c;我这里为Windows 2.双击安装包&#xff0c;一直点击【Next】即可 VSCode配置Go基础环境 1.创建Go的工作目录: C:\Code\GoCode 2.创建Go的环境变量: GOPATH (1)右键【此电脑】&#xff0c;点击…

什么是骨传导耳机?骨传导能保护听力吗?

骨传导耳机是一种非常特殊的蓝牙耳机&#xff0c;它通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机&#xff0c;它不通过空气传送声音&#xff0c;而是通过头骨的振动来传送声音。 并且骨传导耳机能够在一定程度上起到保护听力的作用&#xff0c;主要是因为它们不…
最新文章