Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
pcmax
158 / 23 / 5
Регистрация: 29.01.2018
Сообщений: 717
1

Вложенные классы, пространство имен и инициализация конструктора

05.02.2019, 16:52. Просмотров 350. Ответов 8
Метки нет (Все метки)

ребята, висят эти вопросы. я гуглил. толку мало.


объясните пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
class foo{
int a;
int b;
 
class fo{
// объясните пожалуйста суть вложенных классов. они нужны только для того, чтобы не заграмождать пространство имен?
то есть, как понял, у класса fo теперь будет имя foo::fo  и само имя fo можно будет использовать еще раз. правильно? или тут другая суть?
};
};
 
int main(int argc, char* argv[]){
 
foo obj(11);
foo ob{11}; // объясните пожалуйста в чем разница между этой записью и записью выше.  не игнорьте 
}
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2019, 16:52
Ответы с готовыми решениями:

пространство имен
Один практикующий программист сказал мне, что пространство именusing namespace std; нежелательно...

Пространство имен
Подскажите, пожалуйста. Если я создам своё пространство имен и в нем создам функцию, например,...

Пространство имен
Зачем пространство имен в программировании я чет не понимаю? У мну в учебнике отак написано....

пространство имен
Здравствуйте! У меня вопрос...В си есть такая функция printf, которая аналогична функции С++...

Пространство имен
Я часто встречаю в книгах, туторах, что объявлять пространство имен в больших проектах нельзя(не...

8
Azazel-San
Mental handicap
1059 / 534 / 151
Регистрация: 24.11.2015
Сообщений: 2,178
Завершенные тесты: 1
05.02.2019, 17:22 2
Цитата Сообщение от pcmax Посмотреть сообщение
C++
1
2
foo obj(11);
foo ob{11}; // объясните пожалуйста в чем разница между этой записью и записью выше. *не игнорьте
http://eel.is/c++draft/dcl.init.list
Цитата Сообщение от pcmax Посмотреть сообщение
суть вложенных классов
В ключе их сути, всякие дизайн фичи. Их не используют просто так, впрочем так можно сказать о любом функционале языка и это отчасти будет так. Ну, например, что бы спрятать детали имплементации и делают вложенный класс, но далеко не только.
1
pcmax
158 / 23 / 5
Регистрация: 29.01.2018
Сообщений: 717
05.02.2019, 18:28  [ТС] 3
что-то после прочтения не дошло до меня про скобки к сожалению
0
Azazel-San
Mental handicap
1059 / 534 / 151
Регистрация: 24.11.2015
Сообщений: 2,178
Завершенные тесты: 1
05.02.2019, 18:55 4
Цитата Сообщение от pcmax Посмотреть сообщение
что-то после прочтения не дошло до меня про скобки к сожалению
Ну, это весьма сложная тема для новичка, думаю стоит пару раз прочесть об этом.
Из такого главного, можно определить то что list initialization не разрешает narrowing, если переводить то не разрешает приведения типов (это не совсем так, но и это тоже), если дословно, то не разрешает усечения, что весьма удобно, пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo(double dval, int ival) {
 
    int x2 = dval; // если dval=7.9, то х2 стает 7 (плохо) мы потеряли дробную часть
 
    char c2 = ival; // если ival=1025, c2 стает 1 (плохо)
 
    int x3{dval}; // тут уже будет ошибка (это хорошо)
 
    char c3{ival}; // и тут будет ошибка
 
    int x4{2.0}; // ошибка (хорошо)
}
Добавлено через 7 минут
С классами так же можно
C++
1
2
3
4
5
6
7
8
9
10
struct IntegerObject { 
    IntegerObject(int const x) noexcept : x_(x) {}
private:
    int x_; 
};
 
int main() {
    IntegerObject iobj1(3.14); // OK
    IntegerObject iobj2{3.14}; // error
}
Добавлено через 5 минут
Но это только лишь одна из довольно многих причин почему лучше стоит (или удобнее и проще) использовать инициализацию скобками.
0
05.02.2019, 18:55
pcmax
158 / 23 / 5
Регистрация: 29.01.2018
Сообщений: 717
05.02.2019, 21:22  [ТС] 5
а это как-то связанно с конструктором, () вызов контсруктора, {} явное присвоение без него.
или это бред?
0
Azazel-San
Mental handicap
1059 / 534 / 151
Регистрация: 24.11.2015
Сообщений: 2,178
Завершенные тесты: 1
05.02.2019, 21:37 6
Цитата Сообщение от pcmax Посмотреть сообщение
{} явное присвоение без него
Как это без него?.. Я же говорю
Цитата Сообщение от Azazel-San Посмотреть сообщение
это весьма сложная тема для новичка, думаю стоит пару раз прочесть об этом.
1
pcmax
158 / 23 / 5
Регистрация: 29.01.2018
Сообщений: 717
06.02.2019, 13:53  [ТС] 7
хорошо
0
politoto
1537 / 195 / 20
Регистрация: 23.07.2018
Сообщений: 444
07.02.2019, 16:19 8
Присваивание - это изменение состояния уже сконструированного объекта.
Начальное состояние объекта формируют различные конструкторы.

Добавлено через 8 минут
C++
1
2
3
foo obje;
foo obj(11);
foo ob{11,};
Если бы класс foo был контейнером, я бы ожидал, что
obje - пустой контейнер,
obj1 - контейнер с 11 элементами,
ob - контейнер с одним элементом(11)
1
pcmax
158 / 23 / 5
Регистрация: 29.01.2018
Сообщений: 717
07.02.2019, 16:49  [ТС] 9
интересно

спасибо
0
07.02.2019, 16:49
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2019, 16:49

Пространство имен
Здравствуйте, имеется код : triangle.h #ifndef TRIANGLE_H_INCLUDED #define...

Пространство имен
Как составить код, когда необходимо использовать классы и методы из разных пространств имен. К...

Пространство имен std
Какой стиль лучше ? using std::cout; using std::endl; or using namespace std;


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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