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

Конструктор C++ и new - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 13:16     Конструктор C++ и new #1
Здравствуйте Форумчане.
Вопрос следующий: Какая разница между
C++
1
new ClassName;
и
C++
1
new ClassName();
Если можно ссылку на источник или страницу книги..
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2012, 13:16     Конструктор C++ и new
Посмотрите здесь:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
C++ Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
Конструктор инициализации, конструктор копирования, деструктор C++
C++ Конструктор производного класса требует конструктор предка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Юля_программист
 Аватар для Юля_программист
448 / 103 / 13
Регистрация: 04.05.2012
Сообщений: 525
Записей в блоге: 1
20.11.2012, 14:04     Конструктор C++ и new #2
Я конечно хоть и новичок, но прям самой стало интересно и я стала читать и вот, что нашла.

Не по теме:

Гуру С++ большая просьба если все что я напишу окажется бредом не орите я честно старалась и искала)



Это с википедии
Синтаксис new выглядит следующим образом:
C++
1
p_var = new typename;
где p_var — ранее объявленный указатель типа typename. typename может подразумевать собой любой фундаментальный тип данных или объект, определенный пользователем (включая, enum, class и struct). Если typename — это тип класса или структуры, то он должен иметь доступный конструктор по умолчанию, который будет вызван для создания объекта.
Для инициализации новой переменной, созданной при помощи new нужно использовать следующий синтаксис:
C++
1
p_var = new type(initializer);
Вот если я правильно поняла.
C++
1
2
new ClassName;// создаем чего то там в куче(а что Вы делаете этой строкой??(это вот для себя)
new ClassName();// а это для инициализации новой переменной, созданной при помощи new

Прошу заметить что я очень-очень новичок.
Байт
 Аватар для Байт
13978 / 8809 / 1228
Регистрация: 24.12.2010
Сообщений: 15,964
20.11.2012, 14:12     Конструктор C++ и new #3
Dr.Urban,
Юля_программист, Просто, если в конструкторе класса нет параметров, то пустые скобки можно опустить.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.11.2012, 14:14     Конструктор C++ и new #4
Dr.Urban, никакой. В обоих случаях будет вызван конструктор без параметров.
Если надо вызвать конструктор с параметрами, то придется писать скобки и требуемые параметры внутри них.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.11.2012, 14:18     Конструктор C++ и new #5
Для пользовательских типов эти записи идентичны. Что при
C++
1
new MyClass();
что при
C++
1
new MyClass;
будет вызван конструктор по умолчанию.

Для встроенных типов конструктор по умолчанию вызывается только при явном его вызове:
C++
1
new int; //переменная не будет инициализирована, в ней будет хранится "мусор"
C++
1
new int(); //переменная будет инициализирована нулем
Так же, вроде, это справедливо для POD-типов.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 14:31  [ТС]     Конструктор C++ и new #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
будет вызван конструктор по умолчанию.
Что будет если :
Если в класе не POD-тип ?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.11.2012, 14:37     Конструктор C++ и new #7
Dr.Urban, будет вызван конструктор по умолчанию, если его нет, то будет ошибка компиляции.
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 14:38  [ТС]     Конструктор C++ и new #8
А вот и пример:

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
#include <iostream>
 
using namespace std;
class B
{
 public:
        int k;
};
class A
{
 public:
        B b;
        A(){}
};
 
int main()
{
    A * p = new A;
    A * p1 = new A();
    
    cout << "*p = " << p->b.k << " *p1 = " << p1->b.k << endl;
    
    delete p;
    delete p1;
    return 0;
}
*p = 0 *p1 = "мусор"
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.11.2012, 14:38     Конструктор C++ и new #9
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Что будет если :
Если в класе не POD-тип ?
Если у объекта был вызван конструктор - все его podы будут инициализированы вместе со всеми не POD-членами в порядке объявления
Для не-POD-ов будут вызваны конструкторы по-умолчанию, либо конструкторы, указанные в списке инициализации
както так
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
20.11.2012, 14:45     Конструктор C++ и new #10
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Если можно ссылку на источник или страницу книги..
Спасибо.
ANSI ISO IEC 14882_2003.pdf (стр. 110 п. 5.3.4.15, стр. 173 п.8.5.5).
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 14:53  [ТС]     Конструктор C++ и new #11
Цитата Сообщение от WhiteP Посмотреть сообщение
Сообщение от Dr.Urban
Если можно ссылку на источник или страницу книги..
Спасибо.
ANSI ISO IEC 14882_2003.pdf (стр. 110 п. 5.3.4.15, стр. 173 п.8.5.5).
Большое спасибо!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.11.2012, 14:57     Конструктор C++ и new #12
Цитата Сообщение от Dr.Urban Посмотреть сообщение
*p = 0 *p1 = "мусор"
странно, всю жизнь верил, что POD'ы тоже иницилизируются, ща проверим по стандарту
в gcc 4.6 pod'ы инициализированы, а в 4.1.2 - нет
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.11.2012, 15:23     Конструктор C++ и new #13
alex_x_x, Как я понял - если используется конструктор по умолчанию, генерируемый компилятором, то он явно вызывает конструкторы по умолчанию для своих членов. Если же конструктор по умолчанию определен пользователем, то вызываются конструкторы по умолчанию только для не POD-типов.

Вот пример:
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
#include <iostream>
 
 
struct A {
   int a;
};
 
class B {
 public:
   B()
   {
      
   }
   
   int get() const {
      return a;
   }
   
 private:
   int a;
};
 
int main() {
   A a;
   
   B b;
   
   std::cout << "A: " << a.a << ' ' << "B: " << b.get() << std::endl;
   
   return 0;
}
На выходе: A: 0 B: "мусор". Для A конструктор по умолчанию выглядит скорей всего так:

C++
1
2
3
4
5
A()
   : a()
{
 
}
Добавлено через 13 минут
Ну собственно нашел на просторах подтверждение своим догадкам:
http://www.fnal.gov/docs/working-gro...x/doc/POD.html
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 15:28  [ТС]     Конструктор C++ и new #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ну собственно нашел на просторах подтверждение своим догадкам:
http://www.fnal.gov/docs/working-gro...x/doc/POD.html

Настораживает : ISO/IEC 14882, first edition, 1998-09-01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2012, 15:53     Конструктор C++ и new
Еще ссылки по теме:

Конструктор класса не видит конструктор по умолчанию другого класса C++
C++ Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.11.2012, 15:53     Конструктор C++ и new #15
Dr.Urban, Сомневаюсь, что что-то изменилось.

Мой пример выше не верен. Там, по идеи, должен быть одинаковый результат - в обоих переменных мусор.

Вот пример более корректный:
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
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
 
struct A {
   int a;
};
 
class B {
 public:
   int get() const {
      return a;
   }
   
 private:
   int a;
};
 
class C {
 public:
   C() {}
   
   int get() const {
      return a;
   }
   
 private:
   int a;
};
 
int main() {
   A *a1 = new A;
   A *a2 = new A();
   
   B *b1 = new B;
   B *b2 = new B();
   
   C *c1 = new C;
   C *c2 = new C();
   
   std::cout << "a1 = " << a1->a << " a2 = " << a2->a << std::endl;
   std::cout << "b1 = " << b1->get() << " b2 = " << b2->get() << std::endl;
   std::cout << "c1 = " << c1->get() << " c2 = " << c2->get() << std::endl;
   
   return 0;
}
И его вывод:
a1 = 4088224 a2 = 0
b1 = 4088224 b2 = 0
c1 = 4063576 c2 = 4063576

У класса B есть приватные данные - он не является POD-типом, но в тоже время конструктор по умолчанию генерируемый компилятором инициализирует POD-типы нулями. Но при этом результаты new B; и new B(); разные, тут я в ступоре. У класса C тоже есть приватные данные, и плюс определен конструктор по умолчанию. Он тоже является не POD-типом. Но конструктор по умолчанию не инициализирует POD-типы в обоих случаях.
Yandex
Объявления
20.11.2012, 15:53     Конструктор C++ и new
Ответ Создать тему
Опции темы

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