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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
#1

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

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

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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2011, 20:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Накопились вопросы по разным темам. (C++):

Найти информацию по темам: - C++
По таким темам: информатика 1. Решение задач с простой переменной на языке C + +. 2. Применение циклов, условных операторов. ...

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

Несколько программ по разным темам - Pascal
Помогите решить несколько задач (мне нужно очень срочно один не справлюсь) повательность A1,A2,..,An состои из нулaей и единиц....

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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,133
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,133
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
Эксперт С++
1040 / 819 / 48
Регистрация: 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};
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
01.09.2011, 21:17 #8
Цитата Сообщение от Chelioss Посмотреть сообщение
Если все правильно я сказал, то можно передавать методам явно указатель, т.е
Почитай про указатель на метод класса.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
01.09.2011, 21:19  [ТС] #9
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Отличие от struct и class - только в одном: в struct все открыто по умолчанию, а в classe - все закрыто. В остальном они совершенно одинаковы.
И все? Т.е., например, я могу взять простенький класс и вместо class написать struct, при этом помня про различие класса и структуры?

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

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

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

Класс служит для разделения зон ответственности по коду. И идеологически является модулем - инвариантной целостной логической единицей, с данными, и методами для обработки этих данных. Имхо.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
Эксперт С++
3049 / 1694 / 265
Регистрация: 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-класс может иметь:
• статические члены данных;
• невиртуальные функции-члены;
• вложенные типы.

Простые классы ведут себя как сишные данные, т.е. их можно инициализировать
инициализаторами в фигурных скобках, а если они объявлены глобально или
в пространстве имен без инициализации, то все их члены-данные
инициализируются нулевыми значениями.
Для классов С++ в этом случае вызываются конструкторы по умолчанию.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
02.09.2011, 08:21 #13
Mr.X, спасибо за уточнения. Но новичку пока такие дебри - плохо понятны...
Alex1234
13 / 13 / 0
Регистрация: 11.02.2011
Сообщений: 55
02.09.2011, 10:28 #14
Цитата Сообщение от Chelioss Посмотреть сообщение
3) В объекте класса( в представителе класса ) есть указатель this, указывающий на этот объект.
Методы класса получают неявно этот указатель.
Как написали, объект класса не хранит указатель на себя. И вообще, ИМХО программист C++ не должен делать таких предположений, конечно хорошо, что он знает о thiscall и разных тонкостях. Главное, не стоит ничего делать на основании предположений о реализации компилятора(если вы не разработчик под виндуз). В стандарте языка нет ничего про соглашения вызовов, реализация может быть различна.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
02.09.2011, 19:02  [ТС] #15
Еще вопрос:
Модификатор const у методов означает, что нельзя модифицировать только данные класса? Или вообще никакие данные нельзя модифицировать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 19:02
Привет! Вот еще темы с ответами:

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

Как осуществить поиск по темам - Visual Basic .NET
Как осуществить поиск тем

MS Access Реализация тестов по просмотренным темам - C++ Builder БД
Я хочу написать программу с тестами. Задача такая: создать область для изучения материала к примеру с перелистыванием страниц на тему...

Выборка записей из таблицы по темам и по условию - MS Access
Всем привет!!! Обращаюсь к корефеям программирования в Access, ПОМОГИТЕ!!! Значит так, имеется база вопросов, причем вопросы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.09.2011, 19:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru