Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
1

Разница в использовании конструкторов

27.03.2014, 16:18. Показов 1048. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем)
У меня вопрос. Относительно недавно начал изучать ООП на С++ и для меня непонятна разница между такими конструкторами:

№1
C++
1
2
Point::Point(int _x, int _y)
: x(_x), y(_y) {}
№2
C++
1
2
3
4
Point::Point(int _x, int _y) {
x = _x;
y = _y;
}
№3
C++
1
2
3
4
Point::Point(int _x, int _y) {
SetX(_x);
SetY(_y);
}
Свойства, класса Point, x и y приватные. Так в чём же разница?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2014, 16:18
Ответы с готовыми решениями:

Разница в определении конструкторов со списком инициализации и без него
Начинаю изучать конструкторы , и в моей книге его объявление выглядит следующим образом class...

Нереальная разница при использовании int и double
Писал код в параллельную ветку, случайно наткнулся на такое, вот код: #include<iostream>...

Перегрузка конструкторов
Добрый день знатоки С++ возник вопрос Код этой программы компилируется в CodeBlocks а на...

Конфликт конструкторов.
Здравствуйте! struct DateTime : tm { DateTime(int year_ = 1970, int month_...

20
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
27.03.2014, 16:25 2
№1 - Может проинициализировать константы
№3 - Может сделать какие-то дополнительные действия
1
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 215
27.03.2014, 16:41 3
Насколько я помню разница между №1 и №2, в том что, в №1 происходит инициализация переменных значениями заданными вами. А в №2 в отличии от №1, происходит сначала инициализация переменных стандартными конструкторами, а уже потом копирование в них нужных вам значений, что по времени немного дольше из-за увеличения количества нужный операций.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.03.2014, 16:50 4
№1
Цитата Сообщение от madonzy Посмотреть сообщение
C++
1
x = _x;//тут будет вызван конструктор без параметров, а за тем конструктор копирования или преобразования (если x и x_ разного типа)
-позволяет вызывать конструктор базового класса с передачей параметров текущего в качестве аргументов;
-если у типа поля нет конструктора по умолчанию, то инициализатор тоже помогает. Нельзя определить порядок инциализации в списке, поэтому инциализаторы должны вычисляться независимо.
№3
Если в методах установки есть ссылки на нестатические поля класса, то порядок их вызова должен гарантировать невозможность использования ещё неинициализированного поля.
Больше не вспомнил.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.03.2014, 17:05 5
Цитата Сообщение от Wlk Посмотреть сообщение
уже потом копирование в них нужных вам значений, что по времени немного дольше из-за увеличения количества нужный операций.
Для фундаментальных типов разницы не будет.

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нельзя определить порядок инциализации в списке, поэтому инциализаторы должны вычисляться независимо.
Порядок инициализации полей в списке инициализации соответствует порядку объявления полей в классе/структуре.
1
Комп_Оратор)
Эксперт по математике/физике
8950 / 4704 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.03.2014, 17:58 6
Цитата Сообщение от Tulosba Посмотреть сообщение
Порядок инициализации полей в списке инициализации соответствует порядку объявления полей в классе/структуре.
Ваша правда. Лучше было сказать, что инициализация полей не определяется порядком следования выражений в списке. Про независимость придумал, конечно.
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
27.03.2014, 18:02  [ТС] 7
ну так, а чем предпочтительней пользоваться?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.03.2014, 18:05 8
Цитата Сообщение от madonzy Посмотреть сообщение
а чем предпочтительней пользоваться?
Вариант №1
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
27.03.2014, 18:35 9
Цитата Сообщение от madonzy Посмотреть сообщение
а чем предпочтительней пользоваться?
всё зависит от конкретной ситуации
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.03.2014, 18:57 10
Цитата Сообщение от Croessmah Посмотреть сообщение
всё зависит от конкретной ситуации
по-моему, в любой ситуации можно использовать #1 как наиболее универсальный вариант без оверхеда.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
28.03.2014, 08:20 11
Цитата Сообщение от Tulosba Посмотреть сообщение
по-моему, в любой ситуации можно использовать #1 как наиболее универсальный вариант без оверхеда.
а если переменные должны устанавливаться особым образом в зависимости от параметра? Тогда как раз подойдет вариант №3
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
28.03.2014, 08:58 12
C++
1
2
3
4
Point( int x_, int y_ ):
  x( SetX( int x_ ) ),
  y( SetY( int y_ ) )
  {}



Вариант №13
0
Croessmah
28.03.2014, 09:02
  #13

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вариант №13
попробую в пятницу, во время полнолуния, на вязовском кладбище :D

0
SatanaXIII
28.03.2014, 09:09
  #14

Не по теме:

Croessmah, зажав в руке сорок куриных пупочков. :D

0
Croessmah
28.03.2014, 09:18
  #15

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Croessmah, зажав в руке сорок куриных пупочков.
в кругу вурдалаков перед могилой франкенштейна :D

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.03.2014, 10:45 16
Цитата Сообщение от SatanaXIII Посмотреть сообщение
C++
1
2
3
4
Point( int x_, int y_ ):
  x( SetX( int x_ ) ),
  y( SetY( int y_ ) )
  {}



Вариант №13
Особенно учитывая, что Set() скорее всего возвращает void. Да и инты надо бы убрать при вызове. Короче, баг на баге. Исправляйтесь
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
28.03.2014, 11:28 17
Цитата Сообщение от Tulosba Посмотреть сообщение
Особенно учитывая, что Set() скорее всего возвращает void. Да и инты надо бы убрать при вызове. Короче, баг на баге. Исправляйтесь
Всё в этой жизни относительно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define SetX(...) new int [x_]
#define SetY(...) new int [y_]
 
struct Point {
    Point( int x_, int y_ ):
        x( SetX( int x_ ) ),
        y( SetY( int y_ ) )
    {
    }
    ~Point(){
       delete [] x ;
       delete [] y ;
    }
    int * x ;
    int * y ;
} ;
2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.03.2014, 11:52 18
Croessmah, макросы вообще превращают плюсы в другой язык.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
28.03.2014, 12:21 19
Да, да, да. Давайте холивар на ровном месте разведем.

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.03.2014, 13:05 20
SatanaXIII, никакого холивара. Я думаю, Croessmah будет со мной согласен
0
28.03.2014, 13:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2014, 13:05
Помогаю со студенческими работами здесь

Наследование конструкторов
если при наследовании классов отсутствует конструктор в базовом классе, то что тогда? Помогите,...

Наследование конструкторов
Здравствуйте! У меня такой вопрос: Как сделать так, чтобы при создании объекта дочернего класса не...

Наследование конструкторов
Здрасти. Такая проблема. У меня есть классы с таким наследованием:...

Перегрузка конструкторов
Написал прогу - в зависимости от ввода даты печатает ее в определенном формате: файл date.h...


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

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