我很难基本理解赋值运算符是如何工作的,或者我可能没有定义正确的算法,或者我已经遇到了一些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来说非常重要,并且会执行深层复制。
对我来说,这看起来很大胆!我不认为我会看到答案,因为这个编辑是在初始发布后的某个时间,但这里的设计模式会更好吗?
答案 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类型,可以省略复制/移动操作 将临时对象直接构造到目标中 省略了复制/移动