构造函数和对象
书上说:创建无参对象时,如无无参构造函数,会出错。
但书上有这样的例程,不能理解,请诸位大哥指点
class a
{
public:
A(int aa=10,int bb=1,int cc=3)
{
......
}
.
.
.
.
.
.
}
void main()
{
A a; //不明白,这里创建的对象是无参对象吧?和他匹配的构造函数在那里?
问题点数:100、回复次数:21Top
1 楼freezingfire(让美梦来得更猛烈些吧)回复于 2002-06-20 23:13:58 得分 0
一般来说,现在的编译器都会自动给你生成一个无参的构造函数,也叫默认构造函数。Top
2 楼ckacka(/*小红帽*/ckacka();)回复于 2002-06-20 23:18:51 得分 0
你这样用的是默认的构造函数,这是不需要任何显式说明的,系统自动的!
如果你要调用参数的话,可以:
A a(...)Top
3 楼eadi()回复于 2002-06-20 23:22:15 得分 0
我知道C++会提供默认的无参函数,但我这里定义了一个有参函数,C++就不会提供默认构造函数了,而我又没有定义无参构造函数,这个对象如何创建?Top
4 楼eadi()回复于 2002-06-20 23:25:46 得分 0
比如:
class A
{
public:
A(int n) //没有无参构造函数
{
......
}
.
.
.
}
void main()
{
A a; //错误
Top
5 楼zhdleo(叮东)回复于 2002-06-20 23:27:56 得分 0
针对无参的对象,会自动生成一个A()的无参的构造函数,而且一般在你没有写的情况下,你要是声明一个无参的对象,系统会自动生成这个构造函数的。
构造函数可以有多个(不同类型的参数),析构函数只能有一个。
所以,我们可以写很多构造参数(不同类型的参数),只要你需要。
想特别有用的复制构造函数。
我的愚见!Top
6 楼eadi()回复于 2002-06-20 23:33:49 得分 0
但书上是这样说的:只要定义一个构造函数(不一定是无参构造函数),C++就不提供默认构造函数,如还想要无参构造函数,必须自己定义Top
7 楼Kaye(菜到几时)回复于 2002-06-20 23:38:54 得分 20
哦?有问题吗?
匹配的当然是A(int aa=10,int bb=1,int cc=3)!
既然有默认参数,系统当然使用改构造函数了!Top
8 楼eadi()回复于 2002-06-20 23:46:11 得分 0
Kaye 我有点明白了,是不是因为参数有默认值,如果参数没有默认值就不行,是这样吗?Top
9 楼reaperGD(感悟者)回复于 2002-06-21 00:27:59 得分 0
记住上面一位兄弟说的话:
构造函数可以有多,析构函数只能有一个
根据参数的多少,系统自动选择调用哪个构造函数。Top
10 楼zhdleo(叮东)回复于 2002-06-21 00:29:01 得分 0
我怎么觉得还不对?
好像不是“没有默认值就不行“
你看在你声明的A(int aa=10,int bb=1,int cc=3)
如果使用的时候,你传进来的是A(aa,bb,cc),就是说传进来的是参数,那么到了
这个构造函数里他们就被赋值为aa=10,bb=1,cc=3
如果你穿进来的本来就是个值A(1,2,3)
那么这时里面的aa=1,bb=2,cc=3 就是这样了!
这是另外一个问题。
所以你不能说“参数没有默认值就不行”
因为我们是可以这样定义的:A(int aa,int bb,int cc)
说的不好,我的愚见!Top
11 楼eadi()回复于 2002-06-21 08:12:25 得分 0
叮东,如果这样定义:A(int aa,int bb,int cc)//注意没有默认值,A a,这样可以吗?创建对象该匹配哪个构造函数?照书上所说,对象没有可匹配的构造函数。因为没有无参构造函数,默认构造函数也由于已经定义了有参构造函数,而不会再由C++提供。我的理解是这样,请你指正。Top
12 楼T34(我是坦克我怕谁)回复于 2002-06-21 08:43:22 得分 30
<<C++ Programming Language>> 10.4.2
A default constructor is a constructor that can be called without supplying an argument.
A(int aa=10,int bb=1,int cc=3)可以不接受参数,所以他就是默认构造函数,可以写A a;Top
13 楼youngbamboo(youngbamboo)回复于 2002-06-21 09:17:19 得分 0
同意楼上的意见,A(int aa=10,int bb=1,int cc=3)就是默认构造函数Top
14 楼LionEagle(LionEagle)回复于 2002-06-21 09:30:31 得分 50
to T34(我是坦克我怕谁):
"A default constructor is a constructor that can be called without supplying an argument." 是对的,
但并不意味着反过来说也对,即
"A constructor that can be called without supplying an argument MUST be default constructor." 并不正确。
如果你为一个类写了constructor,那么编译器就不会产生default constructor,本例中之所以可以 A a,是因为每个参数都有缺省值
Top
15 楼anrxhzh(百宝箱)回复于 2002-06-21 09:39:37 得分 0
struct test{
test(int){};
};
int main()
{
test t; //error C2512: 'test' : no appropriate default constructor available
}
Top
16 楼anrxhzh(百宝箱)回复于 2002-06-21 09:41:07 得分 0
struct test{
test(int){};
};
int main()
{
test t; //error C2512: 'test' : no appropriate default constructor available
}
Top
17 楼beijingshizi(北京石子)回复于 2002-06-21 09:41:39 得分 0
如果没有构造函数,编译器会产生,如果有,就不会产生Top
18 楼yyzzbb_yang(eric)回复于 2002-06-21 10:00:25 得分 0
首先要告诉你,你调用的并不是无参constructor,而是默认参数的constructor。也不是你不能用无参构造函数,只要你没有声明任何constructor,编译器会为你产生一个缺省constructor,但是如果你定义了一个constructor,你就必须使用这种格式。当然你可以重载它,使它满足你的要求Top
19 楼eadi()回复于 2002-06-21 11:29:27 得分 0
谢谢诸位Top
20 楼eadi()回复于 2002-06-21 11:30:05 得分 0
谢谢诸位Top
21 楼LionEagle(LionEagle)回复于 2002-06-21 14:21:01 得分 0
更正一下:
没有参数的constructor是default constructor
所有参数均有参数的constrcutor也是default constructor
;
如果一个类没有constructor(假设它为基类),则编译器就会为这个类合成一个default constructor;
但如果它有constructor(无论它是否是default construcotr),编译器就不会为这个类合成一个default constructor。Top
22 楼LionEagle(LionEagle)回复于 2002-06-21 14:22:18 得分 0
更正一下:
没有参数的constructor是default constructor
所有参数均有缺省值的constrcutor也是default constructor;
如果一个类没有constructor(假设它为基类),则编译器就会为这个类合成一个default constructor;
但如果它有constructor(无论它是否是default constructor),编译器就不会为这个类合成一个default constructor。Top




