您好,欢迎访问三七文档
classStudent{public:voidp(void);floatscore;protected:char*name;intage;};Studenta;Studenta={5.5,“abcds”,6};a.age=6;(相当于)//非public;复杂第五章:构造、析构函数classStudent{public:voidp(void);floatscore=5.5;protected:char*name=abcds;intage=6;};classStudent{public:voidbegin();构造函数的最初设想floatscore;protected:char*name;intage;};voidstudent::begin(){age=25;socre=80.5;name=zhang;}Studenta;a.begin();构造、析构函数classStudent{public:Student();//构造函数的实现;系统约定与类同名;自动调用intp();protected:char*name;intage;};Student::Student()//没有返回类型;特殊的成员函数{age=5;name=zhang;//可以有参数,可以重载}Intstudent::p(){return(age);}Studenta;couta.p();构造、析构函数classStudent{public:Student();//构造函数的声明,没有返回值,可以重载~Student();//析构函数的声明;没有参数;,没有返回值,不可以重载protected://对象生命期结束时由系统自动调用char*name;intage;};Student::Student(){age=5;}Student::~Student(){cout“对象结束了;}intmain(){Studenta;Studentb;return0;}//析构函数的调用顺序和对象构造的顺序相反析构函数不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。还可以用来执行用户希望在对象生命期结束时所执行的任何操作。classStudent{public:voidStudent();//错误void~Student();//错误protected:char*name;intage;};voidStudent::Student()//错误{age=5;}voidStudent::~Student()//错误{cout“对象结束了”;}Studenta;构造、析构函数classStudent{public:Student();~Student();protected:char*name;intage;};Student::Student(){age=5;}Student::~Student(){cout“对象结束了”;}Studenta;a.Student();//错误a.~Student();//不提倡C++标准程序库中的string类stringname;自动处理空间的占用问题。可以用=进行赋值操作,==进行比较,+做串联.使用时#includestring//注意这里不是string.hstringstr1,str2=“abcd”;str1=str2;str2=str1+”123”;coutstr2str2.length()str2.insert(0,8);由C++字符串得到对应的C_string的方法是使用data()、c_str()data()以字符数组的形式返回字符串内容,但并不添加’\0’。chars[20];strcpy(s,str1.data());c_str()返回一个以‘\0’结尾的字符数组,strcpy(s,str2.c_str());//带参数的构造函数#includeiostream#includestringusingnamespacestd;classStudent{public:Student(stringpName,inti,floatj){cout构造学生pNameendl;name=pName;semesHours=i;gpa=j;}~Student(){cout析构nameendl;}//其它公共成员private:stringname;intsemesHours;floatgpa;};voidf(){Studentt(Tom,17,90);}intmain(){Studentss(Jenny,20,80.5);f();return0;}classA{public:ints;};Aa1;对于没有显性构造函数的类系统都自动提供一个默认构造函数A(){}用户没有定义析构函数,编译器自动生成一个析构函数。~A(){}构造、析构函数//构造函数重载classStudent{public:Student(stringpName){cout姓名pNameendl;name=pName;}Student(stringpName,inti){cout“姓名学时endl;name=pName;semesHours=i;}private:stringname;intsemesHours;};intmain(){Studenttt(Tom,60);Studentss(Jenny);Studentf;//错误?return0;}如果手工定义了任何的构造函数,系统不再提供默认的无参构造函数。//构造函数重载classStudent{public:Student(stringpName){cout姓名pNameendl;name=pName;}Student(stringpName,inti){cout“姓名学时endl;name=pName;semesHours=i;}Student(){}protected:stringname;intsemesHours;};voidmain(){Studenttt(Tom,60);Studentss(Jenny);Studentf;}//不错误构造、析构函数自定义无参构造函数将替代缺省构造函数的存在//默认值构造函数改写重载构造函数classStudent{public:Student(stringpName=“”,inti=0){cout“姓名学时endl;name=pName;semesHours=i;}protected:stringname;intsemesHours;};intmain(){Studenttt(Tom,60);Studentss(Jenny);Studentf;//不错误return0;}构造、析构函数Studentf();Studentg(int);声明函数无名对象(一次性对象):Student(Jane);一般作为实参,用在创建后不需要反复使用的场合。构造函数是特殊的类成员函数。C++规定与类同名的成员函数是构造函数,在该类的对象创建时,自动被调用。构造函数负责对象的初始化可拥有多个参数。可以重载。构造函数不返回具体的值,不指定函数的返回类型。可内置定义,也可以在类外定义。通常是Public的析构函数也是一个特殊的成员函数;作用与构造函数相反;在对象的生命期结束时自动被调用。名字是类名前加一个~;不返回任何值;没有函数类型,没有函数参数,因此不能被重载。一个类可以由多个构造函数,只能有一个析构函数。可内置定义,也可以在类外定义。用于清理和释放资源的工作。通常是Public的classA{public:ints;private:A(){coutAisconstructing\n;};~A(){cout~A\n;}};intmain(){As;//出错return0;}//构造函数&析构函数的属性影响构造、析构函数(s)判断对错,错误写出原因:1、使用struct定义的类中默认的访问权限是private的2、this不能被非成员函数访问3、任何情况下private权限的内容不能被类外访问4、引用破坏了函数的封装性5、内联函数的作用是提高系统的效率6、不同类的成员函数也可以重载7、参数类型、函数返回类型可以作为函数重载的依据组合:是指结构和类的声明嵌入结构变量和对象作为其成员的现象。嵌入的对象成员称为成员对象(类成员)。包容这个成员对象的类称为组合类或包容类。//组合类对象的创建classStudent{public:Student(){coutconstructingstudent.\n;semesHours=100;gpa=3.5;}~Student(){cout“~Student\n”;}protected:intsemesHours;floatgpa;};classTeacher{public:Teacher(){coutconstructingteacher.\n;}~Teacher(){cout“~Teacher\n”;}private:charname[20];};//构造函数执行顺序classTutorPair{public:TutorPair(){coutconstructingtutorpair.\n;noMeetings=0;}//不可以访问Studnet和Teacher成员~TutorPair(){cout“~TutorPair\n”;}protected:Studentstudent;Teacherteacher;intnoMeetings;};intmain(){TutorPairtp;coutbackinmain.\n;return0;}//类的工作过程中,分工十分明确,每个类只负责初始化它自己的对象。//组合类对象的初始化困惑classStudentID{public:StudentID(intid=0){value=id;}~StudentID(){}protected:intvalue;};classStudent{public:Student(stringpName=noName,intssID=0){name=pName;}private:stringname;StudentIDid};intmain(){Students(Randy,9818);return0;}类成员定义时不允许初始化,因为类仅仅是一个类型,而没有空间分配(ssID);//错误//组合类的构造函数如何工作classStudentID{public:StudentID(intid=0){value=id;}~StudentID(){}protected:intvalue;};classStudent{stringname;StudentIDid;public:Student(stringpName=noName,intssID=0){name=pName;StudentIDid(ssID);//达不到效果}};intmain(){Students(Randy,9818);return0;}只是产生了临时变量//组合类的构造函数如何工作classStudentID{public:StudentID(intid=0){value=id;}~StudentID(){}protected:intvalue;};classStudent{stringname;StudentIDid;public:Student(stringpName=“noName”,intssID=0):id(ssID){name=pName;}};intmain(){Students(Randy,9818);return0;}冒号语法用冒号引出构造函数的调用表(初始化列表)用构造参数列表中说明的参数去调用构造函数//例题(上)(s)classStudent{intsemesHours;floatgpa;public:
本文标题:构造和析构函数.
链接地址:https://www.777doc.com/doc-2288890 .html