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

Накопились вопросы по разным темам. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
01.09.2011, 20:38     Накопились вопросы по разным темам. #1
1) операция :: - это операция разрешения области действия или области видимости?
2) Чем отличается структура от класса? У структуры и у класса есть данные и функции. Да, у классов есть наследование, полиморфизм, инкапсуляция и т.д и т.п.. Это все?
Судя по моим малым знаниям, мне кажется, что структуру всегда можно заменить классом. Что такого есть в структуре, что нет у класса?
3) В объекте класса( в представителе класса ) есть указатель this, указывающий на этот объект.
Методы класса получают неявно этот указатель.
Допустим есть метод:
C++
1
void fun();
Тогда если раскрыть эту "неявность", то получится это?
C++
1
void fun( SomeClass *this );
А если есть метод:
C++
1
void fun1( int );
То будет так?
C++
1
void fun1( SomeClass *this, int );
Если все правильно я сказал, то можно передавать методам явно указатель, т.е
C++
1
void fun( SomeClass *this );
и
C++
1
void fun1( SomeClass *this, int );
?
4)Указатель this находится в объекте, тогда
допустим есть класс
C++
1
2
3
4
5
class SomeClass
{
public: int a;
private: int b;
};
тогда если раскрыть всю "неявность" указателя this, то будет так?
C++
1
2
3
4
5
6
7
допустим есть класс
class SomeClass
{
public: int a;
private: int b;
           const SomeClass *this;
};
5) Для того, чтобы использовать объекты cout,cin, надо "использовать пространство имен std"
Я знаю три способа:
- using namespace std; // самый простой
- using std::cout; using std::cin;
- непосредственно писать во всем коде перед cout и cin std::, т.е.
std::cin >> a;
std::cout << a;
Какой из способов лучше?

6)Инкапсуляция - это всего лишь скрытие реализации класса от клиентов, т.е. программистов, использующих этот класс? Скрытие реализации для того, что бы код клиентов не зависил от реализации, т.е. они должны знать только интерфейс класса(какие есть методы и что они делают)?

7) Функции в классах называют методами или по другому члены-функции.
Я читаю Дейтелов "Как программировать на С++".
В книгу везде пишут элемент данные и элементы функции, вместо членов класса и методов(членов функций). Может это корявый перевод на русский?
Просто такие термины я вижу только в этой книге.

PS Что еще вспомню, допишу.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
01.09.2011, 20:53     Накопились вопросы по разным темам. #2
Цитата Сообщение от Chelioss Посмотреть сообщение
2) Чем отличается структура от класса? У структуры и у класса есть данные и функции. Да, у классов есть наследование, полиморфизм, инкапсуляция и т.д и т.п.. Это все?
Судя по моим малым знаниям, мне кажется, что структуру всегда можно заменить классом. Что такого есть в структуре, что нет у класса?
По умолчанию все методы класса private, а структуры public. У структуры тоже есть наследование, полиморфизм, инкапсуляция. Но в отличии от класса структуру(если она не имеет конструкторов) можно инициализировать как массив.
C++
1
2
3
4
5
stuct my
{
...
};
my a = {"Vasya",12,"Kolya",15};
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
01.09.2011, 20:55  [ТС]     Накопились вопросы по разным темам. #3
Все равно не понимаю почему в языке С++ существуют и структуры и классы. Тем более, если оказывается, что и у структур есть наследование, полиморфизм и т.д. и т.п.
Но в отличии от класса структуру(если она не имеет конструкторов) можно инициализировать как массив.
Это все основные различия?

Вот еще вопрос:
В книге Дейтейлов "Как программировать на С++" в классе сперва пишут public, потом protected, потом private. А вот на этом форуме наоборот. Как правильно то?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
01.09.2011, 21:00     Накопились вопросы по разным темам. #4
Цитата Сообщение от Chelioss Посмотреть сообщение
5) Для того, чтобы использовать объекты cout,cin, надо "использовать пространство имен std"
Я знаю три способа:
- using namespace std; // самый простой
- using std::cout; using std::cin;
- непосредственно писать во всем коде перед cout и cin std::, т.е.
std::cin >> a;
std::cout << a;
Какой из способов лучше?
Первый способ следует использовать только в начале изучения языка.
А вот дальнейший выбор зависит от размера программы. Для большой программы лучше использовать второй, а для маленькой третий
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
01.09.2011, 21:04  [ТС]     Накопились вопросы по разным темам. #5
Цитата Сообщение от Overmind024 Посмотреть сообщение
А вот дальнейший выбор зависит от размера программы. Для большой программы лучше использовать второй, а для маленькой третий
Т.е. в больших проектах замучаешься дописывать к каждому cin и cout std, поэтому using std::cin/cout предпочтителен. Это насчет написания кода, а как насчет других различиях? Почему для маленьких лучше третий? Чем он лучше, чем второй?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
01.09.2011, 21:13     Накопились вопросы по разным темам. #6
Цитата Сообщение от Chelioss Посмотреть сообщение
В книге Дейтейлов "Как программировать на С++" в классе сперва пишут public, потом protected, потом private. А вот на этом форуме наоборот. Как правильно то?
Нет правильного способа. Это зависит только от стиля программиста. Например некоторые вобше в классе не пишут private, а в начале класса до слова public объявляют приват методы.

Добавлено через 4 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение
Т.е. в больших проектах замучаешься дописывать к каждому cin и cout std, поэтому using std::cin/cout предпочтителен. Это насчет написания кода, а как насчет других различиях? Почему для маленьких лучше третий? Чем он лучше, чем второй?
Ну если ты используешь только cout,cin и endl то второй конечно легче но если же ты работаешь с библиотекой STL то подключать каждый алгоритм, фун. объект слишком нудно, лучше явно указывать пространство имен.

Добавлено через 2 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение
6)Инкапсуляция - это всего лишь скрытие реализации класса от клиентов, т.е. программистов, использующих этот класс? Скрытие реализации для того, что бы код клиентов не зависил от реализации, т.е. они должны знать только интерфейс класса(какие есть методы и что они делают)?
Именно.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.09.2011, 21:13     Накопились вопросы по разным темам. #7
Цитата Сообщение от Chelioss Посмотреть сообщение
Все равно не понимаю почему в языке С++ существуют и структуры и классы. Тем более, если оказывается, что и у структур есть наследование, полиморфизм и т.д. и т.п.
Структуры достались С++ по наследству от С. Страуструп сделал их в С++ классами. Отличие от strucn и class - только в одном: в struct все открыто по умолчанию, а в classe - все закрыто. В остальном они совершенно одинаковы.
Объект класса тоже можно явно инициализировать - как и для структур:
C++
1
2
3
4
claas D
{ public: int a; double b; 
};
D d = {1, 2.4};
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
01.09.2011, 21:17     Накопились вопросы по разным темам. #8
Цитата Сообщение от Chelioss Посмотреть сообщение
Если все правильно я сказал, то можно передавать методам явно указатель, т.е
Почитай про указатель на метод класса.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
01.09.2011, 21:19  [ТС]     Накопились вопросы по разным темам. #9
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Отличие от struct и class - только в одном: в struct все открыто по умолчанию, а в classe - все закрыто. В остальном они совершенно одинаковы.
И все? Т.е., например, я могу взять простенький класс и вместо class написать struct, при этом помня про различие класса и структуры?

А какой смысл тогда было делать Страуструпу классы, если можно было всего лишь одной свойство в структурах изменить и было бы как классы?
Bers
Заблокирован
01.09.2011, 21:32     Накопились вопросы по разным темам. #10
Цитата Сообщение от Chelioss Посмотреть сообщение
А какой смысл тогда было делать Страуструпу классы, если можно было всего лишь одной свойство в структурах изменить и было бы как классы?
Есть подозрение, что из идейных соображений.
Что бы подчеркнуть, что класс - это именно класс.

Идеологически, структуры и классы существуют для разных целей.

Структура - просто объединение данных, для более удобного хранения.
Как правило, содержит только POD-объекты, и не содержит методов.
Полностью открытая.

Класс служит для разделения зон ответственности по коду. И идеологически является модулем - инвариантной целостной логической единицей, с данными, и методами для обработки этих данных. Имхо.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.09.2011, 21:56     Накопились вопросы по разным темам. #11
Поскольку ответы тут разрозненные, попробую собрать всё воедино. Собирать буду не в буквальном смысле, отвечать буду сам, поэтому если повторюсь, извините)) Начинаем.

Цитата Сообщение от Chelioss Посмотреть сообщение
1) операция :: - это операция разрешения области действия или области видимости?
Называют и так, и так. Оригинальное название - scope, дословный перевод (гугл) - область действия, область видимости. Так что, действительно, и так, и сяк))

Цитата Сообщение от Chelioss Посмотреть сообщение
2) Чем отличается структура от класса? У структуры и у класса есть данные и функции. Да, у классов есть наследование, полиморфизм, инкапсуляция и т.д и т.п.. Это все?
Судя по моим малым знаниям, мне кажется, что структуру всегда можно заменить классом. Что такого есть в структуре, что нет у класса?
Как уже сказали, структура от класса отличается только тем, что по умолчанию в ней все члены - public, тогда как в классе - private. Всё, больше никаких различий. Структуры в С++ оставили для совместимости с тоннами кода, написанного на С. Ключевое слово class добавили по идеологическим соображениям, всё-таки на ООП замахнулись, а там без термина "класс" скучновато))

Цитата Сообщение от Chelioss Посмотреть сообщение
В объекте класса( в представителе класса ) есть указатель this, указывающий на этот объект.
Методы класса получают неявно этот указатель.
Допустим есть метод:
C++
1
void fun();
Тогда если раскрыть эту "неявность", то получится это?
C++
1
void fun( SomeClass *this );
А если есть метод:
C++
1
void fun1( int );
То будет так?
C++
1
void fun1( SomeClass *this, int );
Если все правильно я сказал, то можно передавать методам явно указатель, т.е
C++
1
void fun( SomeClass *this );
и
C++
1
void fun1( SomeClass *this, int );
?
В объекте класса нет указателя this. Метод при вызове получает указатель на член класса, для объекта которого его вызвали. Как преобразует компилятор вызов метода (ставит указатель на объект в начале, в конце или как ещё) - дело компилятора (насколько мне известно, в стандарте про это не написано. Если ошибаюсь - прошу поправить). Однако явно объявлять метод с таким "дополнительным" параметром и явно передавать указатель на объект в метод - ошибка, так как компилятор всё равно сам попытается передать скрытый параметр, а в этом случае произойдёт ошибка компиляции, поскольку компилятор не сможет найти метод с такой сигнатурой, как его пытаются вызвать (с одним неявным параметром и одним явным, который лишний).

Цитата Сообщение от Chelioss Посмотреть сообщение
4)Указатель this находится в объекте, тогда
допустим есть класс
C++
1
2
3
4
5
class SomeClass
{
public: int a;
private: int b;
};
тогда если раскрыть всю "неявность" указателя this, то будет так?
допустим есть класс
C++
1
2
3
4
5
6
class SomeClass
{
public: int a;
private: int b;
 const SomeClass *this;
};
Нет, как я уже сказал, класс не хранит указатель на себя, какой смысл? Вызов
C++
1
some_class.some_method();
будет преобразован в
C++
1
some_method(&some_class);
Как видно, адрес получить проще простого, так зачем его ещё и хранить?

Цитата Сообщение от Chelioss Посмотреть сообщение
5) Для того, чтобы использовать объекты cout,cin, надо "использовать пространство имен std"
Я знаю три способа:
- using namespace std; // самый простой
- using std::cout; using std::cin;
- непосредственно писать во всем коде перед cout и cin std::, т.е.
std::cin >> a;
std::cout << a;
Какой из способов лучше?
На этот счёт существуют тонны холиваров. Мой аргумент против первого способа: пространства имён вводили не за тем, чтобы в первых 3-5 строках программы любой желающий мог отменить его.
Против второго способа в принципе ничего не имею, но и он может оказаться источником ошибок, когда используются несколько библиотек, и хотя бы в двух из них есть классы с одинаковыми именами. Если в одном заголовочном файле мы отменим пространство имён объекта из одной либы, а в другом файле - из другой, и подключим оба заголовка к одному модулю - код не скомпилируется.
Лично я всегда использую третий способ, каким бы обширным не был проект.

Цитата Сообщение от Chelioss Посмотреть сообщение
6)Инкапсуляция - это всего лишь скрытие реализации класса от клиентов, т.е. программистов, использующих этот класс? Скрытие реализации для того, что бы код клиентов не зависил от реализации, т.е. они должны знать только интерфейс класса(какие есть методы и что они делают)?
Да.

Цитата Сообщение от Chelioss Посмотреть сообщение
7) Функции в классах называют методами или по другому члены-функции.
Я читаю Дейтелов "Как программировать на С++".
В книгу везде пишут элемент данные и элементы функции, вместо членов класса и методов(членов функций). Может это корявый перевод на русский?
Просто такие термины я вижу только в этой книге.
В ООП (в отрыве от языков) это называют "поля" и "методы". В С++ часто применяются термины "члены-данные" и "члены-функции".
Member с английского можно перевести и как "член", и как "элемент", и ещё много как. Поэтому это не корявый перевод, а скорее просто ещё не до конца сформировавшаяся терминология в русском языке.

Вот так))
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
01.09.2011, 23:17     Накопились вопросы по разным темам. #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Отличие от strucn и class - только в одном: в struct все открыто по умолчанию, а в classe - все закрыто. В остальном они совершенно одинаковы.
На самом деле есть еще одно отличие:
C++
1
2
class A : B
{};
на самом деле означает
C++
1
2
class A : private B
{};
а
C++
1
2
struct A : B
{};
на самом деле означает
C++
1
2
struct A : public B
{};
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Объект класса тоже можно явно инициализировать - как и для структур:
C++
1
2
3
4
claas D
{ public: int a; double b; 
};
D d = {1, 2.4};
И для класса, и для структуры, и для объединения (тут это без разницы)
это возможно, только если они являются POD-классом (объединение всегда POD),
т.е. простым классом (объединением).
На самом деле различия между классом и простым классом гораздо существеннее,
чем между классом и структурой (которых всего два).
Простой класс – это аналог записи в других языках, а класс – это класс для ООП.
Грубо, простой класс – это аналог сишной структуры, хотя ему разрешается иметь
функции-члены и кое-что еще.
По стандарту простой класс не может обладать:
• определенными пользователем конструктором, деструктором и оператором
копирующего присваивания;
• виртуальными функциями;
• базовыми классами;
• закрытыми и защищенными нестатическими членами;
• нестатическими членами данных, являющимися ссылками.

Помимо этого, все нестатические члены данных должны относиться к POD-типам –
фундаментальным типам, типам-перечислениям, POD-классам и объединениям,
указателям на POD-типы и массивам из POD-элементов.
В отличие от структур языка C, POD-класс может иметь:
• статические члены данных;
• невиртуальные функции-члены;
• вложенные типы.

Простые классы ведут себя как сишные данные, т.е. их можно инициализировать
инициализаторами в фигурных скобках, а если они объявлены глобально или
в пространстве имен без инициализации, то все их члены-данные
инициализируются нулевыми значениями.
Для классов С++ в этом случае вызываются конструкторы по умолчанию.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
02.09.2011, 08:21     Накопились вопросы по разным темам. #13
Mr.X, спасибо за уточнения. Но новичку пока такие дебри - плохо понятны...
Alex1234
 Аватар для Alex1234
12 / 12 / 0
Регистрация: 11.02.2011
Сообщений: 55
02.09.2011, 10:28     Накопились вопросы по разным темам. #14
Цитата Сообщение от Chelioss Посмотреть сообщение
3) В объекте класса( в представителе класса ) есть указатель this, указывающий на этот объект.
Методы класса получают неявно этот указатель.
Как написали, объект класса не хранит указатель на себя. И вообще, ИМХО программист C++ не должен делать таких предположений, конечно хорошо, что он знает о thiscall и разных тонкостях. Главное, не стоит ничего делать на основании предположений о реализации компилятора(если вы не разработчик под виндуз). В стандарте языка нет ничего про соглашения вызовов, реализация может быть различна.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.09.2011, 19:02  [ТС]     Накопились вопросы по разным темам. #15
Еще вопрос:
Модификатор const у методов означает, что нельзя модифицировать только данные класса? Или вообще никакие данные нельзя модифицировать?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.09.2011, 19:26     Накопились вопросы по разным темам. #16
Chelioss, нет, только данные класса.
LosAngeles
Заблокирован
02.09.2011, 19:38     Накопились вопросы по разным темам. #17
Цитата Сообщение от Chelioss Посмотреть сообщение
Модификатор const у методов означает, что нельзя модифицировать только данные класса?
mutable данные изменять можно. Так к сведенью, не рекомендация применять его
Alex1234
 Аватар для Alex1234
