Что означает & оператор при перегрузке - PullRequest
0 голосов
/ 06 февраля 2012

Я читаю книгу на C ++.Программа пытается сделать вектор объектов.Вот часть, которую я не понимаю

class X {
public:
    X();
    X(int m) {
        temp = x;
    }

    int temp;


    X &operator =(int z) {
        temp = z;
        return *this;
    }

private :
    //            Some functions here
}

Что означает вышеуказанная строка?Это какая-то перегрузка?Тогда как?

Ответы [ 6 ]

6 голосов
/ 06 февраля 2012

Я собираюсь предположить, что у вас есть опечатка и что строка на самом деле гласит:

X &operator =(int z) {

& означает, что возвращаемый тип является ссылкой;Вы должны прочитать это как функцию operator =, которая возвращает тип X &.

4 голосов
/ 06 февраля 2012

Значение может быть более понятным, если вы слегка измените интервал:

X& operator= (int z)

Это перегрузка оператора присваивания, operator=, который принимает аргумент int и возвращает ссылку на class X.

Вы можете использовать его для назначения целочисленного значения для объекта:

X x;
x = 42; // calls the overloaded operator

Возвращаемое значение позволяет связывать назначения:

X x1,x2;
x1 = x2 = 42;   // equivalent to `x2 = 42; x1 = x2;`
(x1 = x2) = 42; // equivalent to `x1 = x2; x1 = 42;`
1 голос
/ 06 февраля 2012

Это означает следующее: C * и C ++ позволяют вам связывать назначения, подобные этому

((x = 4) = 3) = 2;

, в результате чего x будет иметь значение 2: x сначала устанавливается на 4, затем на 3, а затем на 2 (кажется, что это не очень полезно, но вариации этого могут создавать отличные сокращенные выражения).Чтобы это работало, под ним должно произойти следующее:

x = 4;
X& x2 = x;  // reference to x, so that it can be modified without explicitly writing x
x2 = 3;     // since x2 is just an alias, the variable that's actually changed is x
X& x3 = x2; // again, x2 just refers to x, so now x3 also does
x3 = 2;     // yet again, modifies x


* в C, конечно, он не работает со ссылками, но результат тот же.

1 голос
/ 06 февраля 2012

Вероятно, ваш код должен выглядеть так:

class X {
public:
    int temp;
private :
    //Some functions here 
    X &operator =(int z) 
    {
        temp = z; 
        return *this ;
    }
};

А чем вы имеете дело с operator=, а не &operator

Ваш operator = возвращает ссылку на объект, который онприменяется к.

0 голосов
/ 06 февраля 2012

Это определение оператора присваивания : может выглядеть лучше в таком формате (определение вне строки):

X & X::operator=(int z)
{
    temp = z;
    return *this;
}

Позволяет написать что-то вроде этого:

X a, b, c(10);
a = b = c;

Значение каждого подвыражения присваивания является ссылкой на правопреемника.

Оператор должен быть объявлен внутри определения класса, конечно:

class X
{
public:
    X & operator=(int);
    // ...
};
0 голосов
/ 06 февраля 2012

Это X& operator= (int z) Я думаю, то есть перегрузка оператора =, который принимает int и возвращает ссылку на X.

...