在c ++中将一个类对象分配给另一个类对象

时间:2016-09-17 15:39:33

标签: c++ copy-constructor assignment-operator

我想在c ++中将一个类对象分配给另一个类对象。

实施例 有一类狗和另一类猫。创建每个的一个实例(d1和c1)。不想使用任何STL。我想在我的代码中使用这个语句

  

d1 = c1;

程序

class dog
{
    char  dc;
    float df;
    int   di;   
public:
    void setdata2(char c, float f, int i)
    {   dc = c; df = f; di = i; }
    void showdata2()
    {   cout  <<"char =" << dc <<", float =" << df <<", int =" << di  <<endl;   }
};


class cat
{
    float cf;
    int ci;
    char cc;    
public:
    void setdata(float f, int i, char c)
    {   cf = f; ci = i; cc = c; }
    void showdata()
    {   cout <<"float =" << cf <<", int =" << ci <<", char =" << cc  <<endl;    }
};


int main()
{
    dog d1, d2;
    cat c1, c2;

    d1.setdata2('A', 56.78, 30);
    c1.setdata(12.34, 2, 3);
    d1.showdata2();
    c1.showdata();

    d2 = c1;        // Question 1

    dog d3(c1);     // Question 2

    dog d4 = c1;    // Question 3

    return 0;
}

请分别回答 问题1/2/3

2 个答案:

答案 0 :(得分:2)

在重载"="运算符之前,不能将彼此不相关的两个不同类的对象分配给彼此。

  

您可以阅读有关运算符重载here

的信息

答案 1 :(得分:1)

  

我想在c ++中将一个类对象分配给另一个类对象。

如果Aimplicitly convertibleBA可以将类型为B的对象分配给类型B的对象,{{1如果B有一个assignable赋值运算符,它接受A类型的对象,则为overloaded

有两种方法可以定义从自定义类型A到无关类型B的转换。您可以为A定义conversion function,也可以为B类型定义converting constructor

1)这是复制作业。以上说明适用。定义cat::operator dog()dog::dog(cat)dog::operator=(cat)

2)这是direct initialization。这不是你所询问的任务。定义隐式转换也适用于此,但重载赋值运算符不会。但是,重载的构造函数将是替代的第三种替代方法。

3)虽然这看起来有点像语法上的赋值,但实际上这是copy initialization。同样的规则适用于2)。

PS。请注意,您要使用名称d3定义两个变量。这是一个错误。