| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 977 人关注过本帖
标题:拷贝构造函数的问题
只看楼主 加入收藏
jjg
Rank: 2
等 级:论坛游民
帖 子:67
专家分:42
注 册:2009-8-19
结帖率:46.15%
收藏
 问题点数:0 回复次数:8 
拷贝构造函数的问题






#include <string.h>
#include <iostream.h>
class name
{
public:
    name()
    {
        pname=0;
        cout<<"默认构造函数"<<endl;
    }
    name(char* pn)
    {
        copyname(pn);
        cout<<"构造函数"<<endl;
    }
    name(name& s)
    {
        cout<<"拷贝构造"<<endl;
        copyname(s.pname);
        
    }
    ~name()
    {
        //deletename();
        cout<<"析构";
    }
    name& operator=(name& s)
    {
        //deletename();
        copyname(s.pname);
        cout<<"赋值运算符"<<endl;
        return *this;
    }
    void display()
    {
        cout<<pname<<endl;
    }
protected:
    void copyname(char * pn);
//    void deletename();
    char* pname;
};
void name::copyname(char* pn)
{
    pname=new char[strlen(pn)+1];
    if(pname)
    {
        strcpy(pname,pn);
    }
}
/*void name::deletename()
{
    if(pname)
    {
        delete pname;
        pname=0;
    }
}*/
void main()
{
    name s("clau");
    name t;
    //t.display();
    t=s;
    t.display();

}
//去掉重载赋值运算符函数之后,结果怎么就不调用拷贝构造函数呢?
搜索更多相关主题的帖子: 函数 构造 拷贝 
2009-11-16 08:40
faint_zjr
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-11-16
收藏
得分:0 
你的拷贝构造函数的参数应该是const name & s,否则会循环调用拷贝构造函数。跟重载赋值运算符应该没关系吧。
2009-11-16 09:56
jjg
Rank: 2
等 级:论坛游民
帖 子:67
专家分:42
注 册:2009-8-19
收藏
得分:0 
回复 2楼 faint_zjr
不是这样的,对t=s如果有赋值运算符重载就会调用的,如果没有运算符重载应该就要调用拷贝构造函数啊,这不是对象的拷贝吗?
2009-11-16 17:42
faint_zjr
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-11-16
收藏
得分:0 
回复 3楼 jjg
如果是对象声明并用已有的类对象初始化,则调用的是复制构造函数。否则是=重载
例如:
class A
{
...
}
A test;//默认构造函数
A test2=test;//复制构造函数
但是如果:
A test;
A test2;
test2=test;//赋值操作符重载
你可以让复制构造函数,赋值操作符重载有输出试验下
2009-11-16 22:46
flyingcloude
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:6
帖 子:598
专家分:1512
注 册:2008-1-13
收藏
得分:0 
回复 3楼 jjg
t = s;调用的是赋值构造函数

你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题
2009-11-16 23:53
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
如果用户明确定义Operator =,那么就会调用用户定义的那个;否则,会调用编译器生成的那个(进行逐成员位拷贝).
另外,CLASS a = b;

   CLASS a;
   a = b;
是不一样的.
第一个,会调用Copy constructor(当然,也是用户定义就用用户的,没有定义就用编译器生成的)
第二个,a先构造完成后,才用operator = 来让b给它拷贝.

樱花大战,  有爱.
2009-11-18 11:48
jjg
Rank: 2
等 级:论坛游民
帖 子:67
专家分:42
注 册:2009-8-19
收藏
得分:0 
回复 6楼 中学者
如果用户明确定义Operator =,那么就会调用用户定义的那个;否则,会调用编译器生成的那个(进行逐成员位拷贝).
另外,CLASS a = b;

   CLASS a;
   a = b;
是不一样的.
第一个,会调用Copy constructor(当然,也是用户定义就用用户的,没有定义就用编译器生成的)
第二个,a先构造完成后,才用operator = 来让b给它拷贝.

对于class b;CLASS a = b;这里不是a和b共享b这个空间,而是把b的空间复制给了a,是不是就是因为有拷贝构造函数,就进行了深拷贝。
 对于CLASS a = b;和class a(b)又是不是有什么不同
2009-11-18 19:54
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
回复 7楼 jjg
CLASS a=b;和CLASS a(b);是一样的

樱花大战,  有爱.
2009-11-19 13:25
MainRed
Rank: 1
等 级:等待验证会员
帖 子:7
专家分:0
注 册:2009-4-27
收藏
得分:0 
同意8楼
2009-11-29 20:02
快速回复:拷贝构造函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015739 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved