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

Создание и инициализация - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
03.12.2010, 01:11     Создание и инициализация #1
Добрый вечер, я как всегда с нетривиальными вопросами
допустим есть объект
C++
1
2
3
4
5
6
class myclass
{
    int i;
public:
    myclass(int j) {i = j}
};
при создании создании объекта таким образом вопросов не возникает
C++
1
myclass object(5)
но как я узнал с книг есть еще две альтернативы такому объявлению:

1.
C++
1
myclass object = myclass(5)
тут происходит создание временного объекта который инициализируется значением "5"(правая часть) и тут же создается объект object который сразу же инициализируется этим объектом с помощью автоматического конструктора копирования(побитовая копия), я правильно понимаю?

2.
C++
1
myclass object = 5
Вопрос - создается неявная ф-ция преобразования "5" в тип myclass, что здесь происходит? справа получается объект типа myclass с значением поля "5", а потом происходит тоже побитовое копирование?

3. и насчет динамического создания объектов:
C++
1
myclass *object = new myclass(5)
тут я так понял создается тот же временный объект
C++
1
myclass(5)
, а оператор new размещает его в памяти и возвращает на него указатель, я правильно понял? если нет прошу поправить

Спасибо за внимание
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2010, 01:11     Создание и инициализация
Посмотрите здесь:

В-деревья,инициализация C++
инициализация C++
Инициализация указателей C++
Инициализация по стандарту C++11 C++
Инициализация переменных С++11 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
03.12.2010, 07:28     Создание и инициализация #2
Кстати, чтобы разобраться в таких делах, я обычно перегружаю конструкторы, добавляя в них текстовые сообщения (ну и оператор присваивания тут тоже пригодится). И будет хорошо видно, что в каких ситуациях вызывается. Ну что-то типа этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class myclass
{
    int data;
public:
    myclass():data(0)
    {
        cout<<"Constructor without parametrs\n";    
    }
 
    ~myclass()
    {
        cout<<"Destructor\n";   
    }
 
    myclass(int val):data(val)
    {
        cout<<"Constructor with one parametr\n";
    }
 
    myclass(const myclass & copy):data(copy.data)
    {
        cout<<"Copy constructor\n";
    }
 
    void operator=(const myclass & rhs)
    {
        data = rhs.data;
        cout<<"Operator \"=\"\n";
    }
};
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.12.2010, 08:13     Создание и инициализация #3
тут происходит создание временного объекта который инициализируется значением "5"(правая часть) и тут же создается объект object который сразу же инициализируется этим объектом с помощью автоматического конструктора копирования(побитовая копия), я правильно понимаю?
Верно по сути.

Вопрос - создается неявная ф-ция преобразования "5" в тип myclass, что здесь происходит? справа получается объект типа myclass с значением поля "5", а потом происходит тоже побитовое копирование?
Вспоминаем тему про приведение неявное. Был бы explicit конструктор не работало бы.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
03.12.2010, 08:30     Создание и инициализация #4
C++
1
myclass object = myclass(5)
А тут точно конструктор копирования вызывается? Вроде как конструктор с одним параметром сразу создаёт объект object и никакого временного объекта нету.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.12.2010, 12:54     Создание и инициализация #5
dihlofos, Кстати, да. Тут вроде как сразу вызывается конструктор. Ведь
myclass object(5) == myclass object=myclass(5);
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
03.12.2010, 23:36  [ТС]     Создание и инициализация #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Тут вроде как сразу вызывается конструктор. Ведь
myclass object(5) == myclass object=myclass(5);
протестил, тут во всех 3 случаях:
C++
1
2
3
myclass object = myclass(5)
myclass object = 5
myclass *object = new myclass(5)
вызывается только конструктор с одним параметром

возник вопрос - так конструкция типа
C++
1
myclass object = myclass(5)
является только синтаксической конструкцией С++, то есть компилятор преобразовывает эту конструкцию в конструкцию вида
C++
1
myclass object(5)
?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
03.12.2010, 23:38     Создание и инициализация #7
Цитата Сообщение от norge_goth Посмотреть сообщение
является только синтаксической конструкцией С++, то есть компилятор преобразовывает эту конструкцию в конструкцию вида
да, это одно и тоже
однако если перед конструктором стоит explicit, то такая конструкция запрещена
по аналогии для простейших типов:
C++
1
2
int a = 10;
int b(10);
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
03.12.2010, 23:46     Создание и инициализация #8
Цитата Сообщение от norge_goth Посмотреть сообщение
является только синтаксической конструкцией С++, то есть компилятор преобразовывает эту конструкцию в конструкцию вида
И да и нет
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
03.12.2010, 23:50     Создание и инициализация #9
Цитата Сообщение от rangerx Посмотреть сообщение
И да
если удалить конструктор копирования - все работает как и ожидалось, кхм
в чем соль то, компилятор то один
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
03.12.2010, 23:56  [ТС]     Создание и инициализация #10
Цитата Сообщение от rangerx Посмотреть сообщение
И да и нет
у меня в обоих вариантах только
C++
1
Myclass(int i)
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 22:45  [ТС]     Создание и инициализация #11
Цитата Сообщение от alex_x_x Посмотреть сообщение
да, это одно и тоже
Вот наткнулся на код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <stdlib.h>
 
using namespace std;
 
class myclass
{
public:
    myclass()
    {
        cout << "In constructor" << endl;
    }
 
    ~myclass()
    {
        cout<< "In destructor" << endl;
    }
};
 
void func(myclass ob)
{
    cout << "In func" << endl;
}
 
 
int main()
{
    {
        func(myclass());
    }
 
    system("pause");
    return 0;
}
C++
1
func(myclass());
что по существу означает такая передача параметра, почему вызов деструктора происходит только раз(передается же по значению)
а в таком случае деструктор вызывается 2 раза
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    {
        myclass my;
        func(my);
    }
 
    system("pause");
    return 0;
}
В чем принципиальная разница?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.12.2010, 22:48     Создание и инициализация #12
Цитата Сообщение от norge_goth Посмотреть сообщение
myclass my;
вызовется конструктор

Цитата Сообщение от norge_goth Посмотреть сообщение
func(my);
вызовется конструктор, так как передается по значению - внутри функции создастся новый объект
по выходу из функции вызовется деструктор временного объекта

Цитата Сообщение от norge_goth Посмотреть сообщение
}
вызовется деструктор
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 22:56  [ТС]     Создание и инициализация #13
а в первом примере
C++
1
2
3
4
5
6
7
8
9
int main()
{
    {
        func(myclass());
    }
 
    system("pause");
    return 0;
}
Я так понимаю перед вызовом ф-ции вычисляются ее аргументы то есть создастся временный объект вот тут
C++
1
func(myclass());
, а только потом вызветься ф-ция func но почему если мы передаем по значению в ф-цию после выхода с ф-ции не вызывается деструктор?
а вызывается только в конце блока после } перед system("pause");

и вообще
C++
1
func(myclass());
это создание безимянного временного объекта?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.12.2010, 23:01     Создание и инициализация #14
norge_goth, ну там есть моменты когда у объекта не вызывается конструктор копирования, а он сразу появляется внутри функции
так же как если бы вы написали

C++
1
2
3
4
myclass func()
{
    return myclass(123);
}
то здесь опять таки конструктор вызовется только один раз, те без копирования
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2010, 23:18     Создание и инициализация
Еще ссылки по теме:

инициализация объекта C++
C++ Инициализация указателей
С++ сложная инициализация C++

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

Или воспользуйтесь поиском по форуму:
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
06.12.2010, 23:18  [ТС]     Создание и инициализация #15
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну там есть моменты когда у объекта не вызывается конструктор копирования, а он сразу появляется внутри функции
то есть хоть он и создается вне ф-ции он всеравно принадлежит этой ф-ции?

а еще много таких исключений для конструктора копирования? есть какие-то общие случаи где не вызывается конструктор копирования(подобные ситуации) и если можно где можно почитать про такое?
Yandex
Объявления
06.12.2010, 23:18     Создание и инициализация
Ответ Создать тему
Опции темы

Текущее время: 19:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru