Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
1

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

01.09.2011, 20:38. Показов 2004. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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 Что еще вспомню, допишу.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2011, 20:38
Ответы с готовыми решениями:

Вопросы накопились
Вопросов всего три. 1. У меня такое впечатление, что 1ps.ru ночью пошустрее работает и ошибок...

Вопросы накопились
В виду отсутствия времени всё никак не могу начать браться за новые проекты. Уже как год имею всего...

Тест,примеры по разным темам
Тот,кто зальет решение будет большой молодец. Задание на форум в текстовом формате.

Несколько программ по разным темам
Помогите решить несколько задач (мне нужно очень срочно один не справлюсь) повательность...

21
101 / 101 / 27
Регистрация: 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};
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
01.09.2011, 20:55  [ТС] 3
Все равно не понимаю почему в языке С++ существуют и структуры и классы. Тем более, если оказывается, что и у структур есть наследование, полиморфизм и т.д. и т.п.
Но в отличии от класса структуру(если она не имеет конструкторов) можно инициализировать как массив.
Это все основные различия?

Вот еще вопрос:
В книге Дейтейлов "Как программировать на С++" в классе сперва пишут public, потом protected, потом private. А вот на этом форуме наоборот. Как правильно то?
0
101 / 101 / 27
Регистрация: 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;
Какой из способов лучше?
Первый способ следует использовать только в начале изучения языка.
А вот дальнейший выбор зависит от размера программы. Для большой программы лучше использовать второй, а для маленькой третий
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
01.09.2011, 21:04  [ТС] 5
Цитата Сообщение от Overmind024 Посмотреть сообщение
А вот дальнейший выбор зависит от размера программы. Для большой программы лучше использовать второй, а для маленькой третий
Т.е. в больших проектах замучаешься дописывать к каждому cin и cout std, поэтому using std::cin/cout предпочтителен. Это насчет написания кода, а как насчет других различиях? Почему для маленьких лучше третий? Чем он лучше, чем второй?
0
101 / 101 / 27
Регистрация: 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)Инкапсуляция - это всего лишь скрытие реализации класса от клиентов, т.е. программистов, использующих этот класс? Скрытие реализации для того, что бы код клиентов не зависил от реализации, т.е. они должны знать только интерфейс класса(какие есть методы и что они делают)?
Именно.
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
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};
1
101 / 101 / 27
Регистрация: 10.09.2010
Сообщений: 267
01.09.2011, 21:17 8
Цитата Сообщение от Chelioss Посмотреть сообщение
Если все правильно я сказал, то можно передавать методам явно указатель, т.е
Почитай про указатель на метод класса.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
01.09.2011, 21:19  [ТС] 9
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Отличие от struct и class - только в одном: в struct все открыто по умолчанию, а в classe - все закрыто. В остальном они совершенно одинаковы.
И все? Т.е., например, я могу взять простенький класс и вместо class написать struct, при этом помня про различие класса и структуры?

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

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

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

Класс служит для разделения зон ответственности по коду. И идеологически является модулем - инвариантной целостной логической единицей, с данными, и методами для обработки этих данных. Имхо.
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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 с английского можно перевести и как "член", и как "элемент", и ещё много как. Поэтому это не корявый перевод, а скорее просто ещё не до конца сформировавшаяся терминология в русском языке.

Вот так))
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
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-класс может иметь:
• статические члены данных;
• невиртуальные функции-члены;
• вложенные типы.

Простые классы ведут себя как сишные данные, т.е. их можно инициализировать
инициализаторами в фигурных скобках, а если они объявлены глобально или
в пространстве имен без инициализации, то все их члены-данные
инициализируются нулевыми значениями.
Для классов С++ в этом случае вызываются конструкторы по умолчанию.
5
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
02.09.2011, 08:21 13
Mr.X, спасибо за уточнения. Но новичку пока такие дебри - плохо понятны...
0
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
02.09.2011, 10:28 14
Цитата Сообщение от Chelioss Посмотреть сообщение
3) В объекте класса( в представителе класса ) есть указатель this, указывающий на этот объект.
Методы класса получают неявно этот указатель.
Как написали, объект класса не хранит указатель на себя. И вообще, ИМХО программист C++ не должен делать таких предположений, конечно хорошо, что он знает о thiscall и разных тонкостях. Главное, не стоит ничего делать на основании предположений о реализации компилятора(если вы не разработчик под виндуз). В стандарте языка нет ничего про соглашения вызовов, реализация может быть различна.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
02.09.2011, 19:02  [ТС] 15
Еще вопрос:
Модификатор const у методов означает, что нельзя модифицировать только данные класса? Или вообще никакие данные нельзя модифицировать?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.09.2011, 19:26 16
Chelioss, нет, только данные класса.
1
Заблокирован
02.09.2011, 19:38 17
Цитата Сообщение от Chelioss Посмотреть сообщение
Модификатор const у методов означает, что нельзя модифицировать только данные класса?
mutable данные изменять можно. Так к сведенью, не рекомендация применять его
1
13 / 13 / 2
Регистрация: 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;    //Само собой можно
    }
};
1
Заблокирован
02.09.2011, 20:42 19
Цитата Сообщение от Chelioss Посмотреть сообщение
Все равно не понимаю почему в языке С++ существуют и структуры и классы. Тем более, если оказывается, что и у структур есть наследование, полиморфизм и т.д. и т.п.

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

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

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

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

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

А какой смысл тогда было делать Страуструпу классы, если можно было всего лишь одной свойство в структурах изменить и было бы как классы?
Страуструп не мог изменить одно свойство, так как, как я уже сказал, его первый "компилятор" был просто препроцессором над С. В то время структуры не имели таких свойств класса, как сейчас. Поэтому ему нужно было как-то различать стандартные структуры языка С и свои нововведения, которые он наделял новыми свойствами, чтобы другие программисты не путались.
1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
02.09.2011, 20:43  [ТС] 20
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается спецификаторов доступа, то их можно размещать в любом порядке и в любом количестве. Единственное, чем руководствуются, это читабельностью кода.
Я читабельность кода и имел ввиду. Везде, где я видел, сперва пишут private, потом protected, дальше public. В книге наоборот.
В плане читабельности какой вариант лучше?
0
02.09.2011, 20:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2011, 20:43
Помогаю со студенческими работами здесь

Написать 20 слов разным цветом с разным расположением
Нужно в паскале написать 20 слов например cyberforum что бы это слово было разным цветом + слова...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6...

Информация по темам билетов
Всем доброго времени суток. Готовлюсь к сессии, все шло хорошо, но тут увидел несколько билетов...

Тесты по данным темам
Добрый день, помогите, пожалуйста, подобрать тесты по темам, ниже я предоставлю!Может у кого в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru