Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 20:07   #1
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию Втолкните про инкапсуляцию

Меня уже, мягко говоря, задрало что я не могу понять ДЛЯ ЧЕГО она нужна? Везде твердят примерно одно и то-же. Инкапсуляция связывает код и данные, и скрывает ненужный код и данные от пользователя а также защищает код от неправильного использования(это писал по памяти). Определение запомнил. А понять не могу. Каким образом можно неправильно использовать код? Приведите пожалуйста пример РЕАЛЬНОГО преимущества инкапсуляции. Левый пример про автомобиль и например давление в камере сгорания прошу не приводить, т.к обычный юзер может залезть в двигло и покопаться, естесственно что он может его обратно и не собрать, однако залезть в двигатель, мне кажется, намного легче, чем каким-то образом влезть в код(поправьте, если не прав). Также что конкретно означает понятие "интерфейс"? Это то, что взаимодействует с юзером? Т.е все эти сообщения в окне, и то, что туда можно вводить? Ок, тогда почему не написать код, чтобы юзер не мог уничтожить данные? В общем я слегка начал это понимать когда увидел пример про файловую систему. Т.е чтобы обратиться в файловую систему через, например, C++ мы используем специальные функции, а не обращаемся напрямую. Т.е инкапсуляция ограничивает наши возможности в данном случае. Ну а что значит тогда обращаться "напрямую"? Нашел на википедии пример кода для C#:
class EncapsulationExample
{
private double valueDouble;
private string valueString;

public double Value
{
get { return valueDouble; }
set
{
valueDouble = value;
valueString = value.ToString();
}
}

public string ValueString
{
get { return valueString; }
set
{
double tmp_value = Convert.ToDouble(value); //здесь может возникнуть исключение
valueDouble = tmp_value;
valueString = value;
}
}
}

Но я не понял тут что значит например "public double Value"? Это поле класса? Если так, то почему оно похоже на метод? Что значит это "value" с маленькой буквы? Оно нигде не объявлено, это то значение, которое мы можем задать нашей "double Value" посредством метода "set"? Зачем внизу создается временная переменная "tmp_value"? Если можно было-бы сразу запихнуть в "valueDouble" значение "Convert.ToDouble(value)". И какое тут может возникнуть исключение? Не правильное приведение типа? А какой тип мы можем сюда неправильно засунуть? Так, чтобы компилятор запустил все это? Заранее благодарю!
Furchtlos вне форума Ответить с цитированием
Старый 23.11.2011, 20:37   #2
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию

private данные используются в пределах класса где они создавались
public можно использовать за пределами класса
protected используются в пределах класса где они создавались и классах наследниках
Почитай книгу Д.Дейтла там все подробно и понятно написано
stenl1 вне форума Ответить с цитированием
Старый 23.11.2011, 20:44   #3
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Я знаю, как использовать модификаторы доступа, я не совсем понимаю зачем?
Furchtlos вне форума Ответить с цитированием
Старый 23.11.2011, 20:52   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Furchtlos Посмотреть сообщение
Я знаю, как использовать модификаторы доступа, я не совсем понимаю зачем?
Представьте себе, что у вас есть рабочий стол. В нем хранятся всякие нужные вам книги, документы, записки, вещи, которые другие не должны видеть. И, вот, в один прекрасный день вы открываете свой стол, а там все перерыто, вы не можете на привычном месте найти то, что вам сейчас срочно требуется. Какая ваша будет реакция?!

Вот, точно также и в программировании. Есть данные, которые вы позволяете всем видеть и пользоваться. Например, на вашем столе есть открытая коробка леденцев, и любой, проходящий мимо вас, может угоститься леденцами.

Есть данные, которыми могут видеть и пользоваться ваши родственники или друзья. Посторонним к этим данным доступ закрыт.

И есть данные, которые вы не хотели бы придавать огласке даже вашим родственникам и друзьям, то есть что-то ваше интимное.

Вот эти три уровня и определяются спецификаторами доступа.

Открытым кодом может пользоваться любой тдругой код.

Защищенным кодом могут пользоваться только производные классы и друзья.

Закрытым кодом могут пользоваться только друзья, при условии, что вы таких сами определили.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 23.11.2011, 20:54   #5
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Можно пожалуйста, если не трудно простейший пример, как один код может пользоваться открытостью/закрытостью другого.
Furchtlos вне форума Ответить с цитированием
Старый 23.11.2011, 20:56   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Защищенным кодом могут пользоваться только производные классы и друзья.
Да, верно, но на заметку топикстартеру, в C# друзей нет (ну, friend-функций и классов).
Цитата:
Можно пожалуйста, если не трудно простейший пример, как один код может пользоваться открытостью/закрытостью другого.
Ну вот
Код:
#include <iostream>
class MyClass
{
   public:
     MyClass() = default;
     ~MyClass() = default;
    inline void setX(int n) { x = n ; }
    inline void setY(int n) { y = n ; } 
    inline int getX() { return x; }
    inline int getY() { return y; }
   protected:
     int x;
   private:
     int y;
};

class Derived : public MyClass
{
   public:
      Derived() = default;
      ~Derived() = default;
      inline void showX() { std::cout << x << "\n"; } 
      // следующая строка неверна, т.к. y - закрытый член класса MyClass
      // inline void showY() { std::cout << y << "\n"; }
};

int main()
{
   int a;
   Derived t;
   std :: cin >> a;
   t.setX(a);
   t.showX();
   return 0;
}
За синтаксическую верность кода не ручаюсь, ибо писал "на коленке", но суть примерно такая.

Последний раз редактировалось _-Re@l-_; 23.11.2011 в 21:02.
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.11.2011, 20:56   #7
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Меня пока-что больше интересует C++, я в C# так для примера нашел на вики.
Furchtlos вне форума Ответить с цитированием
Старый 23.11.2011, 21:02   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Обновил предыдущий пост, посмотрите на пример кода.
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.11.2011, 21:11   #9
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Получается, что класс Derived является наследником MyClass, и может использовать защищенную переменную x. Ну ок тут все понятно кроме слова "inline", а также для чего нужно писать конструктор/дуструктор = default? И опять-же, в чем была-бы разница, если бы мы не писати геттеры и сеттеры? Мы бы не смогли установить значение "y"? Но зачем тогда мы его скрывали, если можем его получить и изменить методами setY,getY?
Furchtlos вне форума Ответить с цитированием
Старый 23.11.2011, 21:14   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

inline обозначает, что данная функция вместо вызова будет встроена в место, где она вызывается.
Цитата:
акже для чего нужно писать конструктор/дуструктор = default
А, это уже из стандарта С++'09. Данные конструкции создают конструктор и деструктор по умолчанию.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Негативные анекдоты про Россию и про всё в ней происходящее... Ваше мнение? Вадим Мошев Свободное общение 16 26.09.2011 08:02
.net c# про инкапсуляцию flcl Помощь студентам 2 24.02.2011 11:42
[Turbo Pascal] - задачи про подбрасывание монеты и про определение истины. Sent Tools Помощь студентам 10 28.10.2010 18:11
Вопрос про Свойство Visible и про иконки в imagelist Kappi4 Компоненты Delphi 2 21.05.2010 13:10
У меня вопрос про базы данных,а точнее про таблицы!!! Alexij Общие вопросы Delphi 1 13.04.2008 23:24