派生类的构造函数(精选6篇)
篇1:派生类的构造函数
class parent
{
}
class son:public parent
{
}
上面的代码完成了下面的工作:
派生类对象存储了基类的数据成员(派生类继承了基类的实现)
派生类对象可以使用基类的方法(派生类继承了基类的接口)
派生类需要进行下面的工作:
需要自己的构造函数
可以根据需要添加额外的数据成员和成员函数
派生类构造函数:访问权限
派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。
具体地说就是,派生类构造函数必须使用基类构造函数。
创建派生类对象的时,程序首先是创建基类的对象,在C++使用成员初始化列表句法来完成继承工作.例如:
son::son(int r,const char *p,const char *pp,bool vb):parent(r,p,vb)
{
...}
当然,也可以省略成员初始化列表
son::son(int r,const char *p,const char *pp,bool vb)
{
...}]
如此一来,对象首先被创建,如果不调用基类构造函数,程序将使用默认的基类构造函数,因此上面的构造
方式和下面的构造方式相同:
son::son(int r,const char *p,const char *pp,bool vb):parent()
{
...}
派生类构造函数有一些重要的性质需要注意的:
基类对象首先被创建
派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
派生类构造函数应该初始化派生类新增的数据成员
在进行对象释放的时候,顺序与创建对象时是相反的,即派生类对象首先被释放,之后才是基类对象.
篇2:派生类的构造函数
#include
class A
{int a;
public:
A(){a=0;}// 基类缺省构造函数A(int i){a=i;}// 基类有参构造函数void print(){cout<
};
class B:public A
{int b1,b2;
public:
B()// 隐式调用基类缺省构造函数 {b1=0;b2=0;}
B(int i)// 隐式调用基类缺省构造函数
{b1=i;b2=0;}
B(int i,int j,int k): A(i)// 显示调用基类有参构造函数
{b1=j;b2=k;}
void print()
{A::print();cout< }; void main() {B d1;//输出: 0,0,0 B d2(5);//0,5,0 B d3(4,5,6);//4,5,6 1 构造函数简介 构造函数是类中一种特殊的成员函数,它的作用是用于对象的初始化。与其他自定义的成员函数不同,构造函数不需要用户来调用它,而是在建立对象时自动执行。 构造函数的定义[5]:构造函数的名字必须与类名同名,它不具有任何类型,不返回任何值。 格式如下。 构造函数声明:<类名>(<参数表>); 构造函数定义如下。 例如:定义一个包含构造函数的汽车类Car 如果在类外定义函数体,则: 构造函数的功能是由用户根据对象初始化需要自定义和设计函数体和函数参数。 使用构造函数的注意事项如下:①构造函数名称必须与类名相同;②构造函数没有返回值;③构造函数由系统自动调用,不需用户调用,也不能被用户调用;④在类对象进入其作用域时调用构造函数;⑤其功能是对对象进行初始化,一般由一系列赋值语句构成,但是构造函数中也可以包含其他语句,用于对象初始化时执行的功能;⑥如果用户自己没有定义构造函数,则C++系统会自动生成一个空的构造函数。 根据参数的不同,构造函数可以有不同的形式和使用方法。构造函数的不同形式有无参构造函数、有参构造函数、默认参数的构造函数、拷贝构造函数、转换构造函数等。其中,拷贝构造函数和转换构造函数属于有参构造函数。 2 普通形式的构造函数 普通形式的构造函数主要指带参构造函数(包括默认参数的构造函数)和无参构造函数。构造函数可以带参数,也可以不带参数。当需要从外面把参数传递给对象时,就需要采用带参数的构造函数。系统默认的构造函数是不想带参数,如果想带参数,必须自定义构造函数。 (1)带参数构造函数。前面例子中,写一个带参数的构造函数如下。 Car::Car(string CName)//类外定义构造函数 {m_strCarname=CName;} 带有参数的构造函数定义对象的格式如下: 类名对象名(实参1,实参2,…); 无参数时,对象的格式如下: 类名对象名; 例如:Car c1;//建立对象c1,不带参数;Car c2(“pzy car.”);//建立对象c2,带参数。注意:建立无参数的对象时,不能带括号。Car c1();//错误!,不要括号,否则该语句是函数声明语句。 (2)有默认参数构造函乳构造函数的参数也可以像普通函数一样带默认参数,带默认参数的构造函数中,默认参数值的构造函数的一般形式如下。 类名:构造函数名(类型参数1=默认值,类型参数2=默认值) {涵数体} 例如,前述例子中: Car::Car(string CName=“pzy car.”) {m_strCarname=CName;} 3 拷贝构造函数 拷贝构造函数能够将参数的属性值拷贝给新的对象,完成新对象的初始化。它是使用类对象的引用作为参数的构造函数,也称为复制构造函数。 拷贝构造函数的格式如下: 例如:定义一个带有拷贝构造函数的汽车类Car 下面3种情况会自动调用拷贝构造函数[6]。 (1)用早已存在的对象初始化新对象的时候。例如:Car c2=c1。 (2)将一个对象以值传递的方式传给形参的时候。例如:void findcar(Carc);调用时:findcar(c)。 (3)函数返回一个对象的时候。例如:return Car(c)。 拷贝构造函数中若只完成数据成员本身的赋值,称为“浅拷贝”。将所有数据都进行复制的拷贝构造函数称之为“深拷贝”[7]。 在“浅拷贝”过程中,如果在构造函数中有新申请的存储空间时(比如用new操作符),由于只是完成数据本身的赋值,并没有新申请空间来赋值,所以在析构函数运行时,会出现错误。为了避免这种错误,需要采用“深拷贝”。 4 转换构造函数 转换构造函数只有一个形参,它的作用是将一个其他类型的数据(可以是基本数据类型,也可以是类对象)转换成一个类的对象。 自定义数据类型与基本数据类型之间的转换,除了类型转换运算符重载,还可以定义转换构造函数。所谓转换构造函数就是当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。例如: Complex(double Real){real=Real;imag=0;} 其作用是将参数Real转换成Complex类的对象(Real是double型),该对象的实部是Real,对象的虚部为0。 下面完整的例子说明了转换构造函数的使用。 该例子是将一个标准类型的数据转换成对象,其实参数类型也可以是其他类的对象。比如:可以将一个教师类对象转换为学生类对象,在Student中定义如下的转换构造函数: Student (Teacher&t) {num=tnum;sex=tsex;name=tname;} 注意:对象t中的数据成员(num,name和sex等)都要是公用成员,因为要被类外来访问。 5 派生类的构造函数 在定义派生类时,派生类的构造函数要考虑派生类新增的数据成员初始化,并且还要考虑基类的数据成员初始化。解决的方法是在执行派生类的构造函数时,同时要调用基类的构造函数。 (1)派生类构造函数一般形式如下。 派生类构造函数名(派生类参数表列):基类构造函数名(基类参数表列) {自定义派生类中的初始化语句} (2)如果有多个基类,应该—一把基类列出,比如有2个基类的派生类构造函数形式如下。 派生类构造函数名(派生类参数表列):基类1构造函数(基类1参数表列,基类2构造函数(基类2参数表列) (自定义派生类中的初始化语句} (3)派生类构造函数的执行顺序为首先调用基类的构造函数,然后执行派生类的构造函数体。如果是多个基类,那么调用多个基类构造函数的顺序是按照它们在声明派生类时基类出现的顺序。 6 错误使用构造函数分析 构造函数只能由系统自动调用,不能由用户来调用,否则将出错。下面用一个实例来进行说明[8]。 上述程序中,在QT环境中,输出结果为 在DEV C++环境中,输出结果为 显然,m_a是一个不确定的值,m_b等于2,这是因为m_a没有被赋初值。在调用MyBox ()函数时,实际上是建立了临时的MyBox类对象,MyBox ()中赋值m_a=1也是对对象的赋值,因此在myBox的ma其实并没有被赋值。 这个例子说明了不能显式调用构造函数,也不能给成员变量赋值,否则结果将出现不确定性。 7 结语 本文首先介绍了C++类的构造函数相关概念及其灵活多变的不同形式,并指出不同的应用场合需要建立适合需求的构造函数;然后,介绍了不同形式的构造函数的学习和使用方法,并指出显式调用构造函数所带来的后果。这些内容有助于大家深刻理解类的构造函数,对于刚刚接触C++语言的编程初学者和想进一步提高C++编程能力的人员都有很大的参考价值。 参考文献 [1]肖菁.高校非计算机专业C/C++教学的探索与实践[J].现代计算机:专业版,2011(30):21-22. [2]鲁红英,肖思和,孙淑霞.C/C++语言程序设计课程教学改革与实践[J].计算机教育,2013(7):95-98. [3]王帅,马梦娜.关于C++构造函数的几点探究[J].电脑编程技巧与维护,2013(10):6-7. [4]李欣然,靳雁霞.C++程序设计中构造函数的探讨[J].计算机时代,2011(12):30-32. [5]谭浩强.C++面向对象程序设计[M].北京:清华大学出版社,2006. [6]百度百科.构造函数[EB/OL].http://baike.baidu.com/link?url=uhoOfoj3mULwrmajVpFgRYwfomllKB-1VuObbCHnPikWcMMKFOAUqDCWInTlokI2MH3psipethKHyAxSfu8qllv3bPfFOY4gChQ7CGe3KWo4kG1Va-yWZEEOQ9GHP1-a,2016-10-03. [7]传智播客高教产品研发部.C++程序设计教程[M].北京:人民邮电出版社,2015. 例 已知函数f(x)=x+■+5-m,m∈R. 试讨论关于x的方程f(x)=0的正实数解的个数. 解法一:方程的解即函数f(x)的零点,要讨论f(x)=0的正实数解的个数,我们可以研究f(x)在(0,+∞)上的图象. f′(x)=1-■=■. 当x>0,m≤4时,∵ (x+2)2>4, ∴ f′(x)>0, f(x)在(0,+∞)上单调递增.又f(0)=5-■>0, ∴ f(x)的大致图象如图1所示, 此时 f(x)没有正的零点. 当x>0,m>4时, f′(x)=■,当0 当f(x)min=f(■-2)=2■+3-m=0,即m=9时,f(x)有1个正的零点; 当f(■-2)>0,即4 当f(■-2)<0且f(0)=5-■>0,即9 当f(■-2)<0且f(0)≤0,即m≥10时, f(x)有1个正的零点. 综上所述,当m<9时,方程f(x)=0没有正实数解;当m=9或m≥10时,方程f(x)=0有1个正实数解;当9 评析:用函数的零点来解决方程的解的问题,是解答例题的关键. 解法一直接利用了条件中的现成函数来作图,但这个函数含有参数,所以要进行分类讨论,解答过程不免有些繁冗. 解法二:采用变量分离法,由方程x+■+5-m=0可得m=■,于是,方程的正实数解的个数就是函数y=m和函数g(x)=■ (x>0)的图象交点的个数. g′(x)=■. 当x>1时,g′(x)>0,g(x)单调递增;当0 评析:解法二通过变量分离法,将方程解的问题转化为关于x的新函数g(x)与y=m的交点问题,其好处是g(x)不再含有参数m,无需对m的取值范围进行分类讨论,优化了解答过程. 解法三:对方程x+■+5-m=0去分母整理得:m(x+1)=x2+7x+10 (①),所以方程的正实数解的个数就是直线y=m(x+1)和抛物线g(x)=x2+7x+10在(0,+∞)上的交点个数. 如图4所示,直线y=m(x+1)过定点(-1,0),当直线与抛物线相切于y轴右侧,即直线与抛物线在x∈(0,+∞)上只有一个交点时,通过①式的判别式Δ=(7-m)2-4(10-m)=0可解得m=9. 当直线过(0,10)时,直线y=m(x+1)与抛物线也只有一个交点,解得m=10. 根据直线斜率的变化可知,当m<9时,方程f(x)=0没有正实数解;当m=9或m≥10时,方程f(x)=0有1个正实数解;当9<m<10时,方程f(x)=0有2个正实数解. 评析:在解法三中,方程的变形是有“预谋”的,目的是构造更简单的函数. 第一步去分母是为了去掉分式函数,第二步整理方程得到①式是为了在方程的等号两边构造我们熟悉的一次函数和二次函数,这样两个函数的图象就可不经过求导直接作出,解答过程更加简洁明了. 小结:从以上分析可以看出,题干给出的函数不一定是我们用来作图分析的最佳选择.有效的策略是:首先利用方程和不等式的性质对数式进行变形化简,简化运算过程;其次,方程和不等式问题的本质就是对等式或不等式两边的函数进行比较,所以要有目的地对等式或不等式进行转化,构造恰当的函数,使图形操作更简便可行. 【练一练】 已知关于x的不等式x2+2x-t+1>x-t恒成立,求t的取值范围. 【参考答案】 实验(上机)目的1、巩固类的创建 2、会定义类的成员:字段及方法 3、会调用类的方法实现对象的操作 实验(上机)课时 4学时 实验(上机)环境 Visual Studio 2010 预备知识 1、面向对象方法。 2、类的定义。 实验(上机)内容 1、定义轿车类,添加属性牌号、颜色、重量、出厂日期;输出该车的颜色、重量和出厂日期的方法,重载构造函数,初始化有牌号和出厂日期的车辆。在窗体中创建一个轿车对象,调试程序。 2、创建一个班级类,包含辅导员、班级名称、所属系部、人数属性,其中人数不能超过60人;输出班级的名称和人数的方法;重载构造函数,创建带名称和辅导员的班级及默认人数为50人。在窗体中实例化对象”_0900103班”和“_0900141班”,并输出。 3、创建时间Shijian类,它包含3个整型属性:Hour、Minute、Second,它们用于表示采取统一时间格式(24小时时钟格式)的一个时间。并定义一个不含参数的ToUniversalString方法,该方法采用统一时间格式返回一个字符串,它包括6个数位--2个表示小时,2个表示分钟,2个表示秒。创建Shijian类的2个实例,编译和调试Shijian类。 要求:采用默认和重载的构造函数两种方式进行实例化类。 4、完成学生类的建立(提示:建立三个属性分别是xuehao,name,birthday;添加一个方法输出学生的相关信息,其输出格式为: “姓名:张三 学号:00000000 生日:1989-12-12”。) 要求:采用默认和重载的构造函数两种方式进行实例化类。 实验(上机)步骤 按上课代码演示步骤完成上机内容 考核内容 1、熟练使用开发环境; 2、代码完整无误; 关键词:S0函数类,正实部函数类P,增长定理,偏差定理 一、引理 引理1[3] 若f (z) 是单位圆盘D上的全纯函数, f (0) =1, Ref (z) ≥0, z∈D, 则成立不等式 引理2[3] 设f∈H (D) , 则Ref (z) ≥0, ∀z∈D, 当且仅当存在[0, 2π]上非减函数μ, 满足μ (2π) -μ (0) =Ref (0) , 使得 f (z) =∫ 二、主要结果 定理1 设f (z) ∈S0, 则 (2) 若f (z) =z+ 则|an|≤2, 等号成立当且仅当 证明 (1) 令 则由f (z) ∈S0, 有g (z) ∈H (D) , Reg (z) ≥0, 且g (0) =f′ (0) =1, 因此g (z) ∈P. 从而由引理1, 有 故 (2) 令 从而g (z) =1+ 因此由引理1, 有|an|≤2, 等号成立当且仅当 故等号成立当且仅当 定理2 若f (z) ∈S0, 则 证明 令g (z) 如定理1中证明所定义, 则 g (z) ∈H (D) , Reg (z) ≥0, 其中z∈D. 由引理2知, 存在[0, 2π]上的非减函数μ, 满足μ (2π) -μ (0) =Reg (0) =1, 使得 所以 f (z) =∫ 等式两边关于z求导, 得 f′ (z) =∫ f (z) 关于z求n阶导, 得 f (n) (z) =2n!∫ 由于|1-ze-iθ|>1-|z|, 故当|z|<1时, 有 |f (n) (z) |≤2n!∫ 参考文献 [1]K.Yamaguchi.On functions satisfying Re{f (z) /z}>0.Proc.Amer.Math.Soc. (1966) , 588-591. [2]E.Hille.Analytic function theorey.II, Ginn, Boston, 1962. 【派生类的构造函数】相关文章: 复制构造函数04-26 拷贝构造函数范文05-29 默认拷贝构造函数07-10 默认复制构造函数04-26 拷贝构造函数怎么写08-18 拷贝构造函数的用法04-13 1 简述构造函数特点04-26 构造函数证明不等式08-13 构造函数法证明不等式12-09 我国股东派生诉讼制度完善02-11篇3:C++中类的构造函数探究和使用
篇4:构造恰当的函数
篇5:实验(上机)类的属性和构造函数
篇6:派生类的构造函数