399 / 73 / 7
Регистрация: 29.01.2018
Сообщений: 1,237
1

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

05.02.2019, 16:52. Показов 1809. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2019, 16:52
Ответы с готовыми решениями:

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую...

Вложенные классы и статические вложенные классы - нужен пример
Добрый вечер, форумчане! :) Поделитесь примерами практических задач, при решении которых полезно...

Инициализация конструктора и конструктора родительского класса
Есть два класса: class C1 { public $a; public $b; public $c; function...

Имя типа или пространство имён sess отсутствуют в классе или в пространстве имён user
Привет Написана страничка User в ней: namespace user { public class user :System.tralala {...

8
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
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
399 / 73 / 7
Регистрация: 29.01.2018
Сообщений: 1,237
05.02.2019, 18:28  [ТС] 3
что-то после прочтения не дошло до меня про скобки к сожалению
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
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
399 / 73 / 7
Регистрация: 29.01.2018
Сообщений: 1,237
05.02.2019, 21:22  [ТС] 5
а это как-то связанно с конструктором, () вызов контсруктора, {} явное присвоение без него.
или это бред?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
05.02.2019, 21:37 6
Цитата Сообщение от pcmax Посмотреть сообщение
{} явное присвоение без него
Как это без него?.. Я же говорю
Цитата Сообщение от Azazel-San Посмотреть сообщение
это весьма сложная тема для новичка, думаю стоит пару раз прочесть об этом.
1
399 / 73 / 7
Регистрация: 29.01.2018
Сообщений: 1,237
06.02.2019, 13:53  [ТС] 7
хорошо
0
Модератор
1730 / 841 / 148
Регистрация: 23.07.2018
Сообщений: 2,880
Записей в блоге: 3
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
399 / 73 / 7
Регистрация: 29.01.2018
Сообщений: 1,237
07.02.2019, 16:49  [ТС] 9
интересно

спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2019, 16:49
Помогаю со студенческими работами здесь

Имя типа или пространство имен "Object" отсутствует в пространстве имен "System.Data"
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

Пространство имён!
Как лучше указывать пространство имён? using namespace std вначале? или std::? вроде бы проще...

Пространство имён
Добрый день. Вот начал изучать по книге asp.net mvc 4 , такая ситуация создал решение в нём...

пространство имен
Кто-нибудь знает какие using System. надо использовать для этого? windows =...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru