搜索
bottom↓
回复: 11

请教一个C++的问题:关于构造函数

[复制链接]

出0入0汤圆

发表于 2010-11-1 15:57:09 | 显示全部楼层 |阅读模式
环境: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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-11-1 16:00:08 | 显示全部楼层
char name[] = "x"
数组名不是指针,不能这样赋值吧

出0入0汤圆

 楼主| 发表于 2010-11-1 16:03:03 | 显示全部楼层
应该是算是吧,数组名就是指针啊,况且这只是个形参,另外,编译也没报错:D

出0入0汤圆

发表于 2010-11-1 16:52:18 | 显示全部楼层
你这段程序里有几处写法让人混淆:
1、构造函数CHILD(char name[] = "x"),这里的形参name和成员变量name同名,这样会导致成员变量在这个函数里被隐藏。这种写法对编译没影响,但是容易导致逻辑错误。
2、2个构造函数,一个不带参数,另一个带参数,但是你又加了1个缺省值,要知道函数缺省值的意思就是你可以调用时不加这个参数,那么当你不带参数构造这个对象时,不论构造函数函数用哪个,都是语法允许的,这样就产生了歧义,这时怎么处理估计要看编译器内部实现了。

第1处写法不值得提倡,第2处写法引起歧义,估计编译器要疯掉,我们也要疯掉,最好改掉,你可以改成不带缺省值"x"的构造函数。

出0入0汤圆

 楼主| 发表于 2010-11-2 08:45:59 | 显示全部楼层
非常感谢LS的前辈,您说得极是

那我把不带参数的构造函数删掉,然后定义对象时用
  CHILD childx();
这种形式会怎么调用构造函数呢?还是根本就不创建对象?

出0入0汤圆

发表于 2010-11-2 09:01:29 | 显示全部楼层
将不带参数的构造函数删掉后,再用childx()定义对象,会创建对象的,就是使用缺省参数"x"传进去来调用构造函数,不过就是成员变量不会被赋值,因为成员变量和形参同名导致被隐藏。

出0入0汤圆

发表于 2010-11-2 09:39:29 | 显示全部楼层
类里面不允许进行初始化赋值的。记得看过一篇帖子专门讲如何用c实现c++的类。看过了就知道里面的成员是如何存储的,这个问题也就明白了。。不过名字忘记了。。晚上回去看看

出0入0汤圆

发表于 2010-11-2 10:05:54 | 显示全部楼层
回复【6楼】lixivip
-----------------------------------------------------------------------

如果有不带参数的构造函数,定义对象时带括号和不带括号都是可以的,在VC里是允许的,在其他编译环境里不大清楚。

出0入0汤圆

发表于 2010-11-2 10:18:54 | 显示全部楼层
成员变量初始化有2种方式:
1、在构造函数里赋值。
2、使用初始化列表,例如point():x(0){};//x是point的成员变量

出0入0汤圆

 楼主| 发表于 2010-11-2 14:29:08 | 显示全部楼层
回复【6楼】lixivip  
-----------------------------------------------------------------------

不知道您说的是不是《DSP2000程序员高手进阶》

回复【5楼】jpchen  
-----------------------------------------------------------------------

OK,我试试,谢谢你这么热心:)

出0入0汤圆

 楼主| 发表于 2010-11-2 15:10:18 | 显示全部楼层
我明白了!当我用带括号的形式去定义一个对象时(不带参数,如 CHILD child7();),实际上编译器认为是声明了一个返回值为该类对象的函数!而不是认为定义了一个对象。
因为当我试着用sizeof去看这个对象所占的空间时,得到了这么一个Error:
59 E:\Tech Docs\C++\Workspace\ch8\main.cpp ISO C++ forbids applying `sizeof' to an expression of function type

再次谢谢各位!

出0入0汤圆

发表于 2010-11-2 15:17:51 | 显示全部楼层
刚才仔细看了一下楼主位代码,才发现我前面没看仔细,原来楼主那句“CHILD child7();”是写在类的定义里,我一直以为是写在函数的函数体里,误解了。楼主在10楼说的对,这时其实就是一个函数了,而不是对象。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 21:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表