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

const in OOP - C++

Восстановить пароль Регистрация
 
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
09.06.2012, 14:13     const in OOP #1
Я абсолютно не понимаю зачем нужно const. Изменяет эта функция дату или не изменяет какая разница у нас же есть разный уровень доступа (public , protected , private)??? Почему const так нужна??? Кто ниб , пожалуйста объясните на какой нибудь примере схемки или линки на подобие видео где с плюшевыми медвежатами без пафонсных фраз объясняется смысл

ЗЫ как например вот это стенфордское видео )))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kent
Нуб со стажем
 Аватар для kent
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
09.06.2012, 15:38     const in OOP #2
Объявляя метод константным, мы показываем, что не будем изменять поля объекта. Это может обезопасить от ошибок. Объявляйте все методы класса, которые не изменяют ничего, константными, это улучшит читабельность кода.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
09.06.2012, 15:49     const in OOP #3
По части конструкция языка Си (и, соответсвенно, унаследованное в Си++):
http://www.cyberforum.ru/blogs/18334/blog87.html
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
09.06.2012, 15:54  [ТС]     const in OOP #4
Цитата Сообщение от kent Посмотреть сообщение
Объявляя метод константным, мы показываем, что не будем изменять поля объекта. Это может обезопасить от ошибок. Объявляйте все методы класса, которые не изменяют ничего, константными, это улучшит читабельность кода.
т.е. это типа для методов которые что то выводят ???? или для перегружанных операторов типа << ???
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
09.06.2012, 16:20     const in OOP #5
В случае константных методов const даёт гарантию, что метод не изменяет поля своего класса. Это необходимо для константных объектов, например:
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
#include <iostream>
 
class some_class
{
    private:
        int data_;
 
    public:
        some_class(int value)
            : data_(value)
        {
 
        }
 
        // в этом методе все поля класса(за исключением объявленных как mutable)...
        // ...можно использовать только для чтения...
        int data() const
        {
            return data_;
        }
 
};
 
// неконстантные методы класса some_сlass в этой функции вызывать нельзя
void print_info(const some_class& sc)
{
    std::cout << sc.data() << std::endl;
}
 
int main()
{
    some_class sc(123);
    print_info(sc);
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.06.2012, 16:56     const in OOP #6
const нужен для улучшения читаемости и повышения надежности, и, в редких случаях, для оптимизации.
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.07.2012, 21:47  [ТС]     const in OOP #7
Объясните мне колдовство, пожалуйста, допустим есть банальный код
класс точка декларируем имплементируем...
Есть функция Distance( Point const &ObjPoint ) ;
сейчас имплементация ее такая что внутри функции изменяется объект что естественно const должен пресеч и он присекает выдавая ошибку
error C2662: 'Point::setX' : cannot convert 'this' pointer from 'const Point' to 'Point &'
но если поменять немного

Distance( Point const &ObjPoint ) -> Distance( Point& const ObjPoint )
то компелятор все нормально пропускает
point.hpp(30): warning C4227: anachronism used : qualifiers on reference are ignored
point.cpp(58): warning C4227: anachronism used : qualifiers on reference
вормингами правда но пропускает

Вопрос WFT ???

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
 
 
class Point
{
    private: // private declaration of data members 
    double x;   // X coordinate
    double y;   // Y coordinate
 
    public: // public declaration of data members (in given example haven't ) and member functions 
    //Declaration of Constructors 
    Point();                                    // Default constructor
    Point(double xval, double yval);            // Constructor 
    Point (const Point& ObjectOfClassPoint);    //COPY constructor
    ~Point(); // 
 
    // Declaration of  Accessors member functions
    void ToString() const;
    double getX() const ;                   
    double getY() const;    
 
    // Declaration of  Modificators member functions
    void setX(double newX); // The x-coordinate
    void setY(double newY); // The y-coordinate
 
 
    // Declaration of Calculators (additional functionality) member functions
    double DistanceOrigin() const;
    void   Distance( Point const  &ObjPoint ) ;
    
 
};
 
 
 
#endif // Point_HPP
 
 
#include "Point.hpp"
#include <iostream>
#include <sstream>
#include <cmath>
using namespace std;
 
 
 
            //----------- Implementation of Constructors -----------//
 
Point::Point() : x(0), y(0) { cout << "hi my default constructor\n\n\t";}                                   // Default constructor (implemented using colon syntax )
Point::Point(double newx, double newy) : x(newx), y(newy){cout << "hi my constructor\n\n\t";}       // Constructor 
Point::~Point() {cout << "bye my point..\n";}                   // Destructor 
 
Point::Point (const Point& ObjectOfClassPoint)                  // Copy constructor
        {
            cout << "this is COPY constructor\n\n\t "<<endl; 
            x = ObjectOfClassPoint.x;
            y = ObjectOfClassPoint.y;
        }
        
 
 
 
            //----------- Implementation of Modificators of x,y coordinates of an object -----------//
 
void Point::setX(double newX) {x = newX;}
void Point::setY(double newY) {y = newY;}
 
 
 
 
 
            //----------- Implementation of Accessors member functions -----------//
 
// Given functions should be const because we not willing modify contained variables when we call those fucntions in any case
double Point::getX()  const {return x;} 
double Point::getY()  const {return y;} 
 
void Point::ToString () const
    
    {// Function ToString should also be const also because of reason of mistaken modification of an object's value 
        ostringstream os; // std::stringstream object
        os << "\n\tPoint (" << x << ", " << y << ")"; // customization of output 
        cout << os.str() << '\n'; // str() function retrieve the string from the string buffer
    }
 
 
            //----------- Implementation of Calculators (additional functionality) member functions -----------//
 
double Point::DistanceOrigin() const
 
        {
            return std::sqrt(std::pow(x,2) + std::pow(y,2));
        }
 
 
void  Point::Distance( Point const  &ObjPt ) 
    
        {
            ObjPt.setX(1);
            cout << "value of x of object that is argument was changed "<< ObjPt.getX()  << "\n";
            ObjPt.ToString();
            cout << "distance is : " << std::sqrt(std::pow((x-ObjPt.x),2) + std::pow(y - ObjPt.y,2)); 
        }
 
    
#include "Point.hpp"
#include <iostream>
 
using namespace std;
 
 
 
 
 
 
int main()
{
    {
    double x, y ; 
 
    cout << "PURPOSE: Show two ways of creating object of given class\n1-way by using constructor\n2-way by using COPY constructor\n "; 
 
        cout << "\n\tPlease, enter, coordinates x and y for point 1  : \n";
        cout << "X1: ";
        cin >> x  ;
        cout << "Y1: ";
        cin >> y; // input x1 and y1 coordinates value by user
    Point p1 (x,y);
 
    cout << "\n\tPlease, enter, coordinates x and y for point 1  : \n";
        cout << "X2: ";
        cin >> x  ;
        cout << "Y2: ";
        cin >> y; // input x1 and y1 coordinates value by user
    Point p2 (x,y);
 
    p1.ToString(); // printing the point coordinates using ToString() function
    p2.ToString();
 
    cout << "\n\n\t ----Creating object using reference TEST ----" << "\n\n\t";
 
    cout << "Please enter point coordinates x and y of point 1  : \n";
        cout << "X3: ";
        cin >> x  ;
        cout << "Y3: ";
        cin >> y; // input x1 and y1 coordinates value by user
    Point p3 (x,y);
    
    Point *p4 = &p3; 
    
    p3.ToString(); // printing the point coordinates using ToString() function
    p4->ToString();
        
    //Point p5;
    //p5(p3);
    cout << "Distance  between second\nand third ( that calling by using pointer) points is : " ;
        p2.Distance(p3) ;
        cout << "\n\n\n";
    
    return 0;
 
}  
    // double bracket for main() function is needed for catching in console  message from destructor 
 
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2012, 22:06     const in OOP #8
Цитата Сообщение от Leeto Посмотреть сообщение
Point& const ObjPoint
потому что в данном случае const не влияет на ссылку
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.07.2012, 22:27  [ТС]     const in OOP #9
Цитата Сообщение от Jupiter Посмотреть сообщение
потому что в данном случае const не влияет на ссылку
А почему он не влияет ? И причем тут ссылка вообще я так же как и в первом случае хочу объявить объект константным ...а есть такое понятие как адрес ключевого слова ? мож дело в этом
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2012, 22:28     const in OOP #10
Цитата Сообщение от Leeto Посмотреть сообщение
А почему он не влияет ?
начнем с того, почему должен влиять?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 22:42     const in OOP
Еще ссылки по теме:

C++ int const * const foo(const int* param) const - разъясните значение квалификаторов
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
C++ Чем отличаются выражения (const int[]){value} от (const int[]){100}

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 22:42     const in OOP #11
Цитата Сообщение от Leeto Посмотреть сообщение
Point const &ObjPoint
То что слева от &, относится к объекту. Ссылка на константный объект.
Point& const ObjPoint
То что справа от & - к самой ссылке. Но так как ссылка, сама по себе, всегда константна ( в отличие от указателя), то это просто игнорируется.

Добавлено через 9 минут
С указателями та же история. Если Point const *ObjPoint, то указатель на константный объект. Если Point *const ObjPoint, то констанстый указатель на неконстантный объект (и уже не игнорируется, как в случае ссылки).
Yandex
Объявления
24.07.2012, 22:42     const in OOP
Ответ Создать тему
Опции темы

Текущее время: 03:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru