C++中基类,派生类 类成员对象的构造函数,析构函数的顺序
2008-11-13 09:02
791 查看
昨天笔试遇见了这个选择题,竟然被难住了,看来自己的基本功还不够扎实.回来编程开始实现摸索.
#include <iostream>
using namespace std;
class BaseClass
{
public:
BaseClass()
{
cout<<"Base Class is constructed"<<endl;
}
~BaseClass()
{
cout<<"Base Class is destructed"<<endl;
}
};
class InObject
{
public:
InObject()
{
cout<<"object data number is constructed."<<endl;
}
~InObject()
{
cout<<"object data number is destructed."<<endl;
}
};
class DerivedClass:public BaseClass
{
public:
InObject m_Derived;
DerivedClass()
{
cout<<"Derived Class is constructed"<<endl;
}
~DerivedClass()
{
cout<<"Derived Class is destructed"<<endl;
}
};
int main()
{
DerivedClass d;
return 0;
}
运行结果:
Base Class is constructed
object data number is constructed
Derived Class is constructed
Derived Class is destructed
object data number is destructed.
Base Class is destructed.
答案已经很明显了.这是无参数的,可假如有参数呢?
#include <iostream>
using namespace std;
class BaseClass
{
public:
BaseClass(int a)
{
cout<<"Base Class with parameter is constructed"<<endl;
m_base=a;
}
BaseClass()
{
cout<<"Base Class is constructed"<<endl;
}
~BaseClass()
{
cout<<"Base Class is destructed"<<endl;
}
protected:
int m_base;
};
class InObject
{
public:
float m_inobject;
InObject(float f)
{
cout<<"object data number with parameter is constructed."<<endl;
m_inobject=f;
}
InObject()
{
cout<<"object data number is constructed."<<endl;
}
~InObject()
{
cout<<"object data number is destructed."<<endl;
}
};
class DerivedClass:public BaseClass
{
public:
char m_Derived;
InObject m_DerivedObject;
DerivedClass(int nvalue,float fvalue,char cvalue):
BaseClass(nvalue),m_DerivedObject(fvalue),m_Derived(cvalue)
{
cout<<"Derived Class with parameter is constructed"<<endl;
}
DerivedClass()
{
cout<<"Derived Class is constructed"<<endl;
}
~DerivedClass()
{
cout<<"Derived Class is destructed"<<endl;
}
};
int main()
{
//DerivedClass d;
DerivedClass d(3,8.0,'A');
return 0;
}
答案为:
Base Class with parameter is constructed
object data number with parameter is constructed
Derived Class with parameter is constructed
Derived Class with parameter is destructed
object data number with parameter is destructed.
Base Class with parameter is destructed.
或许有人说,是派生类的初始化列表的顺序问题,好,我任意改变了顺序,结果不变.
如果我不用初始化列表,而在括号里直接赋值有什么结果呢?
DerivedClass(int nvalue,float fvalue,char cvalue):
BaseClass(nvalue)
{
cout<<"Derived Class with parameter is constructed"<<endl;
m_Derived=cvalue;
m_DerivedObject=fvalue;
}
注意这次结果:
Base Class with parameter is constructed
object data number is constructed.//在进入括号之前调用.
Derived Class with parameter is constructed
object data number with parameter is constructed.//在 m_DerivedObject=fvalue被调用.
object data number is destructed.//在m_DerivedObject =fvalue 语句执行完被调用.
//即使我在m_DerivedObject ;加入 int abc; abc=3;abc=5;语句.调用处不变.
Derived Class with parameter is destructed
object data number with parameter is destructed.
Base Class with parameter is destructed.
可见要多一次无参数的构造函数调用.在类成员对象中,用初始化列表能提高程序效率.
#include <iostream>
using namespace std;
class BaseClass
{
public:
BaseClass()
{
cout<<"Base Class is constructed"<<endl;
}
~BaseClass()
{
cout<<"Base Class is destructed"<<endl;
}
};
class InObject
{
public:
InObject()
{
cout<<"object data number is constructed."<<endl;
}
~InObject()
{
cout<<"object data number is destructed."<<endl;
}
};
class DerivedClass:public BaseClass
{
public:
InObject m_Derived;
DerivedClass()
{
cout<<"Derived Class is constructed"<<endl;
}
~DerivedClass()
{
cout<<"Derived Class is destructed"<<endl;
}
};
int main()
{
DerivedClass d;
return 0;
}
运行结果:
Base Class is constructed
object data number is constructed
Derived Class is constructed
Derived Class is destructed
object data number is destructed.
Base Class is destructed.
答案已经很明显了.这是无参数的,可假如有参数呢?
#include <iostream>
using namespace std;
class BaseClass
{
public:
BaseClass(int a)
{
cout<<"Base Class with parameter is constructed"<<endl;
m_base=a;
}
BaseClass()
{
cout<<"Base Class is constructed"<<endl;
}
~BaseClass()
{
cout<<"Base Class is destructed"<<endl;
}
protected:
int m_base;
};
class InObject
{
public:
float m_inobject;
InObject(float f)
{
cout<<"object data number with parameter is constructed."<<endl;
m_inobject=f;
}
InObject()
{
cout<<"object data number is constructed."<<endl;
}
~InObject()
{
cout<<"object data number is destructed."<<endl;
}
};
class DerivedClass:public BaseClass
{
public:
char m_Derived;
InObject m_DerivedObject;
DerivedClass(int nvalue,float fvalue,char cvalue):
BaseClass(nvalue),m_DerivedObject(fvalue),m_Derived(cvalue)
{
cout<<"Derived Class with parameter is constructed"<<endl;
}
DerivedClass()
{
cout<<"Derived Class is constructed"<<endl;
}
~DerivedClass()
{
cout<<"Derived Class is destructed"<<endl;
}
};
int main()
{
//DerivedClass d;
DerivedClass d(3,8.0,'A');
return 0;
}
答案为:
Base Class with parameter is constructed
object data number with parameter is constructed
Derived Class with parameter is constructed
Derived Class with parameter is destructed
object data number with parameter is destructed.
Base Class with parameter is destructed.
或许有人说,是派生类的初始化列表的顺序问题,好,我任意改变了顺序,结果不变.
如果我不用初始化列表,而在括号里直接赋值有什么结果呢?
DerivedClass(int nvalue,float fvalue,char cvalue):
BaseClass(nvalue)
{
cout<<"Derived Class with parameter is constructed"<<endl;
m_Derived=cvalue;
m_DerivedObject=fvalue;
}
注意这次结果:
Base Class with parameter is constructed
object data number is constructed.//在进入括号之前调用.
Derived Class with parameter is constructed
object data number with parameter is constructed.//在 m_DerivedObject=fvalue被调用.
object data number is destructed.//在m_DerivedObject =fvalue 语句执行完被调用.
//即使我在m_DerivedObject ;加入 int abc; abc=3;abc=5;语句.调用处不变.
Derived Class with parameter is destructed
object data number with parameter is destructed.
Base Class with parameter is destructed.
可见要多一次无参数的构造函数调用.在类成员对象中,用初始化列表能提高程序效率.
相关文章推荐
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序
- 【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序
- c++中,类 和 类中成员(对象)的构造函数和析构函数的执行顺序
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
- C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- C++中构造函数、析构函数以及类成员初始化顺序详解
- C++基础:派生类的构造函数与析构函数调用顺序
- C++派生类对象访问基类的protected成员
- 构造函数的执行顺序---派生类构造函数 and 父类构造函数 and 成员对象构造函数
- C++中构造函数,成员对象的初始化顺序
- 构造函数和析构函数在基类和派生类之间的调用顺序
- 浅出C++对象模型——理解构造函数、析构函数执行顺序
- 在派生类中使用对象成员时,构造函数和析构函数的作用过程。
- 【C++】基类和派生类构造函数的调用顺序
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
- C++之派生类的构造函数和析构函数调用顺序
- 基类派生类构造析构函数调用顺序、成员初始化和销毁顺序
- C++基础(九)继承与派生——派生类成员的构造函数和析构函数
- 总结笔记-c++成员变量、构造函数以及析构函数的执行顺序