Форум программистов, компьютерный форум CyberForum.ru

Зачем нужен const при перегрузке оператора - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ввести a и b и вывести квадраты и кубы чисел от a до b. http://www.cyberforum.ru/cpp-beginners/thread390076.html
Ввести a и b и вывести квадраты и кубы чисел от a до b. Пример: Введите границы интервала: 4 6 4 16 64 5 25 125 6 36 216 Вывести квадраты и кубы 10 чисел следующей последовательности: 1, 2, 4, 7, 11, 16, …
C++ Заменить числа последовательности, превышающие заданное число, на заданное число решите..а то вообще не понимаю.. http://www.cyberforum.ru/cpp-beginners/thread390073.html
C++ вумерная матрица А произвольной размерности
пусть есть двумерная матрица А произвольной размерности. Сформировать на ее основе вектор В элементами которого является сумма элементов строк
Поразрядные операции C++
Даны два int-числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long-число DEGHDABF, используя только поразрядные операции. В подчеркнутых цифрах вычислить количество битов ‘1’. long num(int n1, int n2); int main() { int n1, n2; long n; printf("Input two numbers n1 and n2: \t"); scanf("%x%x", &n1, &n2); n = num(n1, n2); ...
C++ Генератор паролей (нужна проверка) http://www.cyberforum.ru/cpp-beginners/thread390056.html
Здравствуйте. Написал простенький генератор паролей задаваемой пользователем длины. Все вроде правильно работает, просто, пожалуйста, посмотрите и скажите, где и почему я мудак. Особое внимание, пожалуйста, обратите на работу с динамическим выделением памяти. Большое спасибо. class PasswordGenerator { public: void askParameters(); void generate(); void output();
C++ сформировать матрицу Здравствуйте товарищи! Нужно сформировать матрицу В(4х4) из матрицы А (4х4), заменив элементы главной и побочной диагоналей матрицы А на элементы умноженные на сумму всех элементов. Заранее спасибо) подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
23.11.2011, 18:53     Зачем нужен const при перегрузке оператора
Цитата Сообщение от frostua Посмотреть сообщение
Следующий код описывает класс СТРОКА string_.
При перегрузке оператора '='
string_& string_::operator=(const string_ &str)
непонятно какова функция 'const'. Если он есть, то можно написать:
string_ A("Ivanov"), B;
B=A;
A="Petrov";

Если его нет, то A="Petrov" не скомпилируется, пишет:
binary '=' : no operator found which takes a right-hand operand of type 'const char [7]' (or there is no acceptable conversion)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <string.h>
using namespace std;
 
class string_                
{
private:
    // Строка
    char* S;
    // Длина строки
    int len;  
public:
    // Конструктор по умолчанию
    // без параметров
    string_();
 
    // Перегруженный конструктор
    // с параметром
    string_(char* s); 
    
    // Конструктор копирования
    string_(const string_& s); 
    
    // Деструктор
    ~string_(){ 
        delete [] S;
    }  
 
    // Константный метод
    // возвращающий содержимое
    // строки
    const char*GetStr()const 
    { 
        return S;       
    }
    // метод позволяющий изменить содержимое
    // с помощью пользователя
    void SetStr() 
    {
        // если строка не пустая - очистить
        if(S!=NULL)
            delete[]S;
        
        // создаем массив
        // и запрашиваем у пользователя данные
        char a[256]; 
        cin.getline(a,256); 
 
        // просчитываем размер
        len=strlen(a)+1;
 
        // выделяем память
        S = new char[len];
 
        // переписываем в объект
        // введенную строку
        strcpy(S,a); 
    }
 
    // Перегрузка бинарного оператора
    string_& operator=(const string_&);
};
 
string_::string_()
{
    // Начальная инициализация
    S = NULL;       
    len = 0;
}
 
string_::string_(char* s)
{
    len = strlen(s);
    S = new char[len + 1];
    // Инициализация строкой,
    // переданной пользователем
    strcpy(S, s);           
}
 
string_::string_(const string_& s)
{
    len = s.len;
    // Безопасное копирование
    S = new char[len + 1];  
    strcpy(S, s.S);
}
 
// Функция, реализующая безопасное присваивание
string_& string_::operator=(const string_ &str)
{                               
    // Предотвращение варианта STRING = STRING; 
    // (присваивание самому себе),
    // где STRING переменная класса string                              
    if(this == &str) 
         return *this;   
    // если размеры строк не совпадают
    // или строка, в которою производится запись
    // не сформированна
    if(len != str.len || len == 0)
    {
        // Удаление старой строки
        delete [] S;
        // Вычисление новой длины строки            
        len = str.len;
        // Выделение памяти под новую строку          
        S = new char[len + 1];  
    }
 
    // Инициализация строки
    strcpy(S, str.S);          
    return *this;               
}
 
void main()
{
    string_ A("Ivanov"), B;
    B=A;
    A="Petrov";// Не компилируется если убрать сonst
    cout<<B.GetStr()<<"\n\n";
}
Вам уже компилятор ответил на ваш вопрос! Нужно ттолько читать внимательно сообщения вашего компилятора. Дело в том, что когда вы используете предложение вида

C++
1
    A="Petrov";
то делаются следующие действия. Первое, сначала вызывается конструктор с одним параметром string_(char* s); , а затем созданный неименованный временный объект присваивается вашему объекту A. То есть приведенный выше код соответствует коду

C++
1
    A = string_( "Petrov" );
Но проблема в том, что неименованные временные объекты могут свуязываться лишь с константной ссылкой. Поэтому когда вы убираете квалификатор const у параметра оператора присваивания, то этот топератор присваивания уже не может применяться в данном предложении, так как неконстантная ссылка не может связываться с неименованным временным объектом.

Другой пример. Допустим вы объявили константный объект

C++
1
const string_ B( "Petrov"  );
Тогда и в этом случае вы не можете писать

C++
1
A = B;
так как требуется оператор присваивания, который в качестве аргумента может принимать константные объекты. То есть его параметр должен быть объявлен с квалификатором const
 
Текущее время: 04:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru