【C++杂货铺】详解类和对象 [中]

news2024/11/16 21:31:41

                                                           博主:代码菌@-CSDN博客

                                                   专栏:C++杂货铺_代码菌@的博客-CSDN博客


目录

🌈前言🌈

📁 类的6个默认成员函数

📁 构造函数

 📂 概念

 📂 特性(灰常重要)

📁 析构函数

 📂 概念

 📂 特性

📂 对象销毁顺序

📁 拷贝构造函数

  📂 概念

  📂 特性

📁 赋值运算符重载

 📂运算符重载

 📂 赋值运算符重载

 📂 扩展:前置/后置++重载

📁 总结


🌈前言🌈

        欢迎收看本期【C++杂货铺】,这期内容,我们将围绕C++中类和对象部分内容进行讲解,包括了 6个默认构造函数,重点是构造和析构函数,拷贝复制函数等内容。

        如果你想学习C++,或者刚学完C语言衔接C++,那么这篇文章将会非常有效的帮助你理解。

📁 类的6个默认成员函数

        如果我们创建一个类,里面没有包含任何成员,就称为空类。

class Date{};

        但是,空类真的是什么也没有定义吗?不是,会默认生成6个默认成员函数。

📁 构造函数

 📂 概念

        构造函数完成的是初始化工作。构造函数不是创建空间,实例化对象的过程,而是创建对象时,编译器自动调用构造函数,初始化对象

        构造函数是一种特殊的成员函数,是在创建类的对象时,编译器自动调用的函数,以确保每个对象都有一个合适的初始值,并且在该对象的整个声明周期中只调用1次

        类的对象创建时,必须初始化,但我们有时没写过构造函数,为什么能编译过去呢,因为编译器会自动生成。

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

  void TestDate()
 {
      Date d1; // 调用无参构造函数
      Date d2(2015, 1, 1); // 调用带参的构造函数
  
      // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
      // 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
      // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)
      Date d3();
 }

        需要注意的是,如果我们想要无参初始化对象,不需要带()

 📂 特性(灰常重要)

        1. 函数名与类名相同。

        2. 无需返回值,即不需要写返回值类型。

        3. 构造函数可以重载

        4. 对象实例化过程中,编译期自动调用构造函数。

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

        5. 如果类中没有显示定义构造函数编译器会自动生成一个无参的默认构造函数,如果显示定义构造函数,编译器将不再生成默认构造函数。

 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类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数

 // 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成
 // 但此时,d1没有传递任何参数,此时可以采用函数全缺省来解决。


 Date d1;
 return 0;
 }

        6. 编译器生成的默认构造函数,对内置数据类型不做处理,对自定义数据类型会调用它的默认构造函数。(C++11标准规定,可以再成员变量声明时给缺省值值。)

class Time
{
public:
     Time()
     {
         cout << "Time()" << endl;
         _hour = 0;
         _minute = 0;
         _second = 0;
     }
private:
     int  _hour;
     int  _minute;
     int  _second;
};

class Date
{
private:
     // 基本类型(内置类型)
     int _year;
     int _month;
     int _day;
     // 自定义类型
     Time _t;
};

int main()
{
 Date d;
 return 0;
}

        但是,我们可以在比变量声明中给默认值。

        绝大数情景下面,都需要我们自己创建构造函数。

        7. 默认构造函数分为:编译器自生成的构造函数全缺省的构造函数自定义无参数的构造函数,并且以上三种只能存在一种。即不需要传参的构造函数就是默认构造函数。

        (如果类 没有默认构造函数,并且要实例化无参数类的对象,编译器会报错)

 class Date
 {
  public:
      // 1.无参构造函数
      Date()
     {}
  
      // 2.全缺省构造函数
      Date(int year = 2024, int month = 1, int day = 1)
     {
          _year = year;
          _month = month;
          _day = day;
     }
  private:
      int _year;
      int _month;
      int _day;
 };

        如果自己定义了构造函数,编译器就不会自动生成,而全缺省和无参构造函数理论上可以重载,但是在编译过程中,编译器不知道是哪一个。

        大多数情况下,推荐使用全缺省构造函数。

📁 析构函数

 📂 概念

        构造是初始化资源,那么析构函数就是释放资源。注意是释放资源,不是释放对象空间。如我们对象中有一个指针,维护一个动态开辟的空间。

        与构造函数功能相反,析构函数不是完成对象本身的销毁,局部对象的销毁工作是由编译器完成的。而对象在销毁时自动调用析构函数,完成对象中资源的清理工作。

 📂 特性

1. 析构函数名是在类名前面加上 ~

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

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

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

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 = NULL;
			_capacity = 0;
			_size = 0;
		}
	}
private:
	DataType* _array;
	int _capacity;
	int _size;
};
void TestStack()
{
	Stack s;
	s.Push(1);
	s.Push(2);
}

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;
}

        即使没有创建Time类的对象,依然会调用Time类的析构函数。因为创建了Date类的对象,d的生命周期结束时,自动调用析构函数。

        对于内置类型不需要资源清理,最后系统直接将其内存回收即可,而_t是Time类对象,所以会调用Time类的析构函数,所以最后打印~Time()。

6. 如果类中没有申请资源,析构函数可以不写,直接使用编译器自动生成的默认析构函数,;若有自愿申请,一定要写,否则会造成资源泄露。

📂 对象销毁顺序

class Test
{
private:
	int _a;
public:
	Test(int a = 1)
	{
		_a = a;
	}
	~Test()
	{
		cout << _a << endl;
	}
};

Test t4(5);
static Test t5(4);

int main()
{
	Test t1(1);
	Test t2(2);

	static Test t3(3);

	return 0;
}

        这里,我们创建5个同类的对象,在对象销毁,析构资源时,打印看看谁先销毁。

        是采用后进先出,先局部后全局的原理。即先销毁局部空间的对象,按照后进先出的方式;在销毁全局空间的对象,按照后进先出的原理。

📁 拷贝构造函数

  📂 概念

        如果我们想要用已有的对象为基础创建一个新对象,就必须在创建新对象时,拷贝已有对象。

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

        

  📂 特性

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

2. 拷贝构造函数的参数只有1个,且必须是类对象的引用。(不能使用传值调用,编译器会直接报错,因为会引起无穷递归。)

        我们首先来看一下,C++中自定义类型的传值调用。以下面代码为例,func1是传值调用,func2是传引用。

class Date
{
public:
	int _year;
	int _month;
	int _day;

	//默认构造函数
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
    //拷贝构造函数
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._month;
	}
};

void func1(Date d)
{
	cout << d._year << endl;
}

void func2(Date& d)
{
	cout << d._year << endl;
}

int main()
{
	Date d1(2024,1,1);

	func1(d1);
	func2(d1);
}

        C++规定,自定义类型传参的时候都会调用拷贝构造函数。所以自定义类型传参的时候,推荐使用引用,引用就是对象的别名。

        这是在函数中使用传参调用,如果在拷贝构造函数中使用传参调用呢?就会造成无穷递归调用

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

class Time
{

public:
	Time()
	{
		_hour = 1;
		_minute = 1;
		_second = 1;
	}

	Time(const Time& t)
	{
		_hour = t._hour;
		_minute = t._minute;
		_second = t._second;
		cout << "Time::Time(const 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 d1;

	// 用已经存在的d1拷贝构造d2,此处会调用Date类的拷贝构造函数
	// 但Date类并没有显式定义拷贝构造函数,则编译器会给Date类生成一个默认的拷贝构造函数
	Date d2(d1);
	return 0;
}

        在编译器生成的默认拷贝拷贝构造函数中,内置类型是按照字节序方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

4. 编译器生成的拷贝构造函数已经完成了字节序的值拷贝,但只是浅拷贝,不能完成深拷贝的工作。如果涉及到资源的申请,必须使用自定义的拷贝构造函数,完成深拷贝任务。

        例如,我们有一个指针,维护动态开辟的空间,浅拷贝后,新对象中的指针还是指向同一块空间。对象销毁,析构资源时,释放两次内存空间,编译器会报错。

        程序结束后,析构资源师,会发生运行错误。因为对同一块空间释放了两次。

        总结,类如果没涉及申请资源,拷贝构造函数可以不写;一旦涉及申请资源,拷贝构造函数一定要写,否则就是浅拷贝。

5. 拷贝构造函数使用场景:

 ● 使用已存在对象创建新对象
​​​​​​ ​● 函数参数类型为类 类型对象
​​​​​​ ​● 函数返回值类型为类 类型对象

📁 赋值运算符重载

 📂运算符重载

        C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型。

        例如,对于内置类型,编译器支持+,-,*,/等运算,对于自定义类型,编译器却不支持,所以引入了运算符重载的概念。

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

函数原型:返回值类型   operator运算符(参数列表)

注意:

        ● 不能通过连接其他符号来创建新的操作符,例如operator@,必须是C/C++语法存在的。

        ● 重载运算符必须有一个类 类型参数

        ● 用于内置类型的运算符不能重载,其含义不能改变。

        ● 作为类的成员函数重载时,形参比实际操作数少1,因为成员函数的第一个参数是隐藏的this指针。

        ● ① .*    ② ::   ③ sizeof   ④ ?:    ⑤    这5个运算符不能重载

        此外,通常情况下,对于类的成员变量一般是封装起来的,是私有的,所以,一般情况下,运算符重载一般 重载成成员函数

        下面是,成员变量是公有的情况:

// 全局的operator==
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;
}
void Test ()
{
    Date d1(2018, 9, 26);
    Date d2(2018, 9, 27);
    cout<<(d1 == d2)<<endl;
}

        下面是,成员变量是私有的情况:

class Date
{ 
public:
 Date(int year = 1900, int month = 1, int day = 1)
   {
        _year = year;
        _month = month;
        _day = day;
   }
    
    // bool operator==(Date* this, const Date& d2)
    // 这里需要注意的是,左操作数是this,指向调用函数的对象
    bool operator==(const Date& d2)
 {
        return _year == d2._year;
            && _month == d2._month
            && _day == d2._day;
 }
private:
 int _year;
 int _month;
 int _day;
};

 📂 赋值运算符重载

 1. 赋值运算符重载格式

         ● 参数类型: const T& ,传引动可以提高传参效率。

        ● 返回值类型: T& ,返回引用可以提高返回的效率,有返回值的目的是支持连续赋值。

        ● 检测是否给自己赋值。

        ● 返回*this : 要符合连续赋值的含义。

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;
   }
 
 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 ;
};

2.  赋值运算符只能重载成类的成员函数,不能重载成全局函数。

class Date
{
public:
 Date(int year = 1900, int month = 1, int day = 1)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 int _year;
 int _month;
 int _day;
};
// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
Date& operator=(Date& left, const Date& right)
{
 if (&left != &right)
 {
 left._year = right._year;
 left._month = right._month;
 left._day = right._day;
 }
 return left;
}
// 编译失败:
// error C2801: “operator =”必须是非静态成员

        可以简单理解为,当创建为全局函数时,与类中的赋值运算符重载冲突,因为赋值运算符重载时默认成员函数,在类中如果没有显示定义,编译器会自动生成。

3. 用户没有显示定义是,编译器会默认生成一个默认赋值运算符重载,以值的形式逐字节拷贝, 也就是浅拷贝。

        ( 对于内置数据类型是直接赋值,即浅拷贝;对于自定义数据类型,调用它的默认赋值运算符重载完成赋值。)

        如同拷贝构造函数一样,如果涉及到资源的申请,必须要自己实现赋值运算符重载,完成深拷贝。

此外,我们来对比一下拷贝构造函数与赋值运算符重载的概念

拷贝构造函数: 使用一个已有的类对象,来初始化一个正在创建的对象。

赋值运算符重载:已存在两个类的对象,将一个对象中的数据拷贝到另一个对象中。

    Date d1;
    Date d2 = d1;

    对于上面这两行代码,蛇拷贝构造韩式赋值运算符重载呢?是拷贝构造,不能看到=,就认为是赋值运算符重载,d2是正在创建的对象。

 📂 扩展:前置/后置++重载

        前置++:返回+1之后的结果。

        后置++:是先使用后+1,因此需要返回+1之前的旧值。

        C++规定,后置++重载时多增加1个int类型的参数,但调用函数时不用传递,便编译器自动传递。

Date& operator++()
{
     _day += 1;
     return *this;
}
Date operator++(int)
{
     Date temp(*this);
     _day += 1;
     return temp;
}

Date d1;
d1++;
+=d1;

        同理,前置/后置-- 也一样。

📁 总结

        总结,我们就对默认成员函数最重要的部分内容进行了讲解,包含了构造函数,析构函数,拷贝构造函数和赋值运算符重载,深入研究了它们的特性。

        以上知识的零碎点较多,需要我们不断的实践,巩固自己。

        如果感觉这篇文章对你有帮助,欢迎点赞,收藏,关注。Thanks♪(・ω・)ノ

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

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

相关文章

用友U8接口-部署和简要说明(1)

概括 本专栏文章目的说明对目前用友U8ERP接口介绍对底层接口二次封装的介绍 说明 过去发布过介绍U8接口文章简介&#xff0c;参考以下链接。 U8接口开发方式 本专栏文章与下面的HTTP接口相辅相成&#xff0c;主要是写给正在使用&#xff0c;或未来使用本套接口的开发人员&am…

Harmony的自定义组件和Page的数据同步

在开发过程中会经常使用自定义组件,就会遇到一个问题,在页面中引入组件后,如何把改变的值传递到自定义组件中呢,这就用到了装饰器,在这是单向传递的,用的装饰器是@State和@Prop @State在page页面中监听数据的变化 @Prop在自定义组件中监听page页面传递过来的变化值,并赋…

关于开展人工智能从业人员“计算机视觉处理设计开发工程师”专项培训(第二期)的通知!

近日我们刚刚结束了《计算机视觉处理设计开发工程师》证书第一期培训&#xff0c;培训效果良好&#xff0c;所有学员均通过工信部统一线上考试&#xff0c;坐等证书了。鉴于学员们的反应我们第二期课程如约而至。 证书出台背景&#xff1a;为进一步贯彻落实中共中央印发《关于深…

VMware中CentOS 7解决网络问题

问题描述 在 VMware 中使用 CentOS 7 中使用 ping www.baidu.com 测试网络是否能正常连接。 出现了未知的名称和服务的问题&#xff1a; 解决方案一 在服务中检查 VMware NAT Service 是否开启 解决方案二 在控制面板中的网络适配器里检查 解决方案三 检查VMware中的网络适…

DAY10_SpringBoot—SpringMVC重定向和转发RestFul风格JSON格式SSM框架整合Ajax-JQuery

目录 1 SpringMVC1.1 重定向和转发1.1.1 转发1.1.2 重定向1.1.3 转发练习1.1.4 重定向练习1.1.5 重定向/转发特点1.1.6 重定向/转发意义 1.2 RestFul风格1.2.1 RestFul入门案例1.2.2 简化业务调用 1.3 JSON1.3.1 JSON介绍1.3.2 JSON格式1.3.2.1 Object格式1.3.2.2 Array格式1.3…

Python第十二章(函数2)

一。变量作用域&#xff1a; 1.局部变量&#xff1a;定义于函数内部&#xff0c;生效在函数&#xff0c;外部不生效 作用&#xff1a;临时保存数据&#xff0c;当函数调用完毕后&#xff0c;则摧毁局部变量 2.全局变量&#xff1a;定义于函数体外面&#xff0c;在函数体外面…

实现元素进入界面的平滑效果

先看效果&#xff1a; 实现思路&#xff1a;获取页面中需要加载动画的节点&#xff0c;用元素的animate()方法创建一个动画对象&#xff0c;并传入两个关键帧&#xff0c;接着使用IntersectionObserverAPI创建观察对象&#xff0c;用于观察元素进入页面。当元素进入界面时&…

sqli.labs靶场(第18~22关)

18、第十八关 经过测试发现User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0加引号报错 这里我们闭合一下试试 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0,127.0.0.1,adm…

漏洞原理linux操作系统的SqlMap工具的使用

漏洞原理linux操作系统的SqlMap工具的使用 Linux操作系统基础操作链接: 1024一篇通俗易懂的liunx命令操作总结(第十课)-CSDN博客 kali的IP地址:192.168.56.1 实操 # kali中使用sqlmap http://192.168.56.1/ sqlmap -u http://192.168.56.1/news/show.php?id46 sqlmap -u …

线程锁多线程的复习

