欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C++程序设计教程课件.ppt

    • 资源ID:69925056       资源大小:180KB        全文页数:52页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C++程序设计教程课件.ppt

    C+程序设计教程(第二版)第九章 对象生灭 1/11/20231第九章内容1.构造函数设计构造函数设计2.构造函数的重载构造函数的重载3.类成员初始化类成员初始化4.构造顺序构造顺序5.拷贝构造函数拷贝构造函数6.析构函数析构函数7.对象转型与赋值对象转型与赋值1/11/202321.构造函数设计构造函数设计初始化要求 定义一个对象,其形式与定义一个变量相似,但更具意义。对象与变量的不同在于对象对应于事物,要求从诞生之时起便有明确的意义.对象必须建立一种初始化机制,以满足在编程中可以针对实际问题所提出的要求而赋给一个有意义的初值。创建一个对象,若创建的是全局对象,则以全0的模式表示对象,若创建局部对象,则以随机值表示对象。1/11/20233 对象的初始化不是简单的参数与成员对应,而是联系参数到成员的过程.封装性要求Struct Point int x,y;Point d=2,3;class Point int x,y;/;Point d=2,3;正确错误 封装性的要求杜绝了这种初始化形式,事实上,这种形式根本不能完成对象的初始化过程中的校验和计算工作。对象通常是一个复杂的实体,在构建对象过程中,并不一定是一个初值对应一个对象分量。许多时候,一个初值只是传递一个信息,告诉对象的创建工作应怎么进行。封装性要求对象创建中按传递的信息进行一个过程化的初始化工作。1/11/20234函数形式构造函数(constructor)是与类名同名的特殊的成员函数,当定义该类的对象时,构造函数将被自动调用以实现对该对象的初始化。构造函数不能有返回值,因而不能指定包括void在内的任何返回值类型。构造函数的定义体可与其它成员函数成员一样,放在类内或类外都可。构造函数的定义格式为:类名(形参说明)类名(形参说明)函数体函数体 构造函数既可定义成有参函数,也可义成无参函数,要根据问题的需要来定。全局变量和静态变量在定义时,将自动赋初值为0;局部变量在定义时,其初始值不固定的。而当对象被定义时,由于对象的意义表达了现实世界的实体,所以一旦定义对象,就必须有一个有意义的初始值,在C+中,在定义对象的同时,给该对象初始化的方法就是利用构造函数。1/11/20235例:类person包括4个数据成员,用来记录人员信息。生成对象obj,并使用构造函数为obj赋予初始值。#include#include class Person /定义类 private:/类Person的数据成员 char name 10;/姓名 int age;/年龄 int salary;/薪金 char tel8;/电话public:/构造函数Person Person(char*xname,int xage,int xsalary,char *xtel);void disp();/函数Person的定义Person:Person(char*xname,int xage,int xsalary,char*xtel)strcpy(name,xname);/给各数据成员提供初值 age=xage;salary=xsalary;strcpy(tel,xtel);1/11/20236/函数disp的定义void Person:disp()coutendl;cout 姓名:name endl;cout 年龄:age endl;cout 工资:salary endl;cout 电话:tel endlendl;/主函数void main()/生成对象obj并初始化 Person obj(张立三,25,850,45672314);/显示obj obj.disp();1/11/20237程序的执行结果是:姓名:张立三 年龄:25 工资:850 电话:45672314在主函数中的Person obj(张立三,25,850,45672314);中完成了以下几个功能:1.定义并生成了对象obj。2.在生成对象obj的同时,自动调用相应类的构造函数Person3.将初始值张立三,25,850,45672314传递给构造函数Person相应的形参xname,xage,xsalary,xtel。4.执行构造函数体,将相应的值赋给相应的数据成员。1/11/20238一次性对象 创建对象时如果不给出对象名,直接以类名调用构造函数,则产生一个无名对象。无名对象经常在参数传递时使用。例如:coutDate(2003,12,23);Date(2003,12,23)是一个对象,该对象在做了操作后便烟消云散了,所以这种对象一般用在创建后不需要反复使用的场合。1/11/202392.构造函数重载构造函数重载 构造函数毕竟是函数,是函数就可以重载。不但可以重载,还可以设置默认参数。如果一个类中出现了两个以上的同名的成员函数时,称为类的成员函数的重载。class Datepublic:Date(const string&s);/重载 Date(int y=2003,int m=12,int d=1);/参数默认 /.;int main()Date d(“2006-12-26”);Date e(2000,12,25);Date f(2001,10);Date g(2002);Date h;/.1/11/202310 Date h;这行代码似乎是一个错误,对于对象的创建,即对于无参的构造函数的调用,应该是g(),加上类名,即写成:Date g();但是,从语法上来讲,这个语句也是名叫g的返回临时Date对象的函数声明!因此,C+语言在设计时,为了区别无初始化的对象定义和返回类对象的无参函数声明的差别,也为了保持无初始化变量定义与无初始化(无参)对象定义的一致性,规定无参对象定义语句为:int a;/变量定义int b;/返回整型值的无参函数声明Date g;/无参对象定义,加空括号后就成了无参函数声明Date g();/返回类对象的无参函数声明1/11/202311 对于返回对象值的有参函数声明和有初始化的对象定义语句,由于函数声明中的参数有类型引导,而对象定义的初始化中无类型引导,它们本身(或在编译器看来)是可以区分的:Date e(2002);/对象定义Date e(int y);/函数声明1/11/202312 C+规定,每个类必须有一个构造函数。如果在类中没有显式定义构造函数时,则C+编译系统在编译时为该类提供一个默认的构造函数,该默认构造函数是个无参函数,它仅负责创建对象,而不做任何初始化工作。class Datepublic:/相当于定义了Date();int main()Date d;/ok /.与变量定义相似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的默认值为0,否则对象的初始值是不定的。1/11/202313只要一个类定义了一个构造函数(不一定是无参构造函数),C+编译系统就不再提供默认的构造函数。任何其他的构造函数定义,都将阻止默认无参空函数的产生:class Datepublic:Date(int y,int m,int d)/.;int main()Date d;/error /.1/11/202314 当构造函数有缺省参数时,称为具有缺省参数的构造函数,在使用时要防止二义性。如:class Myclass /定义类Myclass private:int member;public:Myclass();Myclass(int i);Myclass:Myclass()/构造函数Myclass member=10;1/11/202315Myclass:Myclass(int i=10)/构造函数Myclass(int i),该函数 /的形参i为缺省参数 member=i;void main()Myclass x(20);Myclass y;/产生二义性,无法确定自动调用哪个构造 /函数完成对象的构造 1/11/202316回顾:上节课主要讲了构造函数的概念、意义及定义方式、构造函数的重载。1/11/2023173.类成员初始化类成员初始化默认调用的无参构造函数 在类定义中有数据成员和成员函数,数据成员可以是内部数据类型的变量实体,也可以是对象实体。如果一个类A的对象作为另一个类B的数据成员,则在类B的对象创建过程中,调用其构造函数的过程中,数据成员(类A的对象)会自动调用类A的构造函数。这样就会面临一些问题。例:有一个学号类和一个学生类,学生类中包含了学号类的对象,因此在构造学生类对象时,面临着学号类对象的构造。1/11/202318class StudentID int value;public:StudentID()static int nextStudentID=0;value=+nextStudentID;coutAssigning student id valuen;/-class Student string name;StudentID id;public:Student(string n=noName)cout Constructing student +n+n;name=n;/-int main()Student s(Randy);/=在学生类的构造函数中并没有看到学号类对象初始化的痕迹,而数据成员name倒被赋了初值。从运行的结果看,当学生类对象被构造时,一个学号对象也创建了,而且学号类的构造函数先于学生类对象的构造函数体的执行而执行。1/11/202319对于对于Student s(“Randy”);其内部的其内部的 执行顺序是这样的:执行顺序是这样的:(1)先分配学生类对象先分配学生类对象s的空间,调用的空间,调用Student构造函数;构造函数;(2)在在Student构造函数体尚未执行时,由于看到了类的对象构造函数体尚未执行时,由于看到了类的对象成员成员ID,转而去调用学号类的无参构造函数;相当于执行定转而去调用学号类的无参构造函数;相当于执行定义语句:义语句:StudentID id;(3)执行了学号类构造函数体,输出结果的第执行了学号类构造函数体,输出结果的第1行信息,返回行信息,返回到到Student构造函数;构造函数;(4)执行执行Student构造函数体,输出结果的第构造函数体,输出结果的第2行信息,完成行信息,完成全部构造工作。全部构造工作。说明:先成员构造,后自身构造成员构造不见显式调用,而是悄悄调用无参构造函数对学号类构造函数的调用时默认的,默认调用便是调用无参构造函数,而正好学号类设计的构造函数就是无参构造函数。1/11/202320初始化的困惑 在刚刚的实例中,只是初始化了名称,而没有给定学号。如果,在学生对象创建中,既要初始化名称,又要给定一个指定的初始化学号,也就是不要默认调用无参构造函数,那么类该如何操作呢?如果不能在创建StudentID的过程中初始化对象,就不能将对象值设置到位。下面给出一个不正确的初始化尝试,还是对刚才的例子作修改:1/11/202321class StudentID int value;public:StudentID(int id=0)value=id;coutAssigning student id valuen;/-class Student string name;StudentID id;public:Student(string n=noName,int ssID=0)cout Constructing student +n+n;name=n;StudentID id(ssID);/-int main()Student s(Randy,58);/=运行结果:1/11/202322 S对象初始化的学号为58,重新设计了Student构造函数,将该值传递给了它,所以形参ssID的值也为58。但是我们看到转而调用的StudentID构造函数执行体却没有输出58,而是默认的0学号。这说明转而调用的仍然是无参构造函数。将StudentID的构造函数写成参数默认是为了让无参构造函数调用也能通过,以便让整个程序顺利运行。乃至后来,要想在Student类内,通过构造函数体中的对象初始化创建的定义语句来改变id的值,发现这仅仅只是区别于s对象中的id对象的一个局部对象,等到构造函数结束时,该局部对象的局部生命期到期而不销毁。1/11/202323 如果一个类A的对象作为另一个类B的数据成员,则在类B的对象创建过程中,调用其构造函数的过程中,数据成员(类A的对象)会自动调用类A的构造函数。如果类A的构造函数为有参函数时,则在程序中必须在类B的构造函数的括号后面加一“:”和被调用的类A的构造函数,且调用类A的构造函数时的实参值必须来自类B的形参表中的形参。这种方法称为初始化表的方式调用构造函数。这种在构造函数的参数列表的右括号后面,花括号前面,用冒号引出构造函数的调用表,可以省略类型名称,但却行创建对象之职。初始化表调用构造函数1/11/202324 类X的构造函数的定义格式应为:X:X(参数表0):成员1(参数表1),成员2(参数表2),成员n(参数表n)其中,参数表1提供初始化成员1所需的参数,参数表2提供初始化成员2所需的参数,依此类推。并且这几个参数表的中的参数均来自参数表0,另外,初始化X的非对象成员所需的参数,也由参数表0提供。在构造新类的对象过程中,系统首先调用其子对象的构造函数,初始化子对象;然后才执行类X自己的构造函数,初始化类中的非对象成员。对于同一类中的不同子对象,系统按照它们在类中的说明顺序调用相应的构造函数进行初始化,而不是按照初始化表的顺序。1/11/202325例:#includeusing namespace std;/-class StudentID int value;public:StudentID(int id=0)/有参构造函数 value=id;cout Assigning student id value endl;/-对刚才的例子进行改进1/11/202326class Student string name;StudentID id;public:Student(string n=no name,int ssID=0):id(ssID),name(n)coutConstructing student nn;/-int main()Student s(Randy,98);Student t(Jenny);/=1/11/2023274.构造顺序构造顺序 在程序中,各种作用域的对象很多,有些对象还包含在别的对象里面,有些对象早在main函数开始运行之前就已经建立了。创建对象的惟一途径是调用构造函数。构造函数时一段程序,所以构造对象的先后顺序不同,直接影响程序执行的先后顺序,导致不同的运行结果。C+给构造对象的顺序做了专门的规定。局部对象 局部和静态对象是指块作用域(局部作用域)和文件作用域的对象。它们的声明顺序与它们在程序中出现的顺序是一致的。见课本307页 例9.81/11/202328 在C中,所有的局部变量(没有对象)都是在函数开始执行时统一创建的,创建的顺序是根据变量在程序中按语句行出现的顺序。而C+却不同,它是根据运行中定义对象的顺序来决定对象创建的顺序。而且,静态对象只创建一次。全局对象 和全局变量一样,所有全局对象在主函数启动之前,全部已近被构造。因为构造过程是程序语句的执行过程,所以,可以想象在程序启动之前,已经有程序语句(构造函数)在那里被执行过了。1/11/202329同一工程不同代码文件全局对象的创建没有明确顺序规定对策:不要让不同文件的全局对象互为依赖因为依赖具有先后性,而其全局对象的创建不能保证该依赖性发挥作用全局对象在main函数启动之前生成,而调试则在main函数启动之后对策:调试时,应先将全局对象作为局部对象来运行观察或者,在构造函数中添加输出语句来观察运行过程1/11/202330成员对象的构造顺序按类定义的出现顺序成员对象class Apublic:A(int x)coutA:x;/-class Bpublic:B(int x)coutB:x;/-class C A a;B b;public:C(int x,int y):b(x),a(y)coutCn;/-int main()C c(15,9);/=class C按A、B的顺序定义对象成员,其构造函数又按b、a的顺序进行构造。到底听谁的,以定义顺序说了算。1/11/202331构造位置全局数据区:全局对象,静态全局对象,静态局部对象,常对象类的静态数据成员也存放在该数据区。目的是为了让对象的生命周期与运行的程序等寿命。栈区:局部对象在函数中定义好、局部对象,随着被调用的返回而析构(销毁)。动态存储区(也称堆区):用new申请的对象用delete销毁。特殊地址空间除此之外,还可以指定特殊地址空间,存放对象1/11/202332回顾1/11/2023335.拷贝构造函数拷贝构造函数对象本体与对象实体:对象本体也是对象主体,对象实体则还包括属于对象的衍生物,如,某个人体是人类对象的主体,然而某人还拥有父母,房产等属于某人的世系或资产,描述人的属性不仅仅只是人体数据 从形式上看,对象除了包括数据成员,还包括指向数据的指针 对象本体与对象实体是不一致就是说有时我们会需要把a对象的属性全部转给b对象,对象本体与对象实体一致就是你要将a对象的属性赋给a对象本身。1/11/202334对于一个简单的变量的初始化方法是用一个常量或变量初始化另一个变量,例如:double x=12.36;double y=x;疑问:前面介绍了用构造函数初始化对象,那么能不能像简单变量的初始化一样,直接用一个对象来初始化另一个对象呢?答案是肯定的。例:以定义的一个Point类为例,说明用一个对象来初始化另一个对象。Point pt1(10,20);Point pt2=pt1;那么,后一句也可写成 Point pt2(pt1);它是用pt1初始化pt2,此时,pt2各个成员的值与pt1各个成员的值相同,也就是说,pt1各个成员的值被复制到pt2相应的成员当中。在这个初始化过程当中,实际上调用了一个拷贝构造函数。1/11/202335拷贝构造函数:拷贝构造函数是C+中引入的一种新的构造函数。定义一个拷贝构造函数的方式是:类名(const 类名&形式参数)函数体 由此可看出拷贝构造函数的特点:(1)拷贝构造函数的名称与类的名称相同,且它只有一个参数,该参数就是对该类对象的引用。(2)拷贝构造函数的功能是用于实现对象值的拷贝,通过将一个同类对象的值拷贝给一个新对象,来完成对新对象的初始化,即用一个对象去构造另外一个对象。(3)每个类都有一个拷贝构造函数1/11/202336以本类对象为常量引用参数的构造函数:class Datepublic:Date();Date(const Date&d);/.;Date x;/调用无参构造函数Date y(x);/调用拷贝构造函数例:1/11/202337默认拷贝构造函数:若类中没有定义拷贝构造函数,则系统会悄悄定义一个默认空拷贝构造函数:Date(const Date&d)默认拷贝构造函数体一定是空的空拷贝构造函数负责将传递的对象到新创的对象做对象本体的位对位拷贝(甚至连指针值都相等,即与参数对象拥有共同的资源)1/11/202338自定义拷贝构造函数:为了达到对象实体也就是对象整体复制目的,就需要另外定义一个拷贝构造函数,以覆盖默认的拷贝构造函数:见课本例315页 9.13 自定义拷贝构造名也是类名,它是构造函数的重载,一旦自定义了拷贝构造函数,默认的拷贝构造函数就不再起作用了。在自定义拷贝构造函数之前,我们进行拷贝对象构造时,都是在用默认的拷贝构造函数,因为那时的对象本体与对象实体是一致的。所以,自定义拷贝构造函数在对象本体与对象实体不一致时,便是需要的,否则无此需要。1/11/202339自定义拷贝构造函数体的工作不负责位对位对象复制,一般来说,它负责资源分配和由此而来的指针修改class Person char*pName;public:Person(char*pN=noName)pName=new charstrlen(pN)+1;if(pName)strcpy(pName,pN);Person(const Person&s)pName=new charstrlen(s.pName)+1;if(pName)strcpy(pName,s.pName);Person()delete pName;1/11/2023406.析构函数析构函数 当一个对象被定义时,系统自动调用构造函数为该对象分配相应的资源,当对象使用完毕后,这些系统资源需要在对象消失前被释放。人为的动态内存释放工作由析构函数来完成,析构函数时一种特殊的成员函数,它的意义是做关于对象失效之前瞬间的善后工作。它的功能与构造函数的工作正好相反,是用来释放一个对象。我们知道有内存申请,也就有内存释放。一般来说,需要定义构造函数的类也需要定义析构函数,不需要构造函数的类,也无须定义析构函数。所以析构函数和构造函数是成对出现的。1/11/202341析构函数的定义方式为:类名()函数体 定义:特点:(1)析构函数名与构造函数名相同,但它前面必须加一个“”,用以与析构函数相区别;(2)在定义析构函数时,不能指定任何返回类型,也没有参数,而且不能重载。因此在一个类中只能有一个析构函数。(3)析构函数可以被用户调用,也可以被系统调用。在下面两种情况下,析构函数会被自动调用1/11/202342a、如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。b、当一个对象是使用new运算符动态创建时的,在使用delete运算符自动释放时,delete将会自动调用析构函数。每一个类若没有显示地定义为一个类定义析构函数,编译系统会自动地生成一个默认的析构函数,默认析构函数时一个空函数,实际上什么操作都不进行。例:程序中三个类A、B、C分别有一个析构函数。代码如下:1/11/202343class Apublic:A()cout;A()cout-A;/-class Bpublic:B()cout;B()cout-B;/-class Cpublic:C()cout;C()cout-C;/-void func()coutnfunc:;A a;cout;static B b;C c;/-int main()coutmain:;for(int i=1;i=2;+i)for(int j=1;j=2;+j)if(i=2)C c;else A a;B b;func();func();/=1/11/202344注:(1)析构函数总是出现在对象的生命期结束之时。静态对象在程序运行结束时析构。(2)对于一个简单的类来说,大多可以直接使用系统提供的默认析构函数。但是,如果在类的对象中分配有动态内存(如:用new申请分配的内容)时,就必须为该类提供适当的析构函数,完成清理工作。(3)对象被析构的顺序与对象建立时的顺序正好相反。对象析构与构造函数的关系是栈数据结构中的入栈和出栈的关系,即最后构造的对象先被析构。栈底封闭指针1/11/2023457.对象转型与赋值对象转型与赋值用于转型的构造函数 5/8与5.0/8的结果是不同的,原因是C+执行了两种不同的操作。编译器会将5.0/8中的整数8自动转换成double,匹配两个double数的除法操作。这是内部数据类型所具有的转换功能。但是,对于类类型,其自动转换的功能必须编程实现。那就是定义一个含有一个参数的构造函数。例:class Student public:Student(const string&n);void fn(Student&s);int main()string t=“jenny”;fn(t);/参数为string,却能匹配Student类型 1/11/202346 刚才的例子也是在告知,如何将string对象转换成一个Student对象。如果有重载函数:void fn(string&s)cout“okn”;则main函数中的fn(t)函数调用将会马上匹配。否则,匹配了void fn(Student&s)函数。从 fn(Student&)和Student(const string)可以推得fn(string)调用,这就是构造函数用来从一种类型转换成另一种类型的能力。对象转型的规则:只会尝试含有一个参数的构造函数只会尝试含有一个参数的构造函数如果有二义性,则会放弃尝试如果有二义性,则会放弃尝试推导是一次性的,不允许多步推导推导是一次性的,不允许多步推导1/11/202347对象拷贝对象赋值即对象拷贝:两个已经存在的对象之间的复制Person d(“Ranny”)Person g;d=g;/对象赋值对象赋值便是使用类中的赋值操作符如果类中没有定义赋值操作符,则系统悄悄地定义一个默认的赋值操作符:Person&operator=(const Person&p)memcpy(*this,*p,sizeof(p);1/11/202348当对象本体与对象实体不同时,则对象赋值操作符与拷贝构造函数一样,必须自定义:class Person char*pName;public:Person(char*pN=noName);Person(const Person&s);Person&operator=(const Person&s)if(this=&s)return s;delete pName;pName=new charstrlen(s.pName)+1;if(pName)strcpy(pName,s.pName);return*this;Person()delete pName;定义赋值操作符:排除客体对象与本对象同一的情况释放本对象的资源申请客体对象相同大小的资源空间拷贝客体对象的资源到本对象1/11/2023498.this指针指针 用类定义对象时,系统会为每一个对象分配存储空间。如果一个类包括数据和函数,要分别为数据和函数的代码分配存储空间。每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。例如:Class Point int xVal,yVal;public:point(int x,int y);point(point&pt);void showpoint()cout“(“xVal,yVal“)”;Point a,b,c;1/11/202350对象aint xValInt yVal对象bint xValInt yVal对象cint xValInt yVal成员函数:Point(int x,int y);Point(Point&pt);void ShowPoint();对象存储示意图 对象a、b、c在内存中各占8个字节存储数据成员,而只用一段空间来存放这个共同的函数代码段。疑问:当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?1/11/202351 实际上在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this。它是指向本类对象的指针,它隐含在类的成员函数中,用来指向成员函数所述类的正在被操作的对象。例如,当调用成员函数a.ShowPoint()时,编译系统就把对象a的起始地址付给this指针,于是在成员函数引用数据成员时,就按照this的指向找到对象a的数据成员,由于当前this指向a,因此相当于执行cout“(“a.xVal“,”b.xVal“)”;归纳:(1)This指针也是一个指向对象的指针。(2)This指针是C+语言实现封装的一种机制,它将数据成员和成员函数连接在一起,当一个成员函数对数据成员进行操作时,用this指针来表示数据成员所在的对象。(3)当程序操作不同对象的成员函数时,this指针也指向不同的对象(4)静态成员函数没有this指针。1/11/202352

    注意事项

    本文(C++程序设计教程课件.ppt)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开