自复制构造函数
MyClass(const MyClass&);
Run Code Online (Sandbox Code Playgroud)
和=运算符重载
MyClass& operator = (const MyClass&);
Run Code Online (Sandbox Code Playgroud)
有几乎相同的代码,相同的参数,只有不同的返回,是否有可能有一个共同的功能,他们都使用?
我有一个类,需要一个非默认的复制构造函数和赋值运算符(它包含指针列表).有没有通用的方法来减少复制构造函数和赋值运算符之间的代码重复?
考虑一类需要复制的副本.副本中的绝大多数数据元素必须严格反映原始数据元素,但是有少数元素的状态不被保留且需要重新初始化.
从复制构造函数调用默认赋值运算符是不好的形式?
默认赋值运算符对于Plain Old Data(int,double,char,short)以及每个赋值运算符的用户定义类都表现良好.指针需要单独处理.
一个缺点是该方法使得赋值运算符瘫痪,因为不执行额外的重新初始化.也无法禁用赋值运算符的使用,从而通过使用不完整的默认赋值运算符打开用户创建损坏类的选项A obj1,obj2; obj2=obj1; /* Could result is an incorrectly initialized obj2 */
.
a(orig.a),b(orig.b)...
除了a(0),b(0) ...
必须写之外,放宽要求是很好的.需要写入所有初始化两次会产生两个错误位置,如果double x,y,z
要将新变量(例如)添加到类中,初始化代码需要在至少2个位置而不是1个位置正确添加.
有没有更好的办法?
在C++ 0x中有更好的方法吗?
class A {
public:
A(): a(0),b(0),c(0),d(0)
A(const A & orig){
*this = orig; /* <----- is this "bad"? */
c = int();
}
public:
int a,b,c,d;
};
A X;
X.a = 123;
X.b = 456;
X.c = 789;
X.d = 987;
A Y(X);
printf("X: %d %d %d %d\n",X.a,X.b,X.c,X.d); …
Run Code Online (Sandbox Code Playgroud) 由于某种原因,我不得不为我的班级提供复制构造函数和operator =.operator=
如果我定义了一个副本ctor,我想我不需要,但是QList
想要一个.把它放在一边,我讨厌代码重复,所以这样做有什么不对吗?
Fixture::Fixture(const Fixture& f) {
*this = f;
}
Fixture& Fixture::operator=(const Fixture& f) {
m_shape = f.m_shape;
m_friction = f.m_friction;
m_restitution = f.m_restitution;
m_density = f.m_density;
m_isSensor = f.m_isSensor;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
只是出于好奇,没有办法切换它,以便大部分代码都在复制文件中并operator=
以某种方式利用它?我尝试过,return Fixture(f);
但不喜欢那样.
看来我需要更清楚地说明复制构造函数和赋值运算符已被我继承的类隐式禁用.为什么?因为它是一个抽象的基类,不应该自己实例化.然而,这门课程是独立的.
我有一个很长的班级,有很多成员.我想为它编写复制构造函数.但是如果我编写自己的拷贝构造函数,我就失去了对deafult拷贝构造函数的访问权限.
我只是想在我自己的拷贝构造函数中修复一些指针.所以我希望对象的浅拷贝可以通过默认的拷贝构造函数来完成.
当有我自己的拷贝构造函数时,是否有可能访问默认的拷贝构造函数?
我最近阅读(并且遗憾地忘记了在哪里),编写operator =的最佳方法是这样的:
foo &operator=(foo other)
{
swap(*this, other);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
foo &operator=(const foo &other)
{
foo copy(other);
swap(*this, copy);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是,如果使用rvalue调用operator =,则第一个版本可以优化复制的构造.因此,当使用rvalue调用时,第一个版本更快,当使用左值调用时,这两个版本是等效的.
我很好奇其他人对此的看法?由于缺乏明确性,人们会避免使用第一个版本吗?我是否正确,第一个版本可以更好,永远不会更糟?
我知道对于独立类,你应该避免在复制构造函数中调用赋值运算符.复制和交换以及将重用代码移动到私有成员函数是两种轻松重用代码的方法.但是,最近我遇到了一些问题.这是代码:
// Derived.h
class Derived : Base {
// bunch of fun stuff here
// ...
// constructor that builds a derived object from a base one
explicit Derived(const Base& base);
// Assignment operator for moving base class member variables into the derived one
Derived& operator=(const Base& base);
};
// Derived.cpp
Derived::Derived(const& Base base) {
*this = base; // use assignment operator from derived to base
}
Derived& Derived::operator=(const Base& base) {
static_cast<Base>(*this) = base; // call base class assignment …
Run Code Online (Sandbox Code Playgroud) c++ ×7
constructor ×3
c++-faq ×1
c++11 ×1
deep-copy ×1
dry ×1
inheritance ×1
operators ×1
optimization ×1
parameters ×1
shallow-copy ×1