请教一个C++的问题:关于构造函数
环境:DEV-C++ 4.9.9.2//=============================================================
#include <cstdlib>
#include <iostream>
using namespace std;
class CHILD
{
//char *name;
public:
CHILD(char name[] = "x")
{
cout<<"I'm the child, named "<<name<<endl;
}
CHILD()
{
cout<<"child, no parameter construction:"<<endl;
}
};
class FATHER
{
char name;
CHILD child6;
public:
FATHER()
{
cout<<"I'm the father"<<endl;
}
};
int main(int argc, char *argv[])
{
FATHER b;
CHILD child7("Seven");
}
//============================================================
本来我在类 FATHER 里是这样定义的:
class FATHER
{
char name;
CHILD child6("six");
。。。
这时报错误:
37 E:\Tech Docs\C++\Workspace\ch8\main.cpp expected `;' before '(' token
我就把它改成
CHILD child6();
就不报错了(是不是因为类定义时不能初始化?),但是两个构造函数里的任何一个都没有被执行,因为看不到任何输出信息,
后来我在CHILD类里又加了两个函数:
class CHILD
{
char name;
public:
CHILD(char name[] = "x")//: name(aname)
{
cout<<"I'm the child, named "<<name<<endl;
}
CHILD()
{
cout<<"child, no parameter construction:"<<endl;
}
void getname()
{
cout<<"Give me a name: ";
cin>>name;
}
void showname()
{
cout<<"My name is "<<name<<endl;
}
};
1)如果带参数定义CHILD对象,就一切OK,
2)如果不带参数,但是带括号定义CHILD对象,比如
CHILD child7();
编译也OK,但是不运行构造函数,
3)如果不带括号定义CHILD对象,编译通不过,错误是:
55 E:\Tech Docs\C++\Workspace\ch8\main.cpp call of overloaded `CHILD()' is ambiguous
意思应该是构造函数重载冲突。这时我删掉一个构造函数,程序也正常。
如果我去掉一个构造函数,以2)方式定义对象,只在主程序里调用CHILD的成员函数,这时编译又报错:
58 E:\Tech Docs\C++\Workspace\ch8\main.cpp request for member `getname' in `child7', which is of non-class type `CHILD ()()'
总结一下,我的问题是:
在定义对象时后面加一对括号时:
CHILD childx();
到底发生了什么?为什么编译又不报错? char name[] = "x"
数组名不是指针,不能这样赋值吧 应该是算是吧,数组名就是指针啊,况且这只是个形参,另外,编译也没报错:D 你这段程序里有几处写法让人混淆:
1、构造函数CHILD(char name[] = "x"),这里的形参name和成员变量name同名,这样会导致成员变量在这个函数里被隐藏。这种写法对编译没影响,但是容易导致逻辑错误。
2、2个构造函数,一个不带参数,另一个带参数,但是你又加了1个缺省值,要知道函数缺省值的意思就是你可以调用时不加这个参数,那么当你不带参数构造这个对象时,不论构造函数函数用哪个,都是语法允许的,这样就产生了歧义,这时怎么处理估计要看编译器内部实现了。
第1处写法不值得提倡,第2处写法引起歧义,估计编译器要疯掉,我们也要疯掉,最好改掉,你可以改成不带缺省值"x"的构造函数。 非常感谢LS的前辈,您说得极是
那我把不带参数的构造函数删掉,然后定义对象时用
CHILD childx();
这种形式会怎么调用构造函数呢?还是根本就不创建对象? 将不带参数的构造函数删掉后,再用childx()定义对象,会创建对象的,就是使用缺省参数"x"传进去来调用构造函数,不过就是成员变量不会被赋值,因为成员变量和形参同名导致被隐藏。 类里面不允许进行初始化赋值的。记得看过一篇帖子专门讲如何用c实现c++的类。看过了就知道里面的成员是如何存储的,这个问题也就明白了。。不过名字忘记了。。晚上回去看看 回复【6楼】lixivip
-----------------------------------------------------------------------
如果有不带参数的构造函数,定义对象时带括号和不带括号都是可以的,在VC里是允许的,在其他编译环境里不大清楚。 成员变量初始化有2种方式:
1、在构造函数里赋值。
2、使用初始化列表,例如point():x(0){};//x是point的成员变量 回复【6楼】lixivip
-----------------------------------------------------------------------
不知道您说的是不是《DSP2000程序员高手进阶》
回复【5楼】jpchen
-----------------------------------------------------------------------
OK,我试试,谢谢你这么热心:) 我明白了!当我用带括号的形式去定义一个对象时(不带参数,如 CHILD child7();),实际上编译器认为是声明了一个返回值为该类对象的函数!而不是认为定义了一个对象。
因为当我试着用sizeof去看这个对象所占的空间时,得到了这么一个Error:
59 E:\Tech Docs\C++\Workspace\ch8\main.cpp ISO C++ forbids applying `sizeof' to an expression of function type
再次谢谢各位! 刚才仔细看了一下楼主位代码,才发现我前面没看仔细,原来楼主那句“CHILD child7();”是写在类的定义里,我一直以为是写在函数的函数体里,误解了。楼主在10楼说的对,这时其实就是一个函数了,而不是对象。
页:
[1]