线程 实现方式3种乐观锁&悲观锁线程池线程池总结 进程:是正在运行的程序 线程:是进程中的单个顺序控制流,是一条执行路径 实现方式3种 1.Thread //步骤一:定义一个继承Thread的类 //步骤二:再定义的类中重写run()方法 //步骤三:创建定义类对象 //步骤四:启动线程 class M…

轮廓测长|轮廓仪高精度测量粗糙度

现代工业制造领域中&#xff0c;为什么测量粗糙度至关重要&#xff1f;在现代工业制造领域中&#xff0c;测量粗糙度是一项非常重要的工作。因为粗糙度能够影响到工件的功能性能和外观质量。当我们制造机器零件或工具时&#xff0c;需要确保表面的光洁度能够满足设计要求。过高…

iOS 自动打包 命令之如何获取PROVISIONING_PROFILE

获取描述文件UUID&#xff1a; 首先在Finder中前往/Users/用户名/Library/MobileDevice/Provisioning Profiles路径 然后在Provisioning Profiles文件夹中选择打包需要的描述文件&#xff0c;一般描述文件的文件名都是由UUID组成的&#xff0c;如果文件名不是由UUID组成的&…

STM32入门教程-2023版【5-1】EXTI外部中断

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 本节主要讲的是&#xff0c;中断系统和外部中断&#xff0c;依靠外部中断来学习中断系统 中断系统&…

idea docker 内网应用实践

文章目录 前言一、服务器端1.1 离线安装docker1.2 开启docker远程访问1.3 制作对应jdk镜像1.3.1 下载jdk171.3.2 Dockerfile 制作jdk17镜像1.3.3 镜像导出1.3.4 服务器引入镜像 二、Idea 配置2.1 Dockerfile2.2 pom 引入docker插件2.3 idea docker插件配置2.4 打包镜像上传2.5 …

基于logisim的MIPS单周期硬布线24条指令CPU

目录 1 前言 2 思路分享 2.1 下载资源 2.2 观看视频 2.3 连接相关电路 2.4 撰写报告 2.5 答辩准备 3 云盘链接 1 前言 该项目为本人大三上学期的实训成果&#xff0c;在实训过程中&#xff0c;纯靠自己摸索&#xff0c;因此迷茫了一段时间。为了不让后来的同学重蹈覆辙…

快速入门JavaScript基础

JavaScript认知 序言 JavaScript发展历史(JS) 简称JS 1.Netscape(网景) 公司的这种浏览器脚本语言&#xff0c;最初名字叫做 Mocha2.1995年9月改为 LiveScript3.1995年12月&#xff0c;Netscape 公司与 Sun 公司&#xff08;Java 语言的发明者和所有者&#xff09;达成协议&am…

Layui + Echarts 5.0

Layui 怎么整合最新版本的 Echarts 5.0&#xff0c;Echarts 4 升级到 5后&#xff0c;有了很大改变&#xff0c;新的配置项4是无法兼容的&#xff0c;所以想要使用新的功能&#xff0c;都需要升级&#xff01; 新建一个echarts.js文件 layui.define(function (exports) {// 这…

C#,广义斐波那契数(Generalised Fibonacci Numbers)的算法

广义斐波那契序列(generalized Fibonacci sequence)是斐波那契数的推广。由递推关系F₁F₂…Fm-10&#xff0c;Fₘ1&#xff0c;FmnFₙFn1…Fnm1&#xff0c;n≥1所产生的序列&#xff0c;称为m级广义斐波那契序列。 计算结果&#xff1a; 源代码&#xff1a; 1 文本格式 …

AF647 二苯并环辛炔,AF647-DBCO,一种明亮且可感光的远红色染料

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;AF647 二苯并环辛炔&#xff0c;AF647 DBCO&#xff0c;Alexa Fluor 647 DBCO&#xff0c;AF647-二苯并环辛炔&#xff0c;AF647-DBCO 一、基本信息 产品简介&#xff1a;Alexa Fluor 647是一种独特的远红色染料&am…

第14章 File类与IO流

第14章 File类与IO流 主要内容 File类字节流字符流文件流缓冲流转换流对象流打印流Scanner、System与IO流 教学目标 使用File类对象表示文件或目录 能够辨别相对路径和绝对路径 能够说出IO流的分类和功能 能够使用FileOutputStream写出数据到文件 能够使用FileInputStream读…