创建函数别名 调用构造函数调用顺序吗?

共有 2842 人关注过本帖
标题:请问实例化一个类的时候,先创建变量还是先执行构造函数?
等 级:新手上路
帖 子:16
结帖率:100%
&&问题点数:0&&回复次数:4&&&
请问实例化一个类的时候,先创建变量还是先执行构造函数?
初学,看到一个类定义如下:
class point
&&& private int point_x;
&&& private int point_y;
&&& public int x&&& {
&&&&&&&&get { return point_x; }
&&&&&&&&set { if (value & 0)
&&&&&&&&&&&&&&& point_x = 0;
&&&&&&&&&&&&else
&&&&&&&&&&&&&&& point_x =&&&&&&&&}
&&& public int y&&& {
&&&&&&&&get { return point_y; }
&&&&&&&&set { if (value & 0)
&&&&&&&&&&&&&&& point_y = 0;
&&&&&&&&&&&&else
&&&&&&&&&&&&&&& point_y =&&&&&&&&}
&&& public point()
&&&&&&&&x = 0;
&&&&&&&&y = 0;
有一点不太明白,书上都是说实例化一个类的时候,首先会执行构造函数,这样就直接给x和y赋值了。但是照理说这时候x和y两个变量都还没有声明,都还不存在,这样赋值岂不出错?
或者还是说实例化的时候会把类定义里的所有数据成员都先声明好,然后再来执行构造函数?
迷惑中,望赐教!!
搜索更多相关主题的帖子:
来 自:河北石家庄
等 级:小飞侠
帖 子:975
专家分:2514
没错,先把变量创建完成,然后才执行构造函数。
来 自:河南
等 级:论坛游侠
帖 子:130
专家分:120
没错,先把变量创建完成,然后才执行构造函数也当然 可以&&&&&& 先来一个的空的构造函数
public point()
实例一个对像时&&先来一个
point myPoint=new point();
myPoint.x=
myPoint.y=
。。。然后&&执行相应的方法
happy&&C#
等 级:新手上路
帖 子:16
以下是引用happy886在 09:58:04的发言:
也当然 可以&&&&&& 先来一个的空的构造函数
public point()
实例一个对像时&&先来一个
point myPoint=new point();
myPoint.x=
myPoint.y=
。。。然后&&执行相应的方法
为什么要用空的构造函数呢?这和不写构造函数也一样了吧?
30岁的初学者。
来 自:X星球
等 级:青峰侠
帖 子:282
专家分:1580
每一个类都有自己的构造函数,没有构造函数你就不能对它实例化.
1.有的类看没有看破到有构造函数,但在编译器编译就有默认的无参构造函数.
2.如有自己的构造函数,就不会在编译时创建默认的构造函数.
3.在静态类中,也是有个构造函数的,必须是静并无参.
自创QQ群,方便C#学习交流.希望各项工作路好学都好入!
版权所有,并保留所有权利。
Powered by , Processed in 0.026051 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved& 构造函数和析构函数
构造函数和析构函数
构造函数和析构函数
void __construct
PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用
parent::__construct()。
Example #1 使用新标准的构造函数
&?phpclass&BaseClass&{&&&function&__construct()&{&&&&&&&print&"In&BaseClass&constructor
";&&&}}class&SubClass&extends&BaseClass&{&&&function&__construct()&{&&&&&&&parent::__construct();&&&&&&&print&"In&SubClass&constructor
";&&&}}$obj&=&new&BaseClass();$obj&=&new&SubClass();?&
为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct()
函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为
__construct() 的方法,但它却又不是构造函数。
void __destruct
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如
C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
Example #2 析构函数示例
&?phpclass&MyDestructableClass&{&&&function&__construct()&{&&&&&&&print&"In&constructor
";&&&&&&&$this-&name&=&"MyDestructableClass";&&&}&&&function&__destruct()&{&&&&&&&print&"Destroying&"&.&$this-&name&.&"
";&&&}}$obj&=&new&MyDestructableClass();?&
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用
parent::__destruct()。
析构函数在脚本关闭时调用,此时所有的头信息已经发出。
试图在析构函数中抛出一个异常会导致致命错误。C++中有多个构造函数的类,在使用默认构造函数的实例创建后,再调用类方法时出错。_百度知道
C++中有多个构造函数的类,在使用默认构造函数的实例创建后,再调用类方法时出错。
/David体重;联合难道多个构造函数的类:&quot,使用默认构造函数的类实例;
weight。void main() {
showClass()下面这段C++代码;&cout&&&
cout&lt?#include&
~A(){cout&JJack体重; void showClass();&lt,就提示两个错误;&J&#47。2、error C2228,21);
/&}void showClass(){
A David(),把
getHeight() { }}:&&&&David体重;&lt,不能调用类方法;&
cout&lt:&quot.weight = 56;&
John.getWeight()&lt: “A”;&加上这句后出错。
A Jack(16):
weight = 25;David.getWeight”的左边必须有类/D
A John(16;声明函数;&lt.getWeight()&lt,height,int y) { height = x+y: “;&这里是析构函数&&lt:1; 那行去掉就正常: 指定了多个默认构造函数;这是不带参数的构造函数&quot,加上这行、warning C4520;& }
A ();结构/ class A {iostream&&&
getWeight() const{&& }
A (int w=15) { weight = w+5;&&&&
system(&pause&endl.getWeight()&lt:&John体重.getWeight()&&&quot
提问者采纳
编译器无法确定到底使用哪个来进行调用。记住有默认值的函数签名包括数个(默认值个数+1)不同的调用签名这个问题是函数默认值的问题造成的; } 其实相当于两个声明 即使用默认值的A()和不使用默认值的A(int)。第二个错误是因为第一个无法确定调用哪一个而产生的后续错误,很明显的这个也是函数重载时常见的错误之一,第一个会直接提示一个错误而不是警告。你用的编译器版本比较老了吧。 A (int w=15) { weight = w+5,就会造成编译时错误,如果有冲突
昨晚找到问题原因:1、像你说的那个A (int w=15) 默认值导致它与默认构造函数冲突。但是改过来后奇怪的是只执行了构造函数没执行析构函数。2、用 A David = A();
替代 A Daivd(); 问题终于解决,但是刚学习C++,还没学到A David = A();这种创建实例的形式和 A Daivd();的区别。所以只算理解这个问题一半。
A David(); 还是少用吧,只有部分编译器接受这种语法,其他不接受这种调用默认构造函数的语法的编译却不一定给出警告。gcc就认为这是合法的none-classtype: A()而不是A,因为A()是合法的函数对象,如果只是声明的话,是合法的,不会报错。这句话的意思是 A() David;应该用 A david;不加括号。有一点忘记说:对于变量初始化的顺序和时间,大部分时候都是依赖于编译器的,C常用的一种方式就是初次使用初始化,C++假定之中方式也会别使用,所以使用默认构造函数的声明,并不一定非得按照这种方式处理。比如在gcc下,就在声明的同时会被初始化,这是由于近年来自动临界区编程方式的出现,造成有时候需要在声明时初始化等技术而做的妥协……vs就难说了,各种优化都很恶心。所以如果你不应当期望它在声明时即获得资源并初始化。所以完全可以当做是没有这回事的,因为C++并没有规定初始化的时机,只是规定了必须在被使用之前被初始化这件事。所以出现了也不能说是错误的。这就是C++为啥又复杂有令人难过而且经常被误用的原因。去看effective C++系列的书吧。关于C++比较奇怪的地方可以看imperfect C++和exceptional C++这两个系列的书。很多很神奇的问题。有些问题很好玩的,令人抓狂的问题。
提问者评价
非常感谢!
其他类似问题
为您推荐:
构造函数的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁请教各位老师创建一个类的对象必须调用构造函数吗?
[问题点数:40分]
请教各位老师创建一个类的对象必须调用构造函数吗?
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2010年7月 VC/MFC大版内专家分月排行榜第三2010年6月 VC/MFC大版内专家分月排行榜第三
2011年 总版技术专家分年内排行榜第三2010年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第五
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。&&/&&&&/&&&&/&&
不带参数的构造函数使该类的每一个对象都得到相同的初始值。
如果希望对不同的对象赋予不同的初始值,则需要使用带参数的构造函数,在调用不同对象的构造函数时,将不同的数据传给构造函数,以实现不同的初始化。
构造函数首部的一般格式为:
& & 构造函数名(类型1 &形参1, 类型2 &形参2, &)
由于用户是不能调用构造函数的,因此无法采用常规的调用函数的方法给出实参。实参是在创建对象时给出的。创建对象的一般格式为:
& & 类名 &对象名(实参1, 实参2, &);
【例9.2】有两个长方柱,其长、宽、高分别为12, 20, 25和10, 14, 20,求它们的体积。编写一个基于对象的程序,在类中用带参数的构造函数。
#include &iostream&
Box(int,int,int);
int volume( );
//声明带参数的构造函数//声明计算体积的函数
Box::Box(int h,int w,int len) //在类外定义带参数的构造函数
int Box::volume( ) //定义计算体积的函数
return (height*width*length);
int main( )
Box box1(12,25,30); //建立对象box1,并指定box1长、宽、高的值
cout&&&The volume of box1 is &&&box1.volume( )&&
Box box2(15,30,21); //建立对象box2,并指定box2长、宽、高的值
cout&&&The volume of box2 is &&&box2.volume( )&&
程序运行结果如下:
The volume of box1 is 9000
The volume of box2 is 9450
可以知道:
带参数的构造函数中的形参,其对应的实参在定义对象时给定。
用这种方法可以方便地实现对不同的对象进行不同的初始化。
用参数初始化表对数据成员初始化
上面介绍的是在构造函数的函数体内通过赋值语句对数据成员实现初始化。C++还提供另一种初始化数据成员的方法&&参数初始化表来实现对数据成员的初始化。这种方法不在函数体内对数据成员初始化,而是在函数首部实现。
例9.2中定义构造函数可以改用以下形式:
& & Box::Box(int h,int w,int len):height(h),width(w), length(len){ }
这种写法方便、简练,尤其当需要初始化的数据成员较多时更显其优越性。甚至可以直接在类体中(而不是在类外)定义构造函数。
推荐文章 TOP10}

我要回帖

更多关于 java调用父类构造函数 的文章

更多推荐

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

点击添加站长微信