c++单继承的构造函数与析构函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c(int x):b(x) { printf("class c\n");} }; int main(int argc, char* argv[]) { c c1(10);
printf("%d %d\n",c1.getdataa(), c1.getdatab());
printf("Hello World!\n"); return 0; }
……
~Point2D() {cout<<"free
2D"<<endl;} };
class Point3D
: public Point2D
{ private:
int z;
public:
Point3D
(int x0,int y0,int z0)
: Point2D(x0,y0)
{z=z0; cout<<"new 3D"<<endl;}
派生类构造函数
范例
class A {
int a; public: A(int x) {a=x;cout<<"A Cons\n";} }; class base { int x,y; public: base(int a,int b) {x=a;y=b;cout<<"base Cons\n";} void print() {cout<<"base "<<x<<","<<y<<endl;} };
protected: char *name; int age; char sex;
public: university(char *name0, int age0, char sex0) { name = new char[strlen(name0)+1]; strcpy(name, name0); age=age0; sex=sex0; }
~A() {cout<<"A's destructor called."<<endl; }
void Print() const{cout<<a<<",";}
int Geta( )const { return a; }
private:
int a;
};
14
2021/2/23
class B:public A {
a(int x):d1(x) { printf("class a\n");}
class data(a的d1
int getdataa(){return d1.getx();}
的data执行了)
};
class b:public a
{ data d2;
注意构造函
public:
数执行顺序
b(int x):a(x),d2(x) { printf("class b\n");}
B's default constructor called.
A's default constructor called.
A's default constructor called.
B's default constructor called.
2021/2/23
A's constructor called. A's constructor called. B's constructor called. B's deconstructor called. A's deconstructor called. A's deconstructor called. A's constructor called. A's constructor called. B's constructor called. B's deconstructor called. A's deconstructor called. A's deconstructor called.
class a class data class b class c
int getdatab(){return d2.getx();} };
10 10 Hello world!
派生类的析构函数
派生类的析构函数的构造规则
当派生类中包含使用new和delete运算符的指针成员时, 派生类必须显示定义析构函数
~university( ) { if (name) delete name;}
void print( ) {
cout << “\n\n姓名: ” <<name<<“\n年龄: " << age << “\n性别: "<< sex;
} }; class student: public university { protected :
class data { int x;
派生类构造函数 public:
data(int x)
范例2 { data::x=x;
printf("class data\n"); } int getx(){return x;} }; class a { data d1; public:
class c:public b { public:
cout << “\n平均分数: ” << average<< “\n年级: " << level; }
{ ......
}Leabharlann Baidu
class Point2D
{
private:
int x, y;
public :
Point2D(int x0, int y0)
{x=x0; y=y0; cout<<"new
2D"<<endl;}
Point2D(void)
{x=0; y=0; cout<<"new
2D"<<endl;}
在派生类析构函数执行后,系统会自动调用基类析构 函数;即使派生类没有显式定义析构函数,系统也会 调用基类析构函数,因此在派生类中是否定义析构函数 与基类无关,他们各自独立。
若基类、成员类、派生类都有析构函数,则执行的顺 序是:先自己(派生类),再客人(成员对象),后祖先 (基类)。
派生类的析构函数
派生类的析构函数 范例(续)
注意析构函 数执行顺序
#include <iostream>
2021/2/23
using namespace std;
class A
{
public:
A() { a=0;cout<<"A's default constructor called.\n"; }
A(int i) { a=i;cout<<"A's constructor called.\n"; }
派生类的构造函数与析构函数
基类往往有构造函数和析构函数,但它们不能被 派生类继承。
当创建一个派生类对象时,如何调用基类的构造 函数,在结束派生类的对象时,如何调用基类的 析构函数?
派生类构造函数
派生类构造函数的定义格式
<构造函数名>(参数表):<基类构造函数>(参数表), <对象成员名1>(参数表),..., <对象成员名n>(参数表)
范例
class A { int a;
public: A(int x) {a=x;cout<<"A Cons\n";} ~A() {cout<<"A Desc\n";} }; class base { int x,y; public: base(int a,int b) {x=a;y=b;cout<<"base Cons\n";} void print() {cout<<"base "<<x<<","<<y<<endl;} ~base() {cout<<"base Desc\n";} };
派生类的析构函数
范例(续) class derive1:base { int x2,y2; A aa; public: derive1(int a,int b,int c,int d,int e); void print() {cout<<"drive1 "<<x2<<","<<y2<<endl;} ~derive1() {cout<<"derive1 Desc\n";} }; derive1::derive1(int a,int b,int c,int d,int e):base(c,d),aa(e) { x2=a;y2=b;cout<<"derive1 Cons\n";} void main() { derive1 d1(1,2,3,4,5); d1.print(); }
public: B() { b=0; cout<<"B's default constructor
called.\n"; } B(int i,int j,int k); ~B() { cout<<"B's destructor
called."<<endl; } void Print()const;
private: int b; A aa;
17
课堂练习:大学人员类
university name age sex print
student average level print
staff dept bonus print
#include<iostream.h> #include<string.h> class university {
};
15
2021/2/23
B::B(int i,int j,int k) :A(i),aa(j) { b=k;
cout<<"B's constructor called.\n"; } void B::Print() const {
A:: Print() ; cout<<b<<", "<<aa.Geta()<<endl; }
16
void main() {
B bb[2]; bb[0]=B(1,2,5); bb[1]=B(3,4,8); for(int i=0; i<2; i++)
bb[i].Print(); }
运行结果:
A's default constructor called.
A's default constructor called.
float average; int level; public: student(char *n, int a, char s, float av, int level0) : university(n, a, s) { average=av;
level=level0; } void print() { university::print();
派生类构造函数
范例(续)
class derive1:base { int x2,y2;
A aa; public: derive1(int a,int b,int c,int d,int e); void print() {cout<<"drive1 "<<x2<<","<<y2<<endl;} }; derive1::derive1(int a,int b,int c,int d,int e):base(c,d),aa(e) { x2=a;y2=b;cout<<"derive1 Cons\n";} void main() { derive1 d1(1,2,3,4,5); d1.print(); }
Point3D(void)
{ z=0; cout<<"new 3D"<<endl;}
……... 如果使用基类的无
~{Pcooiuntt<3参<D"(数f)re构e 3造D"函<<数en,dl;可}
};
以省略不写。
main() {
Point3D *pt; pt=new Point3D(1,2,3); ...... delete pt; } 运行结果: new 2D new 3D free 3D free 2D
1,5,2 3,8,4 B's deconstructor called. A's deconstructor called. A's deconstructor called. B's deconstructor called. A's deconstructor called. A's deconstructor called.
派生类构造函数 范例(续)
注意构造函 数执行顺序
派生类构造函数
派生类构造函数的说明 若基类使用带缺省参数的构造函数或使用无参数的构 造函数,则在定义派生类构造函数时,可略去“<基类构 造函数>(参数表)”。 在下面的两种情况下,必须定义派生类的构造函数: 派生类本身需要构造函数; 创建派生类对象时,当基类含有带参数的构造函数 时,派生类必须定义构造函数,以提供把参数传递 给基类构造函数的途径。 在定义派生类对象时,构造函数的执行顺序是:先长辈 (基类),再客人(对象成员),后自己(派生类本身)。
相关文档
最新文档