谭浩强C程序设计.pptx

上传人:莉*** 文档编号:77381015 上传时间:2023-03-14 格式:PPTX 页数:78 大小:306.28KB
返回 下载 相关 举报
谭浩强C程序设计.pptx_第1页
第1页 / 共78页
谭浩强C程序设计.pptx_第2页
第2页 / 共78页
点击查看更多>>
资源描述

《谭浩强C程序设计.pptx》由会员分享,可在线阅读,更多相关《谭浩强C程序设计.pptx(78页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、会计学1谭浩强谭浩强C程序设计程序设计所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。运算符也可以重载。实际上,我们已经在不知不觉之中使用了运算符重载。现在要讨论的问题是:用户能否根据自己的需要对C+已提供的运算符进行重载,赋予它们新的含义,使之一名多用。譬如,能否用“+”号进行两个复数的相加。在C+中不能在程序中直接用运算符“+”对复数进行相加运算。用户必须自己设法实现复数相加。例如用户可以通过定义一个专门的函数来实现复数相加。见例10.1。10.1 10.1 什么是运算符重载什么是运算符重载什么是运算符重载什么是运算符重载第1页/共78页例10.1

2、 通过函数来实现复数相加。#include include using namespace std;using namespace std;class Complex /class Complex /定义定义ComplexComplex类类 public:public:Complex()real=0;imag=0;/Complex()real=0;imag=0;/定义构造函数定义构造函数Complex(double r,double i)real=r;imag=i;/Complex(double r,double i)real=r;imag=i;/构造函数重载构造函数重载Complex com

3、plex_add(Complex&c2);/Complex complex_add(Complex&c2);/声明复数相加函数声明复数相加函数void display();/void display();/声明输出函数声明输出函数 private:private:double real;/double real;/实部实部double imag;/double imag;/虚部虚部;Complex ComplexComplex Complex complex_add(Complex&c2)complex_add(Complex&c2)Complex c;Complex c;c.real=rea

4、l+c2.real;c.real=real+c2.real;第2页/共78页c.imag=imag+c2.imag;c.imag=imag+c2.imag;return c;return c;void Complexvoid Complex display()/display()/定义输出函数定义输出函数 cout(real,imagi)endl;cout(real,imagi)endl;int main()int main()Complex c1(3,4),c2(5,-10),c3;/Complex c1(3,4),c2(5,-10),c3;/定义定义3 3个复数对象个复数对象c3=plex

5、_add(c2);/c3=plex_add(c2);/调用复数相加函数调用复数相加函数coutc1=;c1.display();/coutc1=;c1.display();/输出输出c1c1的值的值coutc2=;c2.display();/coutc2=;c2.display();/输出输出c2c2的值的值coutc1+c2=;c3.display();/coutc1+c2=;c3.display();/输出输出c3c3的值的值return 0;return 0;运行结果如下:c1=(3+4i)c1=(3+4i)c2=(5-10i)c2=(5-10i)c1+c2=(8,-6i)c1+c2=(

6、8,-6i)第3页/共78页结果无疑是正确的,但调用方式不直观、太烦琐,使人感到很不方便。能否也和整数的加法运算一样,直接用加号“+”来实现复数运算呢?如c3=c1+c2;c3=c1+c2;编译系统就会自动完成c1和c2两个复数相加的运算。如果能做到,就为对象的运算提供了很大的方便。这就需要对运算符“+”进行重载。第4页/共78页运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的函数一般格式如下:函数类型 operator 运算符名称(形参表列)对运

7、算符的重载处理 例如,想将“+”用于Complex类(复数)的加法运算,函数的原型可以是这样的:Complex operator+(Complex&c1,Complex&c2);Complex operator+(Complex&c1,Complex&c2);10.2 10.2 运算符重载的方法运算符重载的方法运算符重载的方法运算符重载的方法第5页/共78页在定义了重载运算符的函数后,可以说:函数operator+重载了运算符+。为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想像为调用下面的函数:int operator+(int a,int b)int opera

8、tor+(int a,int b)return(a+b);return(a+b);如果有表达式5+8,就调用此函数,将5和8作为调用函数时的实参,函数的返回值为13。这就是用函数的方法理解运算符。可以在例10.1程序的基础上重载运算符“+”,使之用于复数相加。第6页/共78页例例10.2 10.2 改写例改写例10.110.1,重载运算符,重载运算符“+”,使,使之能用于两个复数相加。之能用于两个复数相加。#include include using namespace std;using namespace std;class Complexclass Complexpublic:publi

9、c:Complex()real=0;imag=0;Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex&c2);/Complex operator+(Complex&c2);/声明重载运算符的函数声明重载运算符的函数void display();void display();private:private:double real;double real;double imag;double i

10、mag;Complex ComplexComplex Complex operator+(Complex&c2)/operator+(Complex&c2)/定义重载运算符的函数定义重载运算符的函数 Complex c;Complex c;c.real=real+c2.real;c.real=real+c2.real;c.imag=imag+c2.imag;c.imag=imag+c2.imag;第7页/共78页return c;return c;void Complexvoid Complex display()display()cout(real,imagi)endl;cout(real,

11、imagi)endl;int main()int main()Complex c1(3,4),c2(5,-10),c3;Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;/c3=c1+c2;/运算符运算符+用于复数运算用于复数运算coutc1=;c1.display();coutc1=;c1.display();coutc2=;c2.display();coutc2=;c2.display();coutc1+c2=;c3.display();coutreal+c2.real,this-real就是c1.real。在10.2节中已说明,在将运算符函数重载为成员函数后,如

12、果出现含该运算符的表达式,如c1+c2,编译系统把它解释为c1.operator+(c2)即通过对象c1调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。运算符重载函数的返回值是Complex类型,返回值是复数c1和c2之和(Complex(c1.real+c2.real,c1.imag+c2.imag)。第16页/共78页运算符重载函数除了可以作为类的成员函数外,还可以是非成员函数。可以将例10.2改写为例10.3。例10.3 将运算符“+”重载为适用于复数加法,重载函数不作为成员函数,而放在类外,作为Complex类的友元函数。#include includ

13、e using namespace std;using namespace std;class Complexclass Complexpublic:public:Complex()real=0;imag=0;Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex(double r,double i)real=r;imag=i;friend Complex operator+(Complex&c1,Complex&c2);/friend Complex operator+(Complex&c1,Complex

14、&c2);/重载函数作为友元函数重载函数作为友元函数void display();void display();private:private:double real;double real;double imag;double imag;第17页/共78页;Complex operator+(Complex&c1,Complex&c2)/Complex operator+(Complex&c1,Complex&c2)/定义作为友元函数的重载函定义作为友元函数的重载函数数 return Complex(c1.real+c2.real,c1.imag+c2.imag);return Comple

15、x(c1.real+c2.real,c1.imag+c2.imag);void Complexvoid Complex display()display()cout(real,imagi)endl;cout(real,imagi)endl;int main()int main()Complex c1(3,4),c2(5,-10),c3;Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;c3=c1+c2;coutc1=;c1.display();coutc1=;c1.display();coutc2=;c2.display();coutc2=;c2.display();

16、coutc1+c2=;c3.display();coutc1+c2=;c3.display();第18页/共78页与例10.2相比较,只作了一处改动,将运算符函数不作为成员函数,而把它放在类外,在Complex类中声明它为友元函数。同时将运算符函数改为有两个参数。在将运算符“+”重载为非成员函数后,C+编译系统将程序中的表达式c1+c2解释为operator+(c1,c2)operator+(c1,c2)即执行c1+c2相当于调用以下函数:Complex operator+(Complex&c1,Complex&c2)Complex operator+(Complex&c1,Complex&c

17、2)return Complex(c1.real+c2.real,c1.imag+c2.imag);return Complex(c1.real+c2.real,c1.imag+c2.imag);求出两个复数之和。运行结果同例10.2。为什么把运算符函数作为友元函数呢?因为运算符函数要访问Complex类对象中的成员。如果运算符函数不是Complex类的友元函数,而是一个普通的函数,它是没有权利访问Complex类的私有成员的。第19页/共78页在10.2节中曾提到过:运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数。现在分别讨论这3种情

18、况。首先,只有在极少的情况下才使用既不是类的成员函数也不是友元函数的普通函数,原因是上面提到的,普通函数不能直接访问类的私有成员。在剩下的两种方式中,什么时候应该用成员函数方式,什么时候应该用友元函数方式?二者有何区别呢?如果将运算符重载函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,因此可以少写一个函数的参数。但必须要求运算表达式第一个参数(即运算符左侧的操作数)是一个类对象,第20页/共78页而且与运算符函数的类型相同。因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数返回值与该对象同类型,运算结果才有意义。在例10.2中,表达式c1+c2中第一个参数c1是

19、Complex类对象,运算符函数返回值的类型也是Complex,这是正确的。如果c1不是Complex类,它就无法通过隐式this指针访问Complex类的成员了。如果函数返回值不是Complex类复数,显然这种运算是没有实际意义的。如想将一个复数和一个整数相加,如c1+i,可以将运算符重载函数作为成员函数,如下面的形式:Complex ComplexComplex Complex operator+(int&i)/operator+(int&i)/运算符重载函数作为运算符重载函数作为ComplexComplex类的类的成员函数成员函数 return Complex(real+i,imag);

20、return Complex(real+i,imag);第21页/共78页注意在表达式中重载的运算符“+”左侧应为Complex类的对象,如c3=c2+i;c3=c2+i;不能写成c3=i+c2;/c3=i+c2;/运算符运算符“+”的左侧不是类对象,编译出错的左侧不是类对象,编译出错如果出于某种考虑,要求在使用重载运算符时运算符左侧的操作数是整型量(如表达式i+c2,运算符左侧的操作数i是整数),这时是无法利用前面定义的重载运算符的,因为无法调用i.operator+函数。可想而知,如果运算符左侧的操作数属于C+标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能

21、作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。可以在Complex类中声明:第22页/共78页friend Complex operator+(int&i,Complex&c);/friend Complex operator+(int&i,Complex&c);/第一个参数可以不是类第一个参数可以不是类对象对象在类外定义友元函数:Complex operator+(int&i,Complex&c)/Complex operator+(int&i,Complex&c)/运算符重载函数不是成员运算符重载函数不是成员函数函数 return Complex(i+c.real,c

22、.imag);return Complex(i+c.real,c.imag);将双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第二个参数对应。如c3=i+c2;/c3=i+c2;/正确,类型匹配正确,类型匹配c3=c2+i;/c3=c2+i;/错误,类型不匹配错误,类型不匹配第23页/共78页请注意,数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符“+”。如Complex operator+(Complex&c

23、,int&i)/Complex operator+(Complex&c,int&i)/此时第一个参数为类对象此时第一个参数为类对象 return Complex(i+c.real,c.imag);return Complex(i+c.real,c.imag);这样,使用表达式i+c2和c2+i都合法,编译系统会根据表达式的形式选择调用与之匹配的运算符重载函数。可以将以上两个运算符重载函数都作为友元函数,也可以将一个运算符重载函数(运算符左侧为对象名的)作为成员函数,另一个(运算符左侧不是对象名的)作为友元函数。但不可能将两个都作为成员函数,原因是显然的。C+规定,有的运算符(如赋值运算符、下标

24、运算符、函数调用运算符)必须定义为类的成员函数,有的运算符则不能定义为类的成员函数(如流插入“”、类型转换运算符)。第24页/共78页由于友元的使用会破坏类的封装,因此从原则上说,要尽量将运算符函数作为成员函数。但考虑到各方面的因素,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。在学习了本章第10.7节例10.9的讨论后,读者对此会有更深入的认识。说明:有的C+编译系统(如Visual C+6.0)没有完全实现C+标准,它所提供不带后缀.h的头文件不支持把成员函数重载为友元函数。上面例10.3程序在GCC中能正常运行,而在Visual C+6.0中会编译出错。但是Visual C

25、+所提供的老形式的带后缀.h的头文件可以支持此项功能,因此可以将程序头两行修改如下,即可顺利运行:#include include 以后如遇到类似情况,亦可照此办理。第25页/共78页双目运算符(或称二元运算符)是C+中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,如3+5,a=b,i10等。在重载双目运算符时,不言而喻在函数中应该有两个参数。下面再举一个例子说明重载双目运算符的应用。10.5 10.5 重载双目运算符重载双目运算符重载双目运算符重载双目运算符第26页/共78页例例10.4 10.4 定义一个字符串类定义一个字符串类StringString,用来存放不定长用来

26、存放不定长的字符串,重载运算符的字符串,重载运算符“=”,“”,用,用于两个字符串的等于、小于和大于的比较运算。于两个字符串的等于、小于和大于的比较运算。为了使读者便于理解程序,同时也使读者了解建为了使读者便于理解程序,同时也使读者了解建立程序的步骤,下面分几步来介绍编程过程。立程序的步骤,下面分几步来介绍编程过程。(1)(1)先建立一个先建立一个StringString类:类:#include include using namespace std;using namespace std;class Stringclass Stringpublic:public:String()p=NULL

27、;/String()p=NULL;/默认构造函数默认构造函数String(char*str);/String(char*str);/构造函数构造函数void display();void display();private:private:char*p;/char*p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;第27页/共78页StringString String(char*str)/String(char*str)/定义构造函数定义构造函数 p=str;/p=str;/使使p p指向实参字符串指向实参字符串void Stringvoid String display()/di

28、splay()/输出输出p p所指向的字符串所指向的字符串 coutp;coutp;int main()int main()String string1(Hello),string2(Book);String string1(Hello),string2(Book);string1.display();string1.display();coutendl;cout”。程序如下:。程序如下:#include include#include#include using namespace std;using namespace std;class Stringclass Stringpublic:

29、public:String()p=NULL;String()p=NULL;String(char*str);String(char*str);friend bool operator(String&string1,String&string2);/friend bool operator(String&string1,String&string2);/声明运算符函数为友元函数声明运算符函数为友元函数void display();void display();private:private:char*p;/char*p;/字符型指针,用于指向字符串字符型指针,用于指向字符串;StringStri

30、ng String(char*str)String(char*str)p=str;p=str;第29页/共78页void Stringvoid String display()/display()/输出输出p p所指向的字符串所指向的字符串 coutp;cout(String&string1,String&string2)/bool operator(String&string1,String&string2)/定义运算符重载函数定义运算符重载函数 if(strcmp(string1.p,string2.p)0)if(strcmp(string1.p,string2.p)0)return tr

31、ue;return true;else return false;else return false;int main()int main()String string1(Hello),string2(Book);String string1(Hello),string2(Book);coutstring2)endl;coutstring2)(String&string1,String&string2);friend bool operator(String&string1,String&string2);friend bool operator(String&string1,String&s

32、tring2);friend bool operator(String&string1,String&string2)/bool operator(String&string1,String&string2)/对运算符对运算符“”重载重载 if(strcmp(string1.p,string2.p)0)if(strcmp(string1.p,string2.p)0)return true;return true;elseelsereturn false;return false;bool operator(String&string1,String&string2)/bool operator

33、(String&string1,String&string2)/对运算符对运算符“”重载重载 if(strcmp(string1.p,string2.p)0)if(strcmp(string1.p,string2.p)0)return true;return true;elseelse第31页/共78页return false;return false;bool operator=(String&string1,String&string2)/bool operator=(String&string1,String&string2)/对运算符对运算符“=”重载重载 if(strcmp(stri

34、ng1.p,string2.p)=0)if(strcmp(string1.p,string2.p)=0)return true;return true;elseelsereturn false;return false;再修改主函数:int main()int main()String string1(Hello),string2(Book),string3(Computer);String string1(Hello),string2(Book),string3(Computer);coutstring2)endl;/coutstring2)endl;/比较结果应该为比较结果应该为truet

35、ruecout(string1string3)endl;/cout(string1string3)endl;/比较结果应该为比较结果应该为false false cout(string1=string2)endl;/cout(string1=string2)endl;/比较结果应该为比较结果应该为false false return 0;return 0;第32页/共78页运行结果为1 10 00 0结果显然是对的。到此为止,主要任务基本完成。(4)再进一步修饰完善,使输出结果更直观。下面给出最后的程序。#include include using namespace std;using na

36、mespace std;class Stringclass Stringpublic:public:String()p=NULL;String()p=NULL;String(char*str);String(char*str);friend bool operator(String&string1,String&string2);friend bool operator(String&string1,String&string2);friend bool operator(String&string1,String&string2);friend bool operator(String&st

37、ring1,String&string2);friend bool operator=(String&string1,String&string2);friend bool operator=(String&string1,String&string2);第33页/共78页void display();void display();private:private:char*p;char*p;StringString String(char*str)String(char*str)p=str;p=str;void Stringvoid String display()/display()/输出输

38、出p p所指向的字符串所指向的字符串 coutp;cout(String&string1,String&string2)bool operator(String&string1,String&string2)if(strcmp(string1.p,string2.p)0)if(strcmp(string1.p,string2.p)0)return true;return true;elseelsereturn false;return false;bool operator(String&string1,String&string2)bool operator(String&string1,S

39、tring&string2)第34页/共78页if(strcmp(string1.p,string2.p)0)if(strcmp(string1.p,string2.p)(string1,string2)=1)if(operator(string1,string2)=1)string1.display();cout;string2.display();string1.display();cout;string2.display();elseelseif(operator(string1,string2)=1)if(operator(string1,string2)=1)第35页/共78页str

40、ing1.display();cout;string2.display();string1.display();cout;string2.display();elseelseif(operator=(string1,string2)=1)if(operator=(string1,string2)=1)string1.display();cout=;string2.display();string1.display();cout=;string2.display();coutendl;coutBookHelloBookBookComputerBookComputerHello=HelloHell

41、o=Hello第36页/共78页增加了一个compare函数,用来对两个字符串进行比较,并输出相应的信息。这样可以减轻主函数的负担,使主函数简明易读。通过这个例子,不仅可以学习到有关双目运算符重载的知识,而且还可以学习怎样去编写C+程序。这种方法的指导思想是:先搭框架,逐步扩充,由简到繁,最后完善。边编程,边调试,边扩充。千万不要企图在一开始时就解决所有的细节。类是可扩充的,可以一步一步地扩充它的功能。最好直接在计算机上写程序,每一步都要上机调试,调试通过了前面一步再做下一步,步步为营。这样编程和调试的效率是比较高的。读者可以试验一下。第37页/共78页单目运算符只有一个操作数,如!a,-b,

42、&c,*p,还有最常用的+i和-i等。重载单目运算符的方法与重载双目运算符的方法是类似的。但由于单目运算符只有一个操作数,因此运算符重载函数只有一个参数,如果运算符重载函数作为成员函数,则还可省略此参数。下面以自增运算符“+”为例,介绍单目运算符的重载。10.6 10.6 重载单目运算符重载单目运算符重载单目运算符重载单目运算符第38页/共78页例例10.5 10.5 有一个有一个TimeTime类,包含数据成员类,包含数据成员minute(minute(分分)和和sec(sec(秒秒),模拟秒表,每次走一秒,满,模拟秒表,每次走一秒,满6060秒进一分秒进一分钟,此时秒又从钟,此时秒又从0

43、0开始算。要求输出分和秒的值。开始算。要求输出分和秒的值。#include include using namespace std;using namespace std;class Timeclass Timepublic:public:Time()minute=0;sec=0;/Time()minute=0;sec=0;/默认构造函数默认构造函数Time(int m,int s):minute(m),sec(s)/Time(int m,int s):minute(m),sec(s)/构造函数重载构造函数重载Time operator+();/Time operator+();/声明运算符重

44、载函数声明运算符重载函数void display()coutminute:secendl;/void display()coutminute:sec=60)if(+sec=60)第39页/共78页sec-=60;/sec-=60;/满满6060秒进秒进1 1分钟分钟+minute;minute;return*this;/return*this;/返回当前对象值返回当前对象值 int main()int main()Time time1(34,0);Time time1(34,0);for(int i=0;i61;i+)for(int i=0;i61;i+)+time1;+time1;time1

45、.display();time1.display();return 0;return 0;运行情况如下:34:134:134:234:2 34:5934:5935:035:035:1 (35:1 (共输出共输出6161行行)第40页/共78页可以看到:在程序中对运算符“+”进行了重载,使它能用于Time类对象。“+”和“-”运算符有两种使用方式,前置自增运算符和后置自增运算符,它们的作用是不一样的,在重载时怎样区别这二者呢?针对“+”和“-”这一特点,C+约定:在自增(自减)运算符重载函数中,增加一个int型形参,就是后置自增(自减)运算符函数。例10.6 在例10.5程序的基础上增加对后置自

46、增运算符的重载。修改后的程序如下:#include include using namespace std;using namespace std;class Timeclass Timepublic:public:Time()minute=0;sec=0;Time()minute=0;sec=0;Time(int m,int s):minute(m),sec(s)Time(int m,int s):minute(m),sec(s)第41页/共78页Time operator+();/Time operator+();/声明前置自增运算符声明前置自增运算符“+”重载函数重载函数Time ope

47、rator+(int);/Time operator+(int);/声明后置自增运算符声明后置自增运算符“+”重载函数重载函数void display()coutminute:secendl;void display()coutminute:sec=60)if(+sec=60)sec-=60;sec-=60;+minute;+minute;return*this;/return*this;/返回自加后的当前对象返回自加后的当前对象 Time TimeTime Time operator+(int)/operator+(int)/定义后置自增运算符定义后置自增运算符“+”重载函数重载函数 Tim

48、e temp(*this);Time temp(*this);sec+;sec+;第42页/共78页if(sec=60)if(sec=60)sec-=60;sec-=60;+minute;+minute;return temp;/return temp;/返回的是自加前的对象返回的是自加前的对象 int main()int main()Time time1(34,59),time2;Time time1(34,59),time2;cout time1:;cout time1:;time1.display();time1.display();+time1;+time1;cout+time1:;c

49、out+time1:;time1.display();time1.display();time2=time1+;/time2=time1+;/将自加前的对象的值赋给将自加前的对象的值赋给time2time2couttime1+:;couttime1+:;time1.display();time1.display();cout time2:;cout time2:;time2.display();/time2.display();/输出输出time2time2对象的值对象的值 第43页/共78页请注意前置自增运算符“+”和后置自增运算符“+”二者作用的区别。前者是先自加,返回的是修改后的对象本身

50、。后者返回的是自加前的对象,然后对象自加。请仔细分析后置自增运算符重载函数。运行结果如下:time1:34:59 (time1time1:34:59 (time1原值原值)+time1:35:0 (time1:35:0 (执行执行+time1time1后后time1time1的值的值)time1+:35:1 (time1+:35:1 (再执行再执行time1+time1+后后time1time1的值的值)time2:35:0 (time2time2:35:0 (time2保存的是执行保存的是执行time1+time1+前前time1time1的值的值)可以看到:重载后置自增运算符时,多了一个i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com