有人可以向我解释这个方法/功能在做什么吗?
Bank& Bank::operator=(const Bank& bank) throw() {
// Zuweisung auf mich selbst?
if (this == &bank)
return *this;
// bisherige Konto-Objekte destruieren
loescheKonten();
// Attribute uebertragen und das Array anlegen
this->name = bank.name;
this->maxAnzKonten = bank.maxAnzKonten;
kontoTab = new Konto*[maxAnzKonten];
anzKonten = bank.anzKonten;
// vorhandene Konten kopieren
for (int i = 0; i < anzKonten; i++) {
Konto* tmp = bank.kontoTab[i];
kontoTab[i] = new Konto(*tmp);
}
return *this;
}
特别是:
Bank& Bank::operator=(const Bank& bank) throw() {
// Zuweisung auf mich selbst?
if (this == &bank)
return *this;
意味着Bank::operator=(const Bank& bank) ...
Bank构造函数将Bank类库分配给运算符变量?或者怎么样?和运营商属于Bank?
答案 0 :(得分:4)
这个特殊部分涉及自我分配。通常情况下,它表明赋值运算符中的代码存在诸如缺少异常安全性等问题。
典型情况是您拥有一个动态分配数据的类,例如:
class X {
char *whatever;
size_t size;
public:
X &operator=(X const &other) {
delete [] whatever;
size = other.size;
whatever = new char [other.size];
for (int i=0; i<size; i++)
whatever[i] = other.whatever[i];
}
};
在自我分配的情况下,这将在复制源中的数据之前删除目标中的数据。如果源和目标相同,则删除数据会破坏对象。
为了防止这种情况,有一次典型的情况是在开头包含一个条件,如你所示:
if (this == &other)
return *this;
...所以自我指派并没有破坏你的数据。然而,如上所述,面对例外,这是不安全的。为了安全,您通常需要创建源的副本,然后将其内容交换到目标。在这种情况下,检查自我分配可以作为优化包括在内,但不再需要正确的操作(至少在我的经验中,它也是一个相当无价值的优化)。
答案 1 :(得分:3)
这是一个复制赋值运算符。您困惑的代码部分是检查以确保this
指针与传递给函数的引用不同。例如:
Bank b;
b = b;
引用检查通过尝试将其数据分配给自身来防止第二行引起问题(具体来说,当您只是自己设置自己时,不需要重新分配动态内存,因此它可以避免所有这些)。 / p>
答案 2 :(得分:1)
有人可以向我解释这个方法/功能在做什么吗?
它为Bank类实例赋值提供了一个特别不安全的实现。实现是不安全的,因为它可以抛出异常,而函数被标记为throw()
。默认情况下,如果您在内存不足的情况下运行此代码(并且分配失败),您的应用程序将调用terminate
并退出。
特别是:
Bank& Bank::operator=(const Bank& bank) throw() {
// Zuweisung auf mich selbst?
if (this == &bank)
return *this;
什么意思是Bank :: operator =(const Bank&amp; bank)......
这声明了一个返回Bank引用并对Bank实例进行const引用的函数。该函数是赋值操作,这意味着您可以这样调用它:
Bank a, b;
a = b; // same as a.operator=(b);
if语句检查this
指针与参数不同,因为这会使应用程序遇到未定义的行为。
答案 3 :(得分:0)
第一个阻止自我分配如下:
Bank a;
a = a;
=
运算符就像其他类函数一样,但它伪装成=
。当表达式a = b;
内部a
和b
属于Bank
类型时,将调用它。
这就是定义的含义:
Bank& Bank::operator=(const Bank& bank)
;
第一个Bank::
表示来自a = b;
的左操作数的类型,而参数const Bank& bank
表示b。它就像任何其他函数参数一样。
同样Bank&
是表达式a = b
的返回值,在这种情况下它将返回a
如果你想要你不需要返回任何东西(使用void
),但在这种情况下你将无法执行a = b = c
因为b = c
返回void并且没有相同的运算符a = something_void
答案 4 :(得分:0)
它基本上覆盖=
类型Bank
对象的Bank A;
Bank B;
.
.
.
A = B;
运算符,允许这样:
if (this == &bank)
return *this;
该行
this
将参数的指针值与当前实例进行比较,以查看它们是否是同一个对象。如果他们那么没有工作要做,因为你正在为自己分配一个对象。
该方法返回Bank&
作为非const引用((A = B) = C; //sic
)的原因是因为以下是处理基本类型(例如双精度,整数,字符)时有效的c ++语法: / p>
{{1}}
....并且它被认为是一种很好的形式,可以让被覆盖的运算符像基本类型一样运行。