注册 登录
编程论坛 C++教室

默认构造函数

zjdxsunyan 发布于 2011-04-16 17:09, 973 次点击
#include<iostream>
using namespace std;

class complex
{
public:
    double real,imag;
    complex(double r,double i)
    {
        real=r;
        imag=i;
    }
    complex()
    {
    }
};
complex operator+(complex com1,complex com2)
{
    complex temp;
    temp.real=com1.real+com2.real;
    temp.imag=com1.imag+com2.imag;
    return temp;
}
void main()
{
    complex com1(1.1,2.2),com2(3.3,4.4),total1,total2;
    total1=com1+com2;
    total2=operator+(com1,com2);
    cout<<"rea1="<<total1.real<<" imag1="<<total1.imag<<endl;
    cout<<"rea2="<<total2.real<<" imag2="<<total2.imag<<endl;
}
上面的代码是能够通过的,可我不知道为什么需要写一个默认的无参数的构造函数。
13 回复
#2
ljt2011-04-16 21:01
不用啊,编译器都会自己弄个默认的构造函数
#3
zjdxsunyan2011-04-16 21:30
但是如果去掉那个无参的构造函数会出错。
#4
bccn2502011-04-16 23:20
我翻了一下前几天刚刚下载的 C++ Primer 电子书326页--原文311页

书里也只说:“奇怪的是。。。。”
#5
詹曦2011-04-16 23:43
回复 楼主 zjdxsunyan
系统自动生成缺省构造函数(空构造函数)的条件是,类里面没有构造函数!若不想写缺省构造函数,且只写一个构造函数时,只需构数的所有参数都赋个初值即可。
参考模式如下:
complex(double r=0,double i=0)
    {
        real=r;
        imag=i;
    }
#6
zjdxsunyan2011-04-17 07:41
回复 5楼 詹曦
恩,谢谢你,这样可以正确编译运行。但你能说说做为什么能这样做呢?
#7
守墨2011-04-17 09:19
上面就相当于一个构造函数吗。
#8
守墨2011-04-17 09:29
默认的
#9
城东古桥2011-04-17 10:15
如果你自己定义了构造函数,系统将不再生成默认构造函数,如果需要默认构造函数需要显式定义,5楼那就是合成默认构造函数
#10
zjdxsunyan2011-04-17 10:28
感谢各位热心的人。结贴时散分,哈哈!
#11
诸葛修勤2011-04-17 10:38
赶上
#12
辰星睿2011-04-17 11:03
之所以要有无参构造函数 是因为编译器在建立新对象时的地方会自动插入对构造函数的调用代码 这也是C++程序“例行公事”的必然行为  比如你这个代码例子中的
complex temp;complex total1,total2;定义这些变量时就会用到无参构造 因为你定义的时候便没有参数传递 这也是为什么你说去掉无参构造就出错了的原因 但是你如果去掉无参构造后改成将这两行代码改成 complex temp(参数1,参数2);complex total1(参数1,参数2),total2(参数1,参数2);就能通过编译了 但是这样或许就会和你所要的函数功能实现出现矛盾 所以最好每个类针对实际都加上无参构造函数 这也算是个好的习惯吧
#13
辰星睿2011-04-17 11:17
之所以要构造函数 是因为编译器在建立新对象时 会自动插入对构造函数的调用代码 这也是c++程序“例行公事”的必然行为 比如你这个代码中的complex temp;和complex total1,total2;都是在调用无参构造函数 所以你在去掉去参构造时会报错 针对你这个例子 你如果去掉无参构造函数后 将这两行改成complex temp(参数1,参数2);后面的total一样这样改 就能通过编译了 因为你这里有有参构造 编译器能找到
#14
pangding2011-04-17 11:34
C++ 标准里明确了这个特征:(节选自 ISO/IEC 14882:2003(E),第12章,第1节,第5条)
A default constructor for a class X is a constructor of class X that can be called without an argument. If there is no user-declared constructor for class X, a default constructor is implicitly declared. An implicitly-declared default constructor is an inline public member of its class. ......
(类X的默认构造函数是指可以被无参数调用的X的构造函数。如果类X没有用户声明的构造函数,则一个构造函数将会被隐式声明。一个隐式声明的构造函数是这个类的一个内联公有成员。)
1