Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

const in OOP - C++

09.06.2012, 14:13. Просмотров 707. Ответов 10
Метки нет (Все метки)

Я абсолютно не понимаю зачем нужно const. Изменяет эта функция дату или не изменяет какая разница у нас же есть разный уровень доступа (public , protected , private)??? Почему const так нужна??? Кто ниб , пожалуйста объясните на какой нибудь примере схемки или линки на подобие видео где с плюшевыми медвежатами без пафонсных фраз объясняется смысл

ЗЫ как например вот это стенфордское видео )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2012, 14:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос const in OOP (C++):

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start->next;} return c; } Функция...

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //<-- ??? } В clang это работает. В VisualStudio 2015 нет.

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

10
kent
Нуб со стажем
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
09.06.2012, 15:38 #2
Объявляя метод константным, мы показываем, что не будем изменять поля объекта. Это может обезопасить от ошибок. Объявляйте все методы класса, которые не изменяют ничего, константными, это улучшит читабельность кода.
1
Evg
Эксперт CАвтор FAQ
18884 / 6840 / 498
Регистрация: 30.03.2009
Сообщений: 19,260
Записей в блоге: 30
09.06.2012, 15:49 #3
По части конструкция языка Си (и, соответсвенно, унаследованное в Си++):
http://www.cyberforum.ru/blogs/18334/blog87.html
1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
09.06.2012, 15:54  [ТС] #4
Цитата Сообщение от kent Посмотреть сообщение
Объявляя метод константным, мы показываем, что не будем изменять поля объекта. Это может обезопасить от ошибок. Объявляйте все методы класса, которые не изменяют ничего, константными, это улучшит читабельность кода.
т.е. это типа для методов которые что то выводят ???? или для перегружанных операторов типа << ???
0
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
09.06.2012, 16:20 #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);
}
1
diagon
Higher
1936 / 1202 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.06.2012, 16:56 #6
const нужен для улучшения читаемости и повышения надежности, и, в редких случаях, для оптимизации.
1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.07.2012, 21:47  [ТС] #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 
 
}
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2012, 22:06 #8
Цитата Сообщение от Leeto Посмотреть сообщение
Point& const ObjPoint
потому что в данном случае const не влияет на ссылку
1
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
24.07.2012, 22:27  [ТС] #9
Цитата Сообщение от Jupiter Посмотреть сообщение
потому что в данном случае const не влияет на ссылку
А почему он не влияет ? И причем тут ссылка вообще я так же как и в первом случае хочу объявить объект константным ...а есть такое понятие как адрес ключевого слова ? мож дело в этом
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2012, 22:28 #10
Цитата Сообщение от Leeto Посмотреть сообщение
А почему он не влияет ?
начнем с того, почему должен влиять?
1
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.07.2012, 22:42 #11
Цитата Сообщение от Leeto Посмотреть сообщение
Point const &ObjPoint
То что слева от &, относится к объекту. Ссылка на константный объект.
Point& const ObjPoint
То что справа от & - к самой ссылке. Но так как ссылка, сама по себе, всегда константна ( в отличие от указателя), то это просто игнорируется.

Добавлено через 9 минут
С указателями та же история. Если Point const *ObjPoint, то указатель на константный объект. Если Point *const ObjPoint, то констанстый указатель на неконстантный объект (и уже не игнорируется, как в случае ссылки).
1
24.07.2012, 22:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 22:42
Привет! Вот еще темы с ответами:

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,&quot;acc.dll&quot;,RT_RCDATA); if(!hRes){ } HGLOBAL...

error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+' - C++
Что означает ошибка в 8 строчке error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'? ...

ConsoleSnake OOP - C++
...остановился я на 13 главе &quot;Классы и наследование&quot;. На форуме неоднократно выкладывался код консольной змейки. Мне хотелось написать...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru