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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
#1

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

20.11.2012, 13:16. Просмотров 1462. Ответов 14
Метки нет (Все метки)

Здравствуйте Форумчане.
Вопрос следующий: Какая разница между
C++
1
new ClassName;
и
C++
1
new ClassName();
Если можно ссылку на источник или страницу книги..
Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2012, 13:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор C++ и new (C++):

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -> i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <math.h> #include <algorithm> using...

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Юля_программист
468 / 123 / 19
Регистрация: 04.05.2012
Сообщений: 598
Записей в блоге: 1
20.11.2012, 14:04 #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

Прошу заметить что я очень-очень новичок.
0
Байт
Эксперт C
16061 / 10330 / 1540
Регистрация: 24.12.2010
Сообщений: 19,451
20.11.2012, 14:12 #3
Dr.Urban,
Юля_программист, Просто, если в конструкторе класса нет параметров, то пустые скобки можно опустить.
1
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
20.11.2012, 14:14 #4
Dr.Urban, никакой. В обоих случаях будет вызван конструктор без параметров.
Если надо вызвать конструктор с параметрами, то придется писать скобки и требуемые параметры внутри них.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.11.2012, 14:18 #5
Для пользовательских типов эти записи идентичны. Что при
C++
1
new MyClass();
что при
C++
1
new MyClass;
будет вызван конструктор по умолчанию.

Для встроенных типов конструктор по умолчанию вызывается только при явном его вызове:
C++
1
new int; //переменная не будет инициализирована, в ней будет хранится "мусор"
C++
1
new int(); //переменная будет инициализирована нулем
Так же, вроде, это справедливо для POD-типов.
2
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 14:31  [ТС] #6
Цитата Сообщение от Toshkarik Посмотреть сообщение
будет вызван конструктор по умолчанию.
Что будет если :
Если в класе не POD-тип ?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.11.2012, 14:37 #7
Dr.Urban, будет вызван конструктор по умолчанию, если его нет, то будет ошибка компиляции.
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 14:38  [ТС] #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 = "мусор"
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.11.2012, 14:38 #9
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Что будет если :
Если в класе не POD-тип ?
Если у объекта был вызван конструктор - все его podы будут инициализированы вместе со всеми не POD-членами в порядке объявления
Для не-POD-ов будут вызваны конструкторы по-умолчанию, либо конструкторы, указанные в списке инициализации
както так
1
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
20.11.2012, 14:45 #10
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Если можно ссылку на источник или страницу книги..
Спасибо.
ANSI ISO IEC 14882_2003.pdf (стр. 110 п. 5.3.4.15, стр. 173 п.8.5.5).
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 14:53  [ТС] #11
Цитата Сообщение от WhiteP Посмотреть сообщение
Сообщение от Dr.Urban
Если можно ссылку на источник или страницу книги..
Спасибо.
ANSI ISO IEC 14882_2003.pdf (стр. 110 п. 5.3.4.15, стр. 173 п.8.5.5).
Большое спасибо!
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.11.2012, 14:57 #12
Цитата Сообщение от Dr.Urban Посмотреть сообщение
*p = 0 *p1 = "мусор"
странно, всю жизнь верил, что POD'ы тоже иницилизируются, ща проверим по стандарту
в gcc 4.6 pod'ы инициализированы, а в 4.1.2 - нет
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.11.2012, 15:23 #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
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
20.11.2012, 15:28  [ТС] #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Ну собственно нашел на просторах подтверждение своим догадкам:
http://www.fnal.gov/docs/working-gro...x/doc/POD.html

Настораживает : ISO/IEC 14882, first edition, 1998-09-01
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.11.2012, 15:53 #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-типы в обоих случаях.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2012, 15:53
Привет! Вот еще темы с ответами:

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.11.2012, 15:53
Ответ Создать тему
Опции темы

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