Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Классы. Защита членов-данных
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
owner owner вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.03.2006
По умолчанию Классы. Защита членов-данных - 28.03.2006, 02:17

Среда Borland C++ v3.0 или 3.1

1. Если член-данное задан конструкцией const Point *P, где Point - это класс "Геометрическая точка на плоскости", то можно ли,
скопировав указатель, изменить значение объекта, на который он
указывает?
2. Аналогичный вопрос, но для конструкции Point *const P
3. Каким образом для константных членов-данных можно вызвать
модификатор? И возможно ли это в принципе?
4. В чём разница между передачей в член-функцию класса параметра
по ссылке или применив при передаче спецификатор const?
5. Как с точки зрения синтаксиса и семантики правильно написать:
Point *const P или Point const *P? Если оба варианта
правильны, то в чём между ними разница?
Ответить с цитированием
  (#2 (permalink)) Старый
Fuud Fuud вне форума
Member
 
Сообщений: 4,076
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.09.2004
По умолчанию 28.03.2006, 09:24

качай или покупай учебник.
Ответить с цитированием
  (#3 (permalink)) Старый
owner owner вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.03.2006
По умолчанию 28.03.2006, 12:49

К сожаленю, в учебниках такого не пишут. В стандарте тоже не описано. Видимо, только по-опыту можно узнать.
Ответить с цитированием
  (#4 (permalink)) Старый
Yaroslav Yaroslav вне форума
Member
 
Сообщений: 166
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.10.2004
По умолчанию 28.03.2006, 15:11

Цитата:
1. Если член-данное задан конструкцией const Point *P, где Point - это класс "Геометрическая точка на плоскости", то можно ли,
скопировав указатель, изменить значение объекта, на который он
указывает?
2. Аналогичный вопрос, но для конструкции Point *const P
3. Каким образом для константных членов-данных можно вызвать
модификатор? И возможно ли это в принципе?
4. В чём разница между передачей в член-функцию класса параметра
по ссылке или применив при передаче спецификатор const?
5. Как с точки зрения синтаксиса и семантики правильно написать:
Point *const P или Point const *P? Если оба варианта
правильны, то в чём между ними разница?
Вобще применение конструкции
Цитата:
Point *const P, Point const *P, const Point *P,Point *const P
к членам класса некорректно а внекоторых случаях должно выдать сообщение об ошибке.
Применение спецификатора const в основном идет для функций классов и для параметров функций классов, отражает что внутри функции-класса переменные не будут модернизироватся и не будут вызыватся функции-класса не помеченные как const и на этапе компиляции будет выдаватся ошибка гдето так "не могу преобразовать указатель на const 'текущий_класс' в указатель на 'текущий_класс'".
А вобщем удобная веще для контроля написаного кода.
Ответить с цитированием
  (#5 (permalink)) Старый
owner owner вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.03.2006
По умолчанию 31.03.2006, 23:47

Спасибки. Я в общем-то почти разобралась. Имеется ввиду что эти конструкции и будут передаваться в качестве параметрам членам-функциям. Но с изменением у меня чего-то не получается. Как ни копируй указатели, а объект нельзя изменить, а надо!
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию Re: Классы. Защита членов-данных. - 02.04.2006, 19:53

Цитата:
Originally posted by owner
[b]1. Если член-данное задан конструкцией const Point *P, где Point - это класс "Геометрическая точка на плоскости", то можно ли,
скопировав указатель, изменить значение объекта, на который он
указывает?
Вообще в C++ можно явно преобразовать указатель на константный объект к указателю на неконстантный и измываться над этим объектом как угодно.

Цитата:
Originally posted by owner+-->
Цитата:
2. Аналогичный вопрос, но для конструкции Point *const P
А такая конструкция вообще не мешает менять сам объект. Она мешает только менять значение указателя.

Цитата:
Originally posted by owner@
[b]3. Каким образом для константных членов-данных можно вызвать
модификатор? И возможно ли это в принципе?
Да, возможно. См. мой ответ на п.1. Как - смотри Страуструпа или Стандарт C++ - const_cast<>.

<!--QuoteBegin-owner

[b]4. В чём разница между передачей в член-функцию класса параметра
по ссылке или применив при передаче спецификатор const?
Тем же, чем отличается передача в любую функцию параметра по значению и по ссылке. Кстати, можно передавать в функцию ещё и константную ссылку.

Цитата:
Originally posted by owner
[b]5. Как с точки зрения синтаксиса и семантики правильно написать:
Point *const P или Point const *P? Если оба варианта
правильны, то в чём между ними разница?
Не проверял. Но навскидку - правильный только первый вариант.
Ответить с цитированием
  (#7 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию Re: Классы. Защита членов-данных. - 02.04.2006, 23:18

Цитата:
Originally posted by Garik+-->
Цитата:
<!--QuoteBegin-owner
Цитата:
[b]5. Как с точки зрения синтаксиса и семантики правильно написать:
Point *const P или Point const *P? Если оба варианта
правильны, то в чём между ними разница?
Не проверял. Но навскидку - правильный только первый вариант.
Насколько я понимаю, Point const *P - это тоже самое, что const Point *P, т.е. все модификаторы до "звёздочки" относятся к указываемому объекту, а после "звёздочки" - к указателю.
Ответить с цитированием
  (#8 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию Re: Классы. Защита членов-данных. - 03.04.2006, 13:23

Цитата:
Originally posted by michael
[b]Насколько я понимаю, Point const *P - это тоже самое, что const Point *P, т.е. все модификаторы до "звёздочки" относятся к указываемому объекту, а после "звёздочки" - к указателю.
Уточнил. Ты прав.
Век живи - век учись (это я себе).
Ответить с цитированием
  (#9 (permalink)) Старый
owner owner вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.03.2006
По умолчанию 03.04.2006, 20:38

Спасибки, за подсказку. Оказалась очень кстати.
Ответить с цитированием
  (#10 (permalink)) Старый
owner owner вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.03.2006
По умолчанию 05.04.2006, 23:23

Не получается применить к константному объекту модификатор. Может что-то не так делаю?
Вот код:
point.h
Код:
class Point
{ int x;
   int y;
Point *next;
public:
Point();
Point(int X, int Y);
int GetX() const;
void SetX(int value);
~Point;
};
Point.cpp
Код:
 
#include "Point.h"
#include <stdlib.h>
Point::Point()
{x = 0;
 y = 0;
next = NULL;
}
Point::Point(int X, int Y)
{x = X;
  y = Y;
  next = NULL;
}
int Point::GetX() const
{return x;}
void Point::SetX(int value)
{x = value;}
Point::~Point()
{}
Square.h
Код:
#include "Point.cpp"
class Square
{Point P;
public:
const Point GetP();
Square(Point value);
~Square();
Square.cpp
Код:
#include "Square.h"
Square::Square(Point value)
{P = value;}
const Point Square::Square::GetP()
{return P;}
Square::~Square()
{}
test.cpp
Код:
# include "Square.cpp"
#include <conio.h>
#include <iostream.h>
int main()
{clrscr();
Point point(23,16);
Square test_object(point);
cout<<"nСтарое значение x"<<test_object.GetP().GetX();
Point *change = &(test_object.GetP());
change->SetX(25);
cout<<"nНовое значение x"<<test_object.GetP().GetX();
getch();
return 0
}
После выполнения старое значение не меняется. Как правильно сделать, чтобы оно изменилось?
Ответить с цитированием
  (#11 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 06.04.2006, 12:53

Ты возвращаешь объект Point по значению. Соответственно, он просто копируется и ты изменяешь именно эту копию.
Возвращай ссылку или указатель.
Ответить с цитированием
  (#12 (permalink)) Старый
owner owner вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.03.2006
По умолчанию 07.04.2006, 00:54

Если возвращать ссылку или указатель, то всё понятно - можно изменить, явно преобразовав указатель, а если по значению, то уже ни как. Спасибо, стало понятнее. И откуда люди такие умные? (не в упрёк будет сказано )
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита данных дисков Silicon Power Atmel Носители информации 1 30.04.2012 19:23
Вычислить сумму членов ряда Renir Visual Basic 1 23.01.2012 14:13
Вычислить сумму n первых членов ряда Suslik963 Prolog 0 29.10.2011 20:06
суммы первых членов последовательности (Очень срочно) Natalina Prolog 0 29.12.2009 15:19
Вычислить длину n-первых членов ряда Afannya Lisp 6 21.11.2008 22:16
Инициализация членов массива trixtrax Вопросы начинающих программистов 13 15.08.2008 01:28
Защита данных wenom C++ Builder 5 25.03.2007 18:49
Расположение static членов классов в массиве Rune Вопросы начинающих программистов 0 24.12.2006 22:11
Приведение подобных членов Madgeniy Delphi 0 06.04.2006 12:01
Защита от двойного добавления данных Дэн PHP 9 28.10.2004 19:16
Упаковка членов через компилятор S.Yu.Gubanov С/С++ 2 22.03.2004 17:30
Выдача списков членов нужного класса в VC++ 6.0 Anonymous Visual C++ 4 17.10.2003 07:42



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов