forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   public static и т.д. (http://forum.boolean.name/showthread.php?t=17224)

Okay 24.08.2012 00:23

public static и т.д.
 
Привет всем.
Недавно начала изучать c++ и не понял что такое public, static и т.д.
Вообще для чего они и что выполняют?

jimon 24.08.2012 00:51

Ответ: public static и т.д.
 
public, protected, private - определяют область доступности полей и методов класса

Код:

class A
{
public:
        int x;
protected:
        int y;
private:
        int z;
};

void foo()
{
        A bar;
        int x = bar.x; // можно получить
        int y = bar.y; // нельзя получить
        int z = bar.z; // нельзя получить
}

class B : public A
{
        // x становится public
        // y становится protected
        // z становится не доступным из B
};

class C : protected A
{
    // x становится protected
    // y становится protected
    // z становится не доступным из C
};

class D : private A
{
    // x становится private
    // y становится private
    // z становится не доступным из D
};

class E : private A
{
    // x не доступен из E
    // y не доступен из E
    // z не доступен из E
};

static в зависимости от места использования или делает поле общим для всех объектов, или организовывает возможность существования переменной когда она выходит из поле видимости или интересные вещи с функциями :)

Okay 24.08.2012 00:59

Ответ: public static и т.д.
 
Спасибо, взял что-то в голову.
Но не пойму чем помешает всегда иметь public?

Gector 24.08.2012 01:17

Ответ: public static и т.д.
 
Цитата:

Сообщение от Okay (Сообщение 237104)
Спасибо, взял что-то в голову.
Но не пойму чем помешает всегда иметь public?

Доступ быстрее.

jimon 24.08.2012 01:23

Ответ: public static и т.д.
 
Цитата:

Сообщение от Okay (Сообщение 237104)
Спасибо, взял что-то в голову.
Но не пойму чем помешает всегда иметь public?

инкапсуляция - идея в том что объект это черный ящик и детали реализации скрыты от пользователя, вот для неё protected и private нужен

ps. в struct по умолчанию public

Mr_F_ 24.08.2012 01:43

Ответ: public static и т.д.
 
Цитата:

Но не пойму чем помешает всегда иметь public?
имей.
больше всего бесило когда тебе надо быстро успеть что-то переделать в проге, но для этого внезапно требуется доступ к данным, которые были в давние-давние времена в давних-давних классах, от которых всё зависит, помечены как private/protected, в результате приходилось тупо ждать рекомпила минутами.
нафиг эти игры в чёрные ящики и сокрытие чего-то от самого себя, слава struct.
да и куда детали реализации скрыты, если они все равно указаны в хидере и все равно будут выскакивать через intellisense? в каком-нибудь вижуал ассисте можно вроде настроить чтоб не выскакивали, но за такие игры с самим собой при участии платных тулз можно вообще премию почётного кретина выдать.

HolyDel 24.08.2012 02:05

Ответ: public static и т.д.
 
лучше пару минут подождать рекомпил, чем выискивать неделями баги из-за недостаточной инкапсуляции.

Mr_F_ 24.08.2012 02:20

Ответ: public static и т.д.
 
Цитата:

баги из-за недостаточной инкапсуляции
пример?

HolyDel 24.08.2012 02:37

Ответ: public static и т.д.
 
Цитата:

пример?
в личной жизни не сталкивался, ибо у меня как провило все переинкапсулированно.

pax 24.08.2012 08:02

Ответ: public static и т.д.
 
Цитата:

Сообщение от Mr_F_ (Сообщение 237107)
имей.
больше всего бесило когда тебе надо быстро успеть что-то переделать в проге, но для этого внезапно требуется доступ к данным, которые были в давние-давние времена в давних-давних классах, от которых всё зависит, помечены как private/protected, в результате приходилось тупо ждать рекомпила минутами.

Как же хорошо что в C# есть internal, причем можно дать доступ к интерналам для другой сборки :)

Mhyhr 24.08.2012 11:18

Ответ: public static и т.д.
 
Цитата:

Сообщение от pax (Сообщение 237116)

Как же хорошо что в C# есть internal, причем можно дать доступ к интерналам для другой сборки :)

Эм.. Похоже на аналог friend в с++

pax 24.08.2012 11:44

Ответ: public static и т.д.
 
В С++ friend вроде только для своих классов, а в Net можно определять дружественные сборки. Т.е. доступ к internal типам/членам одной dll из другой.

falcon 26.08.2012 04:42

Ответ: public static и т.д.
 
Mr_F_ у меня на работе весь проект по **зде пошёл, из-за подобных мыслей)
если состояние объекта (данные) необходимо менять\получать в каком-то левом модуле - вероятнее всего ты что-то делаешь не так.

у нас, как следствие использования public везде, невозможно вычислить какого хрена где и почему какой-то баран, в своё время, решил поменять состояние объекта. В итоге выплывает куча багов, которые хрен отследишь. Система ТАК завязана на внутренней реализации каждого отдельного объекта, что уследить происходящее с каждым из них в любой момент времени - невероятный ад. А уж попытаться использовать функционал повторно или пытаться его расширить - мысли граничащие с фантастикой.
Так что не стоит пренебрегать инкапсуляцией.

Mr_F_ 26.08.2012 13:23

Ответ: public static и т.д.
 
Согласен, что это может быть необходимо, если над проектом работает больше одного человека. Если пишешь чисто сам - тогда не думаю.
Ну и я в принципе не хочу писать тру ООП код, так что не собираюсь плодить и великие множества классов.


Часовой пояс GMT +4, время: 16:28.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot