C ++ - 赋值运算符的签名不正确?

时间:2014-06-01 21:39:24

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

我很难基本理解赋值运算符是如何工作的,或者我可能没有定义正确的算法,或者我已经遇到了一些C ++问题;不确定。

我有一个这样的课程:

class A
{
 public:

   A();
   A(const A &rhs);

   //some other ctors
   //and functions here

   A& operator=(A rhs);
   A  create_half();

   double* m_data;

};

这是create_half的主体;它似乎与情况有关

A A::create_half(){

  //construct a new A
  A mya;

  //do stuff to mya here,
  //and then return the new A
  return mya;

}

这是复制构造函数,至少是它的缩短版本。这是由于标准而跳过的代码 - 至少如果这是真正发生的事情。

A::A(const A& rhs):
 m_data(new double[1])
{
    *m_data = *(rhs.m_data);
    //or something similar, essentially
    //a deep copy
}

然后在代码中我尝试写这样的东西

A a_instance;

//do stuff to a_instance

//this doesn't call any = operator or 
//copy c-tor I try to define, why?
A b_instance = A.create_half(); 

//but this works fine
//the = operator I have def'd is called
A b_instance;
b_instance = A.create_half();

虽然我的复制c-tor现在我的赋值运算符都不包含此操作,但是我想要它的行不能正常执行默认复制(即b_instance.m_data设置为a_instance.m_data)。

对于有问题的行,我无法进入赋值运算符;这就是为什么我认为我有错误的签名或类似的东西。

有什么想法吗?

编辑:很抱歉误导你们 - 没有B级存在。

再次编辑:我已经接受了答案,我在上面的片段中添加了一些细节,试图阐明实际情况。

由于create_half()创建的A实例未绑定到引用,因此标准允许复制构造函数的省略,这对于b_instance来说非常重要,并且会执行深层复制。

对我来说,这看起来很大胆!我不认为我会看到答案,因为这个编辑是在初始发布后的某个时间,但这里的设计模式会更好吗?

1 个答案:

答案 0 :(得分:3)

A a_instance();

是一个没有参数且返回类型为A的函数声明。

本声明

B b_instance = A.create_half(); 

语法上无效。至少它应该写成

B b_instance = A().create_half();

在此语句中,类型B的对象是从类型A的对象创建的。我无法说明此语句是否正确,因为您没有显示类B定义。

此声明也无效

b_instance = A.create_half();

必须有

b_instance = A().create_half();

确实使用了一个赋值运算符(甚至可能是复制赋值运算符,前提是B类有一个转换构造函数,或者A类有一个转换函数)但是对于B类。你没有显示你如何定义类B.所以再次我不能说这个赋值运算符有什么问题。

关于A类复制赋值运算符的签名

A& operator=(A rhs);

然后它是有效的,但如果你将其声明为

会更好
A& operator=( const A &rhs );

编辑:当您更改原始帖子时,我需要在以下代码段中附加与您的问题相关的消息

//this doesn't call any = operator or 
//copy c-tor I try to define, why?
A b_instance = A.create_half(); 

根据C ++标准

  

31当满足某些标准时,允许省略实施   复制/移动类对象的构造,即使构造函数   选择用于复制/移动操作和/或析构函数   对象有副作用。在这种情况下,实施处理   省略的复制/移动操作的源和目标只是两个   引用同一个对象的不同方式,以及对它的破坏   该对象发生在两个对象的后期   如果没有优化就会被破坏。

其中一个证书标准"是

  

- 当一个尚未绑定到引用的临时类对象时   (12.2)将被复制/移动到具有相同的类对象   cv-unqualified类型,可以省略复制/移动操作   将临时对象直接构造到目标中   省略了复制/移动