赋值运算符实现的说明

时间:2013-12-09 16:04:35

标签: c++

有人可以向我解释这个方法/功能在做什么吗?

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?

5 个答案:

答案 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;内部ab属于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}}

....并且它被认为是一种很好的形式,可以让被覆盖的运算符像基本类型一样运行。