12 / 12 / 0
Регистрация: 11.02.2011
Сообщений: 55
02.09.2011, 19:49     Накопились вопросы по разным темам. #18
Если голова способна принять еще информации, обрати внимание на следующие:
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
class A
{
    int x;
    int *y;
    int &z;
    mutable int m;
public:
    A(): z(x)
    {
        y = new int;
    }
 
    ~A()
    {
        delete y;
    }
 
    void func() const
    {
        //x = 5;  //Низя!
        *y = 5;   //Можно
        z = 5;    //Тоже можно
        m = 5;    //Само собой можно
    }
};
Сыроежка
Заблокирован
02.09.2011, 20:42     Накопились вопросы по разным темам. #19
Цитата Сообщение от Chelioss Посмотреть сообщение
Все равно не понимаю почему в языке С++ существуют и структуры и классы. Тем более, если оказывается, что и у структур есть наследование, полиморфизм и т.д. и т.п.

Это все основные различия?

Вот еще вопрос:
В книге Дейтейлов "Как программировать на С++" в классе сперва пишут public, потом protected, потом private. А вот на этом форуме наоборот. Как правильно то?
Чтобы было понятно, то надо обратиться к истории языка С++. Он базируется на языке С. В С, как известно, никаких классов нет. Поэтому для реализации классов в С++ в первых версиях использовались структуры. А слово "class" было всего лишь макрокомандой. То есть такого ключевого слова в первых версиях С++ не было. То есть сначала язык С++ был просто препроцессором для С.
Как известно, объектно-ориентированное программирование строится на принципе закрытости реализации. Поэтому по умолчанию у классов их члены имеют спецификатор доступа private. У структур такого нет, так как не забывайте, что нужно обеспечить совместимость с языком С, откуда в С++ пришли структуры. То есть имеет место некоторый дуализм, связаггый с тем, что С++ строится на основе С. С++ должен поддерживать стандартные структуры языка С, а также наделять их новыми качествами. Классы на самом деле также физически реализованы в виде структур.

Что касается спецификаторов доступа, то их можно размещать в любом порядке и в любом количестве. Единственное, чем руководствуются, это читабельностью кода.

Добавлено через 3 минуты
Цитата Сообщение от Overmind024 Посмотреть сообщение
Первый способ следует использовать только в начале изучения языка.
А вот дальнейший выбор зависит от размера программы. Для большой программы лучше использовать второй, а для маленькой третий
Нет, никакого дальнейшего выбора не существует кроме использования квалифицированных имен. Так как если вы используете директиву using SomeName, то вы 1) скрываете такое же имя, которое может быть вам нужно в коде; 2) способствуете возникновению конфликта имен, так как ваше SomeName может заменить другое SomeName, запрятанное где-нибудь далеко в реализации.

Добавлено через 3 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение
И все? Т.е., например, я могу взять простенький класс и вместо class написать struct, при этом помня про различие класса и структуры?

А какой смысл тогда было делать Страуструпу классы, если можно было всего лишь одной свойство в структурах изменить и было бы как классы?
Страуструп не мог изменить одно свойство, так как, как я уже сказал, его первый "компилятор" был просто препроцессором над С. В то время структуры не имели таких свойств класса, как сейчас. Поэтому ему нужно было как-то различать стандартные структуры языка С и свои нововведения, которые он наделял новыми свойствами, чтобы другие программисты не путались.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 20:43     Накопились вопросы по разным темам.
Еще ссылки по теме:

Шаблон функции сортировки массива структур по разным типам полей C++
Конструкторы с разным количеством параметров: найти ошибку в программе C++
C++ Нужно сравнить 2 строки с разным количеством нулей в конце

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

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.09.2011, 20:43  [ТС]     Накопились вопросы по разным темам. #20
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается спецификаторов доступа, то их можно размещать в любом порядке и в любом количестве. Единственное, чем руководствуются, это читабельностью кода.
Я читабельность кода и имел ввиду. Везде, где я видел, сперва пишут private, потом protected, дальше public. В книге наоборот.
В плане читабельности какой вариант лучше?
Yandex
Объявления
02.09.2011, 20:43     Накопились вопросы по разным темам.
Ответ Создать тему
Опции темы

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