Re:从零开始的C++世界——类和对象(下)

文章目录

  • 前言
  • 1.再谈构造函数
    • 🍎构造函数体赋值
    • 🍎初始化列表
    • 🍎特性
      • 🍌特性一
      • 🍌特性二
      • 🍌特性三
      • 🍌特性四
      • 🍌特性五
    • 🍎explicit 关键字
  • 2.static成员
    • 🍎概念
    • 🍎特性
      • 🍌特性一
      • 🍌特性二
      • 🍌特性三
      • 🍌特性四
      • 🍌特性五
      • 🍌特性六
      • 🍌特性七
    • 🍎思考
  • 3.C++11的成员初始化新玩法
  • 4. 友元
    • 🍎友元函数
    • 🍎特性
    • 🍎友元类
    • 🍎 特性
  • 5. 内部类
    • 🍎概念
    • 🍎特性
      • 🍌特性一
      • 🍌特性二
      • 🍌特性三

前言

本篇文章是「类和对象」的第三篇,是对类和对象的一个收尾和补充。

前两篇链接如下:

Re:从零开始的C++世界——类和对象(上)

Re:从零开始的C++世界——类和对象(中)

1.再谈构造函数

🍎构造函数体赋值

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

这里需要注意:

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。

因为初始化只能初始化一次,而构造函数体内可以多次赋值。

class Date
{
public:Date(int year, int month, int day){_year = year; // 第一次赋值_year = 2022; // 第二次赋值//......_month = month;_day = day;}
private:int _year;int _month;int _day;
};

以上就是在构造函数,对 _year 变量就行了两次赋值。

🍎初始化列表

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

代码示例:

class Date
{
public:Date(int year, int month, int day):_year(year),_month(month),_day(day){}
private:int _year;int _month;int _day;
};int main()
{Date d1(2022, 9, 1);return 0;
}

我们可以通过调试看一下:

在这里插入图片描述

🍎特性

🍌特性一

(1)每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。

因为初始化只能进行一次,所以同一个成员变量在初始化列表中不能多次出现。

🍌特性二

(2)类中包含以下成员,必须放在初始化列表位置进行初始化:

  • ·引⽤成员变量
class Date
{
private:int& _year; // 引用成员变量只能在定义时初始化
};

引用类型的变量在定义时就必须给其一个初始值,所以引用成员变量必须使用初始化列表对其进行初始化。

• const成员变量

class Date
{
private:const int _month; // const成员变量
};

被 const 修饰的变量也必须在定义时就给其一个初始值,也必须使用初始化列表进行初始化。

• 没有默认构造的类类型变量

class A
{
private:int _a;
};class Date
{
private:A _aa; // 自定义类型成员变量
};

若一个类没有 默认构造函数只,那么我们在实例化该类对象时就需要传参对其进行初始化,所以实例化没有默认构造函数的类对象时必须使用初始化列表对其进行初始化。

如下,在 A类里面并没有对内置类型 a进行赋值,那么在 B类里面就要对自定义类型的 aa 进行初始化列表初始化。

// A类
class A
{
public:A(int x):_a(x){}
private:int _a;
};// B类
class B
{
public:B(int a, int ref):_aa(a), _ref(ref), _n(10) {}
private:A _aa; // 没有默认构造函数int& _ref; // 引用const int _n; // const 
};

比如下面这种情况,默认构造函数是指不用传参就可以调用的构造函数。

// A类
class A //该类没有默认构造函数 
{
public:A(int val) //注:这个不叫默认构造函数(需要传参调用){_val = val;}
private:int _val;
};// B类
class B
{
public:B():_a(2021) //必须使用初始化列表对其进行初始化{}
private:A _a; //自定义类型成员(该类没有默认构造函数)
};

总结一下:在定义时就必须进行初始化的变量类型,就必须放在初始化列表进行初始化。

🍌特性三

(3)尽量使⽤初始化列表初始化。

因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显⽰在初始化列表初始化的⾃定义类型成员会调⽤这个成员类型的默认构造函数,如果没有默认构造会编译错误。

严格来说:

对于内置类型,使用初始化列表和在构造函数体内进行初始化实际上是没有差别的,其差别就类似于如下代码:

// 使用初始化列表
int a = 10// 在构造函数体内初始化(不使用初始化列表)
int a;
a = 10;

对于自定义类型,使用初始化列表可以提高代码的效率:

// Time类
class Time
{
public:Time(int hour = 0){_hour = hour;}
private:int _hour;
};// Test类
class Test
{
public:// 使用初始化列表Test(int hour):_t(12)// 调用一次Time类的构造函数{}
private:Time _t;
};

对于以上代码,当我们要实例化一个 Test 类的对象时,我们使用了初始化列表,在实例化过程中只调用了一次 Time 类的构造函数。

我们若是想在不使用初始化列表的情况下,达到我们想要的效果,就不得不这样写了:

// Time类
class Time
{
public:Time(int hour = 0){_hour = hour;}
private:int _hour;
};// Test类
class Test
{
public:// 在构造函数体内初始化(不使用初始化列表)Test(int hour){ //初始化列表调用一次Time类的构造函数(不使用初始化列表但也会走这个过程)Time t(hour);// 调用一次Time类的构造函数_t = t;// 调用一次Time类的赋值运算符重载函数}
private:Time _t;
};

这时,当我们要实例化一个 Test 类的对象时,在实例化过程中会先在初始化列表时调用一次 Time 类的构造函数,然后在实例化t对象时调用一次 Time 类的构造函数,最后还需要调用了一次 Time 类的赋值运算符重载函数,效率就降下来了。

🍌特性四

(4)成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关.

int i = 0;class Test
{
public:Test():_b(i++), _a(i++){}void Print(){cout << "_a:" << _a << endl;cout << "_b:" << _b << endl;}
private:int _a;int _b;
};int main()
{Test test;test.Print(); return 0;
}

打印结果_a为0,b为1
在这里插入图片描述
代码中,Test 类构造函数的初始化列表中成员变量 _b先初始化,成员变量**_a** 后初始化,按道理打印结果是 * *_a 为1,_b ** 为 0 .

但是初始化列表的初始化顺序是:成员变量在类中声明次序,所以最终_a 为 0,_b 为 1。

🍌特性五

(5)C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的。

#include<iostream>
using namespace std;class Time
{public :Time(int hour): _hour(hour){cout << "Time()" << endl;}
private:int _hour;
};class Date
{public :Date(): _month(2){cout << "Date()" << endl;} void Print() const{cout << _year << "-" << _month << "-" << _day << endl;}
private:// 注意这⾥不是初始化,这⾥给的是缺省值,这个缺省值是给初始化列表的// 如果初始化列表没有显⽰初始化,默认就会⽤这个缺省值初始化int _year = 1;int _month = 1;int _day;Time _t = 1;const int _n = 1;int* _ptr = (int*)malloc(12);
};int main()
{Date d1;d1.Print();return 0;
}

运行结果:
在这里插入图片描述

🍎explicit 关键字

构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有隐式类型转换的作用

#include <iostream>
using namespace std;class Date
{
public:Date(int year = 0) //单个参数的构造函数:_year(year){}void Print(){cout << _year << endl;}
private:int _year;
};int main()
{Date d1 = 2021; //支持该操作d1.Print();return 0;
}

打印可以看下结果:

在这里插入图片描述
在语法上,代码中 Date d1 = 2021 等价于以下两句代码:

int main()
{Date tmp(2021); //先构造Date d1(tmp); //再拷贝构造d1.Print();return 0;
}

运行看下结果:
在这里插入图片描述

所以在早期的编译器中,当编译器遇到 Date d1 = 2021 这句代码时,会先构造一个临时对象,再用临时对象拷贝构造 d1

但是现在的编译器已经做了优化,当遇到 Date d1 = 2021 这句代码时,会按照 Date d1(2021) 这句代码处理,这就叫做 隐式类型转换,

实际上,我们早就接触了隐式类型转换,只是我们不知道而已,以下代码也叫隐式类型转换:

int main()
{int a = 20;double b = a;cout << "a=" << a << endl;cout << "b=" << b << endl;return 0;
}

在这个过程中,编译器会先构建一个 double 类型的临时变量接收a的值,然后再将该临时变量的值赋值给b
这就是为什么函数可以返回局部变量的值,因为当函数被销毁后,虽然作为返回值的变量也被销毁了,但是隐式类型转换过程中所产生的临时变量并没有被销毁,所以该值仍然存在。

但是,对于单参数的自定义类型来说,,Dated1 = 2021 这种代码的可读性不是很好,我们若是想禁止单参数构造函数的隐式转换,可以用关键字 explicit 来修饰构造函数。

class Date
{
public:explicit Date(int year):_year(year){}
private:int _year;int _month;int _day;
};int main()
{Date d1(2018);d1 = 2019;return 0;
}

此时,运行的话就会编译不通过。
在这里插入图片描述

2.static成员

🍎概念

声明为 static 的类成员称为类的静态成员。

static 修饰的成员变量,称之为静态成员变量,用 static 修饰的成员函数,称之为静态成员函数。

静态的成员变量一定要在类外进行初始化。

🍎特性

🍌特性一

(1)静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。

首先,我们来看以下代码:

class Test
{
private:int _n;
};int main()
{cout << sizeof(Test) << endl;return 0;
}

运行以后会看到,结果是 4。
在这里插入图片描述

如果我们把 _n 设置为 静态成员 呢?

class Test
{
private:static int _n;
};int main()
{cout << sizeof(Test) << endl;return 0;
}

可以看到,Test 类的大小为 1。

在这里插入图片描述

因为静态成员 _n 是存储在静态区的,属于整个类,也属于类的所有对象。

所以计算类的大小或是类对象的大小时,静态成员并不计入其总大小之和。

🍌特性二

(2)静态成员变量必须在类外定义,定义时不添加 static 关键字。

代码示例:

class Date
{
private:static int _year;static int _month;
};// 静态成员变量的定义初始化
int Date::_year = 1;
int Date::_month = 1;

🍌特性三

类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。

class Date
{
public:static void Print(){cout << _year << "-" << _month << endl;}
private:static int _year;static int _month;
};int Date::_year = 2022;
int Date::_month = 10;int main()
{Date d1;d1.Print(); // 对象.静态成员Date::Print(); // 类名::静态成员return 0;
}

运行结果:

在这里插入图片描述

🍌特性四

(4)静态成员函数没有隐藏的 this 指针,不能访问任何非静态成员。

class Date
{
public:static void Print(){cout << _year << endl; cout << _month << endl; //不能访问非静态成员}
private:static int _year;int _month;
};int Date::_year = 2022;int main()
{Date d1;d1.Print(); // 对象.静态成员return 0;
}

可以看到,运行起来会报错。
在这里插入图片描述
含有静态成员变量的类,一般含有一个静态成员函数,用于访问静态成员变量。

🍌特性五

(5)静态成员和类的普通成员一样,也有 public、protected、private 这3种访问级别,也可以具有返回值。

所以当静态成员变量设置为private时,尽管我们突破了类域,也不能对其进行访问。

🍌特性六

(6)访问静态成员变量的方法:

当静态成员变量为公有时,有以下几种访问方式:

class Date
{
public:static int _year;
};//静态成员变量的定义初始化
int Date::_year = 2022;int main()
{Date d1;cout << d1._year << endl; // 1.通过类对象突破类域进行访问cout << Date()._year << endl; // 2.通过匿名对象突破类域进行访问cout << Date::_year << endl; // 3.通过类名突破类域进行访问return 0;
}

运行结果:
在这里插入图片描述

当静态成员变量为私有时,有以下几种访问方式:

class Date
{
public:static int GetYear(){return _year;}
private:static int _year;
};//静态成员变量的定义初始化
int Date::_year = 2022;int main()
{Date d1;cout << d1.GetYear() << endl; // 1.通过对象调用成员函数进行访问cout << Date().GetYear() << endl; // 2.通过匿名对象调用成员函数进行访问cout << Date::GetYear() << endl; // 3.通过类名调用静态成员函数进行访问return 0;
}

运行结果:

在这里插入图片描述

🍌特性七

(7)静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表。

🍎思考

问题一:静态成员函数可以调用非静态成员函数吗?

不可以。
因为非静态成员函数的第一个形参默认为 this 指针,而静态成员函数中没有 this 指针,故静态成员函数不可用非静态成员函数。

问题二:非静态成员函数可以调用静态成员函数吗?

可以。
因为静态成员函数和非静态成员函数都在类中,在类中不受访问限定符的限制。

3.C++11的成员初始化新玩法

C++11 支持非静态成员变量在声明时进行 初始化赋值,但是要注意这里不是初始化,这里是 给声明的成员变量缺省值

class A
{
public:void Print(){cout << a << endl;cout << p << endl;}
private:// 非静态成员变量,可以在成员声明时给缺省值。int a = 10;int* p = (int*)malloc(4);// 静态成员变量不能给缺省值static int n;
};int main()
{A a;a.Print();return 0;
}

可以运行看下结果:
在这里插入图片描述

注意:初始化列表是成员变量定义初始化的地方,若是给定了值,就用所给的值对成员变量进行初始化;若没有给定值,则用缺省值进行初始化;若是没有缺省值,则内置类型的成员就是随机值。

4. 友元

友元分为:友元函数 和 友元类。

友元提供了一种突破封装的方式,有时提供了便利。

但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

🍎友元函数

我们都知道 C++ 的<<和>>很神奇,因为它们能够自动识别输入和输出变量的类型,我们使用它们时不必像 C 语言一样增加数据格式的控制。

实际上,这一点也不神奇,内置类型的对象能直接使用 coutcin 输入输出,是因为库里面已经将它们的<<和>>重载好了,<和 >>能够自动识别类型,是因为它们之间构成了函数重载。

我们现在尝试重载 operator<<,但是我们发现没办法将其重载为成员函数。

#include <iostream>
using std::cin;
using std::cout;
using std::endl;class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}std::ostream& operator<<(std::ostream& out){out << _year << "-" << _month << "-" << _day;return out;}
private:int _year;int _month;int _day;
};int main()
{Date d(2017, 12, 24);cout << d;return 0;
}

我们发现是编译不通过的
在这里插入图片描述
为什么呢?

因为 cout 的输出流对象和隐含的 this 指针在抢占第一个参数的位置。this 指针默认operator<< 第一个参数,即左操作数,如果我们修改成 d<<cout 就可以正常运行了。

在这里插入图片描述
但是这样写是不是很怪?因为实际使用中 cout 需要是第一个形参对象才能正常使用。

所以我们要将 operator<< 重载为全局函数,但是这样的话,又会导致类外没办法访问成员,那么这里就需要友元 来解决。(operator>>同理)

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 friend 关键字。

来看看修改过后的代码:

class Date
{//友元函数friend std::ostream& operator<<(std::ostream& out, const Date& d); // 标准流输出 --> printffriend std::istream& operator>>(std::istream& in, Date& d); // 标准流插入 --> scanf
public:Date(int year = 1, int month = 1, int day = 1): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};// <<运算符重载---输入
ostream& operator<<(std::ostream& out, const Date& d) {out << d._year << "-" << d._month << "-" << d._day << endl;return out;
}// >>运算符重载---输出
istream& operator>>(std::istream& in, Date& d) {in >> d._year >> d._month >> d._day;return in;
}int main()
{Date d;cin >> d;cout << d << endl;return 0;
}

在这里插入图片描述
注意:其中 coutostream 类的一个全局对象,cinistream 类的一个全局变量,<<和 >>运算符的重载函数具有返回值是为了实现连续的输入和输出操作。

🍎特性

友元函数说明:

1.友元函数可访问类的私有和保护成员,但不是类的成员函数,

2.友元函数不能用 const 修饰。

3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。

4.一个函数可以是多个类的友元函数。

5.友元函数的调用与普通函数的调用和原理相同.

🍎友元类

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

class Date; // 前置声明class Time
{friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量
public:Time(int hour, int minute, int second): _hour(hour), _minute(minute), _second(second){}private:int _hour;int _minute;int _second;
};class Date
{
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;
};

🍎 特性

友元类说明:

(1)友元关系是单向的,不具有交换性。
比如上述 Time 类和 Date 类,在 Time 类中声明 Date 类为其友元类,那么可以在 Date 类中直接访问 Time 类的私有成员变量,但想在 Time 类中访问 Date 类中私有的成员变量则不行。

(2)友元关系不能传递
如果 B是 A 的友元,C 是 B 的友元,则不能说明 C 是 A 的友元。

5. 内部类

🍎概念

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。
如下所示,我在 A类里面定义了一个 B 类:

// 内部类
class A
{
private:static int k;int h;public:// 内部类class B // B天生就是A的友元,在B里面可以直接访问A的私有成员{public:void Print(const A& a){cout << k << endl; // 可以直接访问静态成员cout << a.h << endl; // 也可以访问普通成员}private:int _b;};
};int A::k = 1;int main()
{A a; // 定义a对象A::B bb; // 定义bb对象bb.Print(a); // 把a对象传给bb对象,打印return 0;
}

那么我直接可以在 B 类里面访问 A类的私有成员:

在这里插入图片描述

但是我不能在 A 类里面访问 B 类的私有成员,因为 A 不是 B 的友元。

注意:

·此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类

·外部类对内部类没有任何优越的访问权限。

内部类就是外部类的友元类。那么内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

🍎特性

🍌特性一

(1)内部类可以定义在外部类的 public、protected、private 这三个区域中的任一区域。

🍌特性二

(2)注意内部类可以直接访问外部类中的 static枚举成员,不需要外部类的对象或类名

🍌特性三

(3)sizeof(外部类)=外部类,和内部类没有任何关系。

#include <iostream>
using namespace std;class A //外部类
{
public:class B //内部类{private:double _b;};
private:int _a;
};int main()
{cout << sizeof(A) << endl; //外部类的大小return 0;
}

可以看到这里外部类 A的大小为 4,与内部类的大小无关。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘设备使用记录--阿加犀AIBox 6490

边缘设备使用记录--阿加犀AIBox 6490 设备介绍设备连接glog && gflagsonnx2tfliteAidLite SDK for C模型输入输出的shape执行推断 OpenCV使用 设备介绍 阿加犀AIBox 6490是一款基于高通QCS6490平台的高性价比智能边缘计算终端&#xff0c;具有14TOPS AI算力&#xff0…

Springboot整合ShardingJdbc实现分库分表方案

一、创建库表 1、创建两个数据库 CREATE SCHEMA shard_db_0 DEFAULT CHARACTER SET utf8 ; CREATE SCHEMA shard_db_1 DEFAULT CHARACTER SET utf8 ; 2、在每个数据库各创建三个分表 CREATE TABLE tb_order_0 (order_id bigint(20) NOT NULL,buyer_id bigint(20) not null …

dom4j 操作 xml 之按照顺序插入标签

最近学了一下 dom4j 操作 xml 文件&#xff0c;特此记录一下。 public class Dom4jNullTagFiller {public static void main(String[] args) throws DocumentException {SAXReader reader new SAXReader();//加载 xml 文件Document document reader.read("C:\\Users\\24…

【数据结构】探索排序的奥秘

若有不懂地方&#xff0c;可查阅我之前文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~_csdn博客 所属专栏&#xff1a;数据结构_专栏 目录 排序的概念 几种排序方法介绍 冒泡排序 选择排序 插入排序 堆排序 向上调整建堆排序 向下调整建堆排序 希尔排序 快速…

前后端数据交互设计到的跨域问题

前后端分离项目的跨域问题及解决办法 一、跨域简述 1、问题描述 这里前端vue项目的端口号为9000&#xff0c;后端springboot项目的端口号为8080 2、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域 当前页面url被请求页面url是否…

K8S 上部署 Emqx

文章目录 安装方式一&#xff1a;1. 快速部署一个简单的 EMQX 集群&#xff1a;2. 部署一个持久化的 EMQX 集群&#xff1a;3. 部署 EMQX Edge 集群和 EMQX 企业版集群&#xff1a; 安装方式二&#xff1a;定制化部署1. 使用 Pod 直接部署 EMQX Broker2. 使用 Deoloyment 部署 …

Jmeter关联

案例脚本实现&#xff1a;选择商品加入购物车 客户端发送一个登录的HTTP请求&#xff0c;服务端返回一个带着token的响应&#xff0c;后续发出一个带token信息的加入购物车的HTTP请求&#xff0c;返回响应。 关联&#xff1a;当请求直接由依赖关系的时候&#xff0c;比如一个请…

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

IDEA中Git常用操作及Git存储原理

Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统&#xff08;VCS&#xff09;&#xff0c;是团队合作开发…

2010-2022年别克英朗维修手册电路图线路图接线图资料更新

经过整理&#xff0c;2010-2022年别克英朗汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对…

How to integrate GPT-4 model hosted on Azure with the gptstudio package

题意&#xff1a;怎样将托管在Azure上的GPT-4模型与gptstudio包集成&#xff1f; 问题背景&#xff1a; I am looking to integrate the OpenAI GPT-4 model into my application. Here are the details I have: Endpoint: https://xxxxxxxxxxxxxxx.openai.azure.com/Locatio…

uniapp 开发 App 对接官方更新功能

插件地址&#xff1a;升级中心 uni-upgrade-center - App - DCloud 插件市场 首先创建一个 uni-admin 项目&#xff0c;选择你要部署的云开发服务商&#xff1a; 然后会自动下载模板&#xff0c;部署云数据库、云函数 第二步&#xff1a;将新创建的 uni-admin 项目托管到…

[算法] 优先算法(六):二分查找算法(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

传输层和网络层的关系,ip协议+ip地址+ip报头字段介绍(4位TOP字段,8位生存时间(ttl)),ip地址和端口号的作用

目录 传输层和网络层的关系 引入 介绍 ip协议 介绍 ip地址 引入 数据传递过程 举例(ip地址的作用) ip报头 格式 4位版本号 ip地址不足的问题 8位服务类型 4位TOP(type of service)字段 最小延时 最大吞吐量 4位首部长度 16位总长度 8位协议号 首部校验和…

vivado FFT IP Core

文章目录 前言FFT IP 接口介绍接口简介tdata 格式说明 其他细节关于计算精度及缩放系数计算溢出架构选择数据顺序实时/非实时模式数据输入输出时序关于配置信息的应用时间节点 FFT IP 例化介绍控制代码实现 & 测试参考文献 前言 由于计算资源受限&#xff0c;准备将上位机 …

【Linux应用编程】系统信息与资源 | 如获取、设置系统时间、日期、/proc 虚拟文件系统等

系统信息与系统资源 通过 Linux 系统调用或 C 库函数获取系统信息&#xff08;如获取系统时间、日期以及设置系统时间、日期等&#xff09;&#xff1b; Linux 系统下的/proc 虚拟文件系统&#xff08;读取系统、进程有关信息&#xff09;&#xff1b; 系统信息 主要介绍了用…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…

昇思MindSpore学习开始

昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;易开发表现为API友好、调试难度低&#xff1b;高效执行包括计算效率、数据预处理效率和分布式训练效率&#xff1b;全场景则指框架同时支持云、边缘以…

stm32:CAN通讯

目录 介绍 协议层 CAN的 帧/报文 种类 数据帧 远程帧&#xff08;遥控帧&#xff09; 错误帧 过载帧 帧间隔 总线仲裁 stm32的CAN外设 工作模式 测试模式 功能框图 时序 标准时序 例子 环回静默模式测试 寄存器代码 HAL版本 介绍 一种功能丰富的车用总线标…