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

拷贝构造函数的问题

jjg 发布于 2009-11-16 08:40, 981 次点击






#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();

}
//去掉重载赋值运算符函数之后,结果怎么就不调用拷贝构造函数呢?
8 回复
#2
faint_zjr2009-11-16 09:56
你的拷贝构造函数的参数应该是const name & s,否则会循环调用拷贝构造函数。跟重载赋值运算符应该没关系吧。
#3
jjg2009-11-16 17:42
回复 2楼 faint_zjr
不是这样的,对t=s如果有赋值运算符重载就会调用的,如果没有运算符重载应该就要调用拷贝构造函数啊,这不是对象的拷贝吗?
#4
faint_zjr2009-11-16 22:46
回复 3楼 jjg
如果是对象声明并用已有的类对象初始化,则调用的是复制构造函数。否则是=重载
例如:
class A
{
...
}
A test;//默认构造函数
A test2=test;//复制构造函数
但是如果:
A test;
A test2;
test2=test;//赋值操作符重载
你可以让复制构造函数,赋值操作符重载有输出试验下
#5
flyingcloude2009-11-16 23:53
回复 3楼 jjg
t = s;调用的是赋值构造函数
#6
中学者2009-11-18 11:48
如果用户明确定义Operator =,那么就会调用用户定义的那个;否则,会调用编译器生成的那个(进行逐成员位拷贝).
另外,CLASS a = b;

   CLASS a;
   a = b;
是不一样的.
第一个,会调用Copy constructor(当然,也是用户定义就用用户的,没有定义就用编译器生成的)
第二个,a先构造完成后,才用operator = 来让b给它拷贝.
#7
jjg2009-11-18 19:54
回复 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)又是不是有什么不同
#8
中学者2009-11-19 13:25
回复 7楼 jjg
CLASS a=b;和CLASS a(b);是一样的
#9
MainRed2009-11-29 20:02
同意8楼
1