|
环境: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[10];
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[10];
CHILD child6("six");
。。。
这时报错误:
37 E:\Tech Docs\C++\Workspace\ch8\main.cpp expected `;' before '(' token
我就把它改成
CHILD child6();
就不报错了(是不是因为类定义时不能初始化?),但是两个构造函数里的任何一个都没有被执行,因为看不到任何输出信息,
后来我在CHILD类里又加了两个函数:
class CHILD
{
char name[10];
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();
到底发生了什么?为什么编译又不报错? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|