构造函数成员初始化是不是类的成员

扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
关于默认构造函数的问题我对默认构造函数不太理解,我看到书上写着是如果一个类中没有构造函数,系统就给创造一个构造函数,有什么实际意义呢,如果一个类中有数据成员,不通过主函数进行初始化,也就是说通过在构造函数中赋初值对其初始化,这是不是就是默认构造函数,我实在是不懂,还有就是构造函数时进行变量分配空间,如果一个类中数据成员只有一个类对象,并且类中的类对象没有数据成员及不用进行初始化,创建类时也就是通过类中构造函数来进行,但是构造函数并没有类对象,怎么还调用了类对象的构造函数
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
当你new一个对象时,如果没有构造函数,就必须调用默认的构造函数啊.你不写的话,编译器默认创建空构造函数.new了一个对象以后,这个对象就不是null了,如果是空构造函数,那么里面的类成员还是null.这不影响,因为还可以用set方法来初始化它们.我也只能这样说说而已,因为还不太明白你的意思
为您推荐:
扫描下载二维码C++ 类的构造函数详解及实例
转载 & & 投稿:lqh
这篇文章主要介绍了C++ 类的构造函数详解及实例的相关资料,学习C++ 的朋友对构造函数肯定不陌生,非常重要的基础知识,这里就详细介绍下,需要的朋友可以参考下
C++ 类的构造函数
默认构造函数
如果你定义一个类,并且没有给它定义构造函数。编译器会为这个类提供默认的构造函数。如果你提供了构造函数,编译器是不会再为你提供一个默认构造函数的。编译器提供的默认构造函数什么都没做。类的成员变量将遵守默认的初始化规则。
编译器提供的默认构造函数的初始化规则:
在栈和堆中的类对象的内置或复合类型成员变量将为脏数据;
在全局变量区的类对象的内置或复合类型成员变量初始化为0;
类对象成员将调用默认的构造函数来初始化;
#include &iostream&
int main()
Box *pbox3 = new B
cout&&"box1.length == "&&box1.length&&" box1.width == "&&box1.width&&
cout&&"box2.length == "&&box2.length&&" box2.width == "&&box2.width&&
cout&&"box3.length == "&&pbox3-&length&&" box3.width == "&&pbox3-&width&&
上面代码的结果为:
box1.length == 0 box1.width == 0
box2.length == 2686792 box2.width ==
box3.length == 3811912 box3.width == 3801284&
带默认实参的构造函数
就像对普通函数一样可以为构造函数的参数指定默认值。
如果你为类定义了一个默认构造函数,又定义了一个所有参数都有默认的值的构造函数。(技术上来说,这是重载了)用默认构造函数构造类对象时将会产生编译错误。因为编译器不知道选择哪个重载函数。&
构造函数的初始化列表
除了在构造函数的函数体中用明确的赋值表达式给类成员赋值(从严格的概念上来说这不是初始化),推荐的做法是使用初始化列表。初始化列表以一个冒号开始,紧接着一个一个用逗号分隔的数据成员列表,每个数据成员后跟一个放在圆括号中的初始化式。构造函数的初始化列表只能在实现中指定而不能在定义体中指定。而类的成员函数(构造函数也不例外)的实现既可以在类的定义体中(内联函数),也可以在类的实现中。&
成员的初始化次序
每个成员只能在初始化列表中指定一次。而且成员在初始化列表中出现的顺序并不代表成员的实际初始化顺序。成员的初始化顺序是按照它们在类定义中出现的顺序来的。所以成员的初始化最好不要相互依赖,如果你确定它们要相互依赖,你得清楚它们在类定义中的出现顺序。
构造函数的构造的两个阶段
&(1)初始化阶段(根据默认的变量初始化规则和初始化列表来执行);(2)构造函数中的函数体执行阶段(这时构造函数体内的赋值语句才会执行)。
为什么推荐使用初始化列表?
1.在许多类中,初始化和赋值严格来讲都是低效率的:数据成员可能已经被直接初始化了,还要对它进行初始化和赋值。
2.比第一点提到的效率更重要的是,某些类型的数据成员必须要初始化。
&&&&&& 有些类型的成员必须在初始化列表中进行初始化,比如const对象和引用类型对象。它们只能初始化而不能赋值。在执行构造函数体之前必须完成初始化。在函数体内对它们赋值会引发编译错误。
&&&&&&& 类类型的成员变量也要特别注意,如果你不对它在初始化列表中的初始化,编译器将会尝试在初始化阶段调用它的默认构造函数给他初始化。如果它没有默认的构造函数,这将会导致运行时错误。另一种情况是你只在构造函数体内对类对象的成员进行了赋值。初始化阶段将会调用该类对象成员的默认构造函数,计算阶段将会调用构造函数体内指定构造函数。意思是该类对象成员调用了两次构造函数,第二次的会覆盖第一次的。
构造函数与隐式类型转换、explicit
&&&&&& C++支持类型自动转换。可以定义如何将其他类的对象隐式转换为我们的类类型,也可以将我们的类类型对象隐式的转换为其他类型。构造函数有个隐含规则:可以用单个实参类调用的构造函数定义了一个从该形参类型到该类类型的一个隐式转换。有时候这不是你想要的,并且会引发错误。例如你定义了下面的类。
Box(int x=1,int y=1);
Box::Box(int x,int y):length(x),width(y)
如果你Box box= 2来初始化一个Box对象。编译器将2隐式转换为一个Box对象,相当于调用了构造函数Box(2)。
如果你在需要Box类型参数的函数调用中传入的是一个int实参,将会构造一个临时的Box对象再传入函数作参数。函数结束后,这Box对象也就消失了,这有什么用呢?这几乎肯定是一个错误。对此我们可以:
1.用关键字explicit阻止构造函数定义的隐式转换
&&&&&& 在类构造函数的声明前加上explicit关键字(注意不能在定义中加),可以阻止隐式转换。
explicit Box(int x=1,int y=1);
如果你再这样定义一个Box对象:Box box = 2或者将int类型对象作为参数当做Box对象传给某个函数,将会引发编译错误。
2.每次转换,自己显示的使用构造函数。这样可以防止隐式转换。
在需要Box对象实参的的函数调用中用func(Box(2))来调用类的构造函数创建一个临时对象,防止自动的隐式转换。
建议:除非有明确的理由允许隐式转换,可以用单个参数调用的构造函数都应该定义为explicit。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具32被浏览2,430分享邀请回答41 条评论分享收藏感谢收起111 条评论分享收藏感谢收起C++中类的构造函数调用顺序
我的图书馆
C++中类的构造函数调用顺序
C++子类和父类的构造函数调用顺序
[cpp] #include&&iostream&&&using&namespace&&&&&//子类&&class&base&&{&&public:&&&&&&base()&&&&&&{&&&&&&&&&&cout&&"i&am&base&constuction!"&&&&&&&&}&&};&&//父类&&class&drived&:&public&base&&{&&public:&&&&&&drived()&&&&&&{&&&&&&&&&&cout&&"i&am&drived&constuction!"&&&&&&&&}&&};&&int&main()&&{&&&&&&drived&d;&&&&&&//输出结果&&&&&&/*&&&&&i&am&base&constuction!&&&&&i&am&drived&constuction!&&&&&Press&any&key&to&continue&&&&&*/&&&&&&return&0;&&}&&
由输出结果我们可以看到,先调用的是base类的构造函数,再调用了drived类的构造函数,也就是说,在声明子类实例的时候,是会先调用父类的构造函数的。这个很好理解,子类是包含了父类的信息的,所以要构造子类,必须先构造父类的信息,然后加入一些子类的新信息。
成员类的构造函数调用顺序
[cpp] #include&&iostream&&&using&namespace&&&&&class&son&&&&&&{&&&&&&public:&&&&&&&&&&son()&&&&&&&&&&{&&&&&&&&&&&&&&cout&&"i&am&son&constuction!"&&&&&&&&&&&&}&&&&&&};&&class&family&&{&&public:&&&&&&family()&&&&&&{&&&&&&&&&&cout&&"i&am&family&constuction!"&&&&&&&&}&&&&&&son&&&&&&&&&};&&&&&&int&main()&&{&&&&&&family&&&&&&&//输出结果&&&&&&/*&&&&&i&am&son&constuction!&&&&&i&am&family&constuction!&&&&&Press&any&key&to&continue&&&&&&*/&&&&&&return&0;&&}&&
从上面的结果我们科看到,先调用的是构造函数。这是为什么?因为类中含有成员类时,先要给成员类申请空间,先调用成员类的构造函数,然后再调用自身的构造函数。
[cpp] #include&&iostream&&&using&namespace&&&//父亲姓名&&class&name&&{&&public:&&&&&&name()&&&&&&{&&&&&&&&&&cout&&"i&am&name&constuction!"&&&&&&&&}&&};&&//子类&&class&base&&{&&public:&&&&&&base()&&&&&&{&&&&&&&&&&cout&&"i&am&base&constuction!"&&&&&&&&}&&};&&//父类&&class&drived&:&public&base&&{&&public:&&&&&&drived()&&&&&&{&&&&&&&&&&cout&&"i&am&drived&constuction!"&&&&&&&&}&&&&&&name&&&};&&&&int&main()&&{&&&&&&drived&d;&&&&&&//输出结果&&&&&&/*&&&&&i&am&base&constuction!&&&&&i&am&name&constuction!&&&&&i&am&drived&constuction!&&&&&Press&any&key&to&continue&&&&&&*/&&&&&&return&0;&&}&&
上面的例子是声明了一个name类,一个base类,一个drived类,其中drived类是从base类派生,且drived类中声明了name类的一个实例。
那么根据我们上面的分析,我们声明了drived类之后,先会调用父类构造函数,也就是输出i am base construction,然后调用自身的成员类构造函数,也就是i am name construction,最后调用自身的构造函数,也就是i am drived construction。
同理,如果我们在父类base类中声明了name成员类的话,顺序会是name-&base-&drived。我下面给出测试例子:
[cpp] #include&&iostream&&&using&namespace&&&//父亲姓名&&class&name&&{&&public:&&&&&&name()&&&&&&{&&&&&&&&&&cout&&"i&am&name&constuction!"&&&&&&&&}&&};&&//子类&&class&base&&{&&public:&&&&&&base()&&&&&&{&&&&&&&&&&cout&&"i&am&base&constuction!"&&&&&&&&}&&&&&&name&&&};&&//父类&&class&drived&:&public&base&&{&&public:&&&&&&drived()&&&&&&{&&&&&&&&&&cout&&"i&am&drived&constuction!"&&&&&&&&}&&&&&&&&};&&&&int&main()&&{&&&&&&drived&d;&&&&&&//输出结果&&&&&&/*&&&&&i&am&name&constuction!&&&&&i&am&base&constuction!&&&&&i&am&drived&constuction!&&&&&Press&any&key&to&continue&&&&&*/&&&&&&return&0;&&}&&
本文来自IT部落格,转载请注明,http://www.itbuluoge.com,~致力于编程、算法、数据库技术的分享
TA的最新馆藏
喜欢该文的人也喜欢java 构造函数_百度百科
清除历史记录关闭
声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。
java 构造函数
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
构造函数是一种特殊的函数。其主要功能是用来在创建对象时初始化对象, 即为对象赋初始值,总与new一起使用在创建对象的语句中。构造函数与类名相同,可重载多个不同的构造函数。在JAVA语言中,构造函数与C++语言中的构造函数相同,JAVA语言中普遍称之为构造方法。
java 构造函数名词解释
一般我们讲的“函数”就是“方法”;
构造函数=;
有些地方还将它称为构造子、构造器。
一般情况下,我们叫它构造函数或者构造方法。
java 构造函数特点
是一种特殊的方法,具有以下特点。
(1)构造方法的方法名必须与类名相同。
(2)构造方法没有返回值类型,不能使用return语句。
(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
(4)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则会自动插入一个无参数的默认方法,这个构造方法不执行任何代码。
(5)构造方法可以,以参数的个数,类型,顺序。
java 构造函数构造函数的调用
java构造函数的调用问题//不能继承
(1)子类只调用父类的默认(缺省)构造函数,即无形参构造函数。如果父类没有默认构造函数,那子类不能从父类调用默认构造函数。
(2)子类从父类处调用父类默认构造函数,不能成为子类的默认构造函数。
(3)在创建对象时,先调用父类默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。
(4)如果子类想调用父类的非默认构造函数,则必须使用super来实现。
(5)子类必须调用父类的构造函数。可以通过系统自动调用父类的默认构造函数,如果父类没有默认构造函数时,子类构造函数必须通过super调用父类的构造函数。
java 构造函数执行过程
java 构造函数的执行过程
类初始化时构造函数调用顺序:
(1)初始化对象的存储空间为零或null值;
(2)调用父类构造函数;
(3)按顺序分别调用类和实例成员变量的初始化;
class Dollar {
Money m = new Money();
Rmb r = new Rmb();
public Dollar() {
System.out.println("Dollar is constructor.");
public static void main(String[] args) {
new Dollar();
class Money {
public Money() {
System.out.println("Money is constructor.");
class Rmb {
public Rmb() {
System.out.println("RMB is constructor.");
Money is constructor.
RMB is constructor.
Dollar is constructor.
java 构造函数不同之处
JAVA 与C#构造函数执行顺序的不同之处
public static void main(String[] args)
Child child = new Child();
class Parent
System.out.println("to construct Parent.");
class Child extends Parent
System.out.println("to construct Child.");
Delegatee delegatee = new Delegatee();
class Delegatee
Delegatee()
System.out.println("to construct Delegatee.");
namespace ConsoleApplication1
public class Test
public static void Main(String[] args)
Child child = new Child();
class Parent
public Parent()
Console.WriteLine("to construct parent");
public Child()
Console.WriteLine("to construct Child.");
Delegatee delegatee = new Delegatee();
class Delegatee
public Delegatee()
Console.WriteLine("to construct Delegatee.");
to construct Delegatee.
to construct Child.
to construct Parent.
清除历史记录关闭}

我要回帖

更多关于 构造函数和成员函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信