两个构造函数有啥区别

flydragon88 2012-11-20 10:40:01
这样写可以正常运行,出问题的地方是红色标记的地方
#include <iostream>
using namespace std;
class num
{
public:
num(){n=new int;*n=1;cout<<"构造函数在执行\n";}
num(int a){n=new int;*n=a;cout<<"带参数的构造函数\n";}
num(num&s){n=new int;*n=s.get();cout<<"复制构造函数\n";}
~num(){delete n;n=NULL;cout<<"析构函数\n";}
int get(){return* n;}
void set(int t){*n=t;}
num equal(num &s){*n=s.get();return *this;}
private:
int *n;
};
int main()
{
num one(1),two(30);
num three=one.equal(two);

cout<<one.get()<<endl;
cout<<three.get()<<endl;
return 0;
}

但是这样写就不对了

#include <iostream>
using namespace std;
class num
{
public:
num(){n=new int;*n=1;cout<<"构造函数在执行\n";}
num(int a){n=new int;*n=a;cout<<"带参数的构造函数\n";}
num(num&s){n=new int;*n=s.get();cout<<"复制构造函数\n";}
~num(){delete n;n=NULL;cout<<"析构函数\n";}
int get(){return* n;}
void set(int t){*n=t;}
num equal(num &s){*n=s.get();return *this;}
private:
int *n;
};
int main()
{
num one(1),two(30),three;
three=one.equal(two);

cout<<one.get()<<endl;
cout<<three.get()<<endl;
return 0;
}
...全文
164 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
魔w_j剑 2012-11-21
  • 打赏
  • 举报
回复
num one(1),two(30),three; three=one.equal(two); 定义three的时候调用默认构造函数的时候出错,因为在类中没有默认构造函数 所以要在类中添加:nun(){};
魔w_j剑 2012-11-21
  • 打赏
  • 举报
回复
这个里面没有默认构造函数,需要在类里面加上默认构造函数,这也是我刚开始出的一个错误 num(){cout<<"默认构造函数在执行\n";}
pathuang68 2012-11-20
  • 打赏
  • 举报
回复
参考: C++类中的4个特殊函数 - 缺省构造函数、拷贝构造函数、拷贝赋值操作符和析构函数 楼主要明白的是: num three=one.equal(two); 和 num three; three=one.equal(two); 的区别。 前者会调用拷贝构造函数(Copy Constructor),后者会调用拷贝赋值操作符(Copy Assignment Operator)
rocktyt 2012-11-20
  • 打赏
  • 举报
回复
引用 2 楼 ardayoyo 的回复:
楼主啥编译器?俺的VC6都没错啊
不是编译错,而是运行结果与预期不符合吧,直接指针赋值了
ardayoyo 2012-11-20
  • 打赏
  • 举报
回复
楼主啥编译器?俺的VC6都没错啊
rocktyt 2012-11-20
  • 打赏
  • 举报
回复
你需要重载赋值运算符

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