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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
#1

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

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

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

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

Разница в определении конструкторов со списком инициализации и без него - C++
Начинаю изучать конструкторы , и в моей книге его объявление выглядит следующим образом class Counter { private : unsigned int...

Нереальная разница при использовании int и double - C++
Писал код в параллельную ветку, случайно наткнулся на такое, вот код: #include<iostream> #include<cmath> int main(){ const int...

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

Виды конструкторов - C++
Какие конструкторы существуют в С++? Инфу с вики читал, но почему то все равно ответ не верен. Варианты ответа: 1) Копирования ...

Наследование конструкторов - C++
Добрый день. Подскажите как правильно осуществить наследование конструктора в двух файлах h и cpp. В одном h файле все работало. ...

Массив из конструкторов - C++
Подскажите как создать массив из конструкторов определенного класса. Приведу пример: static int num1 = 0; ... ...

20
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
27.03.2014, 16:25 #2
№1 - Может проинициализировать константы
№3 - Может сделать какие-то дополнительные действия
1
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
27.03.2014, 16:41 #3
Насколько я помню разница между №1 и №2, в том что, в №1 происходит инициализация переменных значениями заданными вами. А в №2 в отличии от №1, происходит сначала инициализация переменных стандартными конструкторами, а уже потом копирование в них нужных вам значений, что по времени немного дольше из-за увеличения количества нужный операций.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
27.03.2014, 16:50 #4
№1
Цитата Сообщение от madonzy Посмотреть сообщение
C++
1
x = _x;//тут будет вызван конструктор без параметров, а за тем конструктор копирования или преобразования (если x и x_ разного типа)
-позволяет вызывать конструктор базового класса с передачей параметров текущего в качестве аргументов;
-если у типа поля нет конструктора по умолчанию, то инициализатор тоже помогает. Нельзя определить порядок инциализации в списке, поэтому инциализаторы должны вычисляться независимо.
№3
Если в методах установки есть ссылки на нестатические поля класса, то порядок их вызова должен гарантировать невозможность использования ещё неинициализированного поля.
Больше не вспомнил.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2014, 17:05 #5
Цитата Сообщение от Wlk Посмотреть сообщение
уже потом копирование в них нужных вам значений, что по времени немного дольше из-за увеличения количества нужный операций.
Для фундаментальных типов разницы не будет.

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нельзя определить порядок инциализации в списке, поэтому инциализаторы должны вычисляться независимо.
Порядок инициализации полей в списке инициализации соответствует порядку объявления полей в классе/структуре.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
27.03.2014, 17:58 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Порядок инициализации полей в списке инициализации соответствует порядку объявления полей в классе/структуре.
Ваша правда. Лучше было сказать, что инициализация полей не определяется порядком следования выражений в списке. Про независимость придумал, конечно.
0
madonzy
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 65
27.03.2014, 18:02  [ТС] #7
ну так, а чем предпочтительней пользоваться?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2014, 18:05 #8
Цитата Сообщение от madonzy Посмотреть сообщение
а чем предпочтительней пользоваться?
Вариант №1
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
27.03.2014, 18:35 #9
Цитата Сообщение от madonzy Посмотреть сообщение
а чем предпочтительней пользоваться?
всё зависит от конкретной ситуации
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.03.2014, 18:57 #10
Цитата Сообщение от Croessmah Посмотреть сообщение
всё зависит от конкретной ситуации
по-моему, в любой ситуации можно использовать #1 как наиболее универсальный вариант без оверхеда.
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,881
Записей в блоге: 3
Завершенные тесты: 1
28.03.2014, 08:20 #11
Цитата Сообщение от Tulosba Посмотреть сообщение
по-моему, в любой ситуации можно использовать #1 как наиболее универсальный вариант без оверхеда.
а если переменные должны устанавливаться особым образом в зависимости от параметра? Тогда как раз подойдет вариант №3
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,534
Завершенные тесты: 1
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
попробую в пятницу, во время полнолуния, на вязовском кладбище

0
SatanaXIII
28.03.2014, 09:09
  #14

Не по теме:

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

0
Croessmah
28.03.2014, 09:18     Разница в использовании конструкторов
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 09:18
Привет! Вот еще темы с ответами:

Наследование конструкторов - C++
Создать класс CPoint – точка. На его основе создать классы CColoredPoint и CLine. На основе класса СLine создать класс CcoloredLine и класс...

Вызов конструкторов - C++
привет почему здесь вызывается только 1 конструктор? #include <iostream> using namespace std; class A {

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

запуск конструкторов - C++
class String { private: strCount* psc; public: String() //...


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

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

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