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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

Преимущества указателя? - C++

20.01.2013, 00:22. Просмотров 2740. Ответов 31
Метки нет (Все метки)

Какая разница между?
C++
1
2
3
MyObject * object = new MyObject;
// и
MyObject object;
Какие преимущества дает использование указателя на объект с последующим выделением памяти под него по сравнению с просто объектом. (помимо того что использование указателя может давать утечки памяти)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 00:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преимущества указателя? (C++):

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include <iostream> #include <cstdlib> #include <fstream> using namespace...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Преимущества знания С++ - C++
привет всем. Подскажите пожалуйста какие преимущества дает знание языка С++.? Изучив С++ что я могу сделать в гоогле не особо разборчего...

31
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
20.01.2013, 00:26 #2
Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject * object = new MyObject;
объект размещен в куче

Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject object;
объект размещен в стеке

стек имеет ограничение по размеру
например 100000000 объектов в стеке не разместишь программа рухнет
а в куче можно

А вообще что лучше Бельгия или Техас?
У каждого способа свои достоинства и недостатки
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 00:31  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
У каждого способа свои достоинства и недостатки
Про Бельг.... хм, про преимущество по подробнее пожалуйста. Хотя бы пару тройку прошу...
0
Evg
Эксперт CАвтор FAQ
18375 / 6422 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
20.01.2013, 00:34 #4
Цитата Сообщение от vbloodv Посмотреть сообщение
Какие преимущества дает использование указателя на объект с последующим выделением памяти под него по сравнению с просто объектом
Никаких. Просто в каждом отдельно взятом случае более правильным решением будет то, либо другое.

Когда у тебя есть глобальные объекты в разных программных модулях, то у тебя нет никакой гарантии, что они построятся в том или ином порядке, а потому ты в конструкторе одного объекта не можешь закладываться на то, что другой объект уже проинициализирован. А вот когда ты объекты создаёшь динамически, ты ты сам чётко задаёшь порядок, в котором они будут созданы
0
MrGluck
Модератор
Эксперт CЭксперт С++
7497 / 4613 / 694
Регистрация: 29.11.2010
Сообщений: 12,628
20.01.2013, 00:36 #5
vbloodv, при создании указателя на базовый класс можно использовать полиморфизм
1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
20.01.2013, 00:42 #6
Цитата Сообщение от vbloodv Посмотреть сообщение
преимущество по подробнее пожалуйста.
В стеке объект создается быстрее
А здесь
Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject * object = new MyObject
Тратится время на выделение памяти
да и удалять нужно ( то же время)
про то что в стек нельзя запихивать бесконечно я тебе писал
про порядок создания написал Evg


а чтобы понятнее было забудь про классы и подумай что лучше

C++
1
int * i=new int;
или
C++
1
int i
и то и другое имеет место быть

Добавлено через 35 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
vbloodv, при создании указателя на базовый класс можно использовать полиморфизм
А в стеке нельзя?
1
Kuzia domovenok
2045 / 1890 / 172
Регистрация: 25.03.2012
Сообщений: 6,507
Записей в блоге: 1
20.01.2013, 00:54 #7
я вообще не понимаю из чего этот вопрос мог возникнуть. Вопрос стоит как? Зачем объявлять локальную переменную-указатель и в ней сохранять указатель на объект, созданный new, вместо того чтоб изначально объявить локальную переменную-объект? Ну так разные бывают обстоятельства.
Может полиморфизм нужен. И требуется по ходу программы хранить в этом указателе объекты разных классов.
Может динамический массив нужен и мы ещё не получили размер массива и не готовы его выделять.
Может нужен указатель на объект, возвращаемый из нашей текущей функции и мы не хотим, чтобы он исчез вместе с прочими локальными переменными.
Может нужны динамические списки/деревья и.т.п. Ты знаком с ними?

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
А в стеке нельзя?
не встречал такого. Ну разве что placement new может быть... не уверен.
а чем можно ещё заменить это:
base* ptr=new Derived();
если хотим на стеке?
1
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.01.2013, 01:05 #8
Kuzia domovenok, ссылкой.
C++
1
2
Derived a;
Base &b = a;
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,240
20.01.2013, 01:07 #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не встречал такого.
В смысле?
такого не видел
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
public:
    int i;
    virtual void fnc(){printf("A\n");};
};
class B: public A
{
    virtual void fnc(){printf("B\n");};
};
 
 
 
void main() 
{
A a;
B b;
A *c;
c=&a;
c->fnc();
c=&b;
c->fnc();
}
0
Kuzia domovenok
2045 / 1890 / 172
Регистрация: 25.03.2012
Сообщений: 6,507
Записей в блоге: 1
20.01.2013, 01:08 #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
Derived a;
Base &b = a;
А это тут при чём LOL
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.01.2013, 01:10 #11
Kuzia domovenok, Вы спросили, чем заменить указатель на базовый класс в стеке, я ответил - ссылкой. Или я не корректно понял Ваш вопрос?
1
Kuzia domovenok
2045 / 1890 / 172
Регистрация: 25.03.2012
Сообщений: 6,507
Записей в блоге: 1
20.01.2013, 01:16 #12
Я имел в виду довольно распространённое решение, например я могу написать такой игровой движок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "SuperGameEngine.h"
int main(){
string s;
Game* app;
cout<<"Во что поиграть хотите?";
cin>>s;
switch(s){
  case "Doom 5": app=new Doom(5); break;
  case "Civilization 7": app=new Civilization(7); break;
  case "Halo 10": app=new Halo(10); break;
}
app->run();
return 0;
}
А вот зачем просто так заводить ссылку на объект, к которому мы и так можем обратиться, я не понял.
1
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.01.2013, 01:23 #13
Kuzia domovenok, это был всего лишь пример. Реальное же использование - функции:

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
class Base {
 public:
   virtual void h() const {
      std::cout << "base" << std::endl;
   }
};
 
class Derived : public Base {
 public:
   virtual void h() const {
      std::cout << "derived" << std::endl;
   }
};
 
int func( const Base &object ) {
   object.h();
}
 
int main() {
   Base a;
   Derived b;
 
   func( a );
   func( b );
 
   return 0;
}
В Вашем же примере не известно заранее, какой объект понадобится, поэтому логично использовать выделение памяти под объект в куче.
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 01:47  [ТС] #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я вообще не понимаю из чего этот вопрос мог возникнуть. Вопрос стоит как?
Нет, вопрос стоит именно так как надо, не было понимания что где храниться и при разборе чужого кода, не мог понять чего хочет добиться автор...

Добавлено через 5 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Может динамический массив нужен и мы ещё не получили размер массива и не готовы его выделять.
Может нужен указатель на объект, возвращаемый из нашей текущей функции и мы не хотим, чтобы он исчез вместе с прочими локальными переменными.
Может нужны динамические списки/деревья и.т.п. Ты знаком с ними?
Нет, со всем этим знаком. По ответу ValeryS теперь понимаю что значит StackOVerFlow и как это делается))
0
MrGluck
Модератор
Эксперт CЭксперт С++
7497 / 4613 / 694
Регистрация: 29.11.2010
Сообщений: 12,628
20.01.2013, 02:11 #15
А если потребуется хранить в коллекции объекты различных классов, имеющих один базовый?

Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
...
};
 
class B : public A
{
...
};
 
class C : public A
{
...
};
 
class D
{
...
std::map<std::string, A *> m;
};
Как то же сделать через ссылки или в стеке?
1
20.01.2013, 02:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 02:11
Привет! Вот еще темы с ответами:

Преимущества указателей на void - C++
В чем преимущества указателей на void? Только в том, что не нужно лишний раз писать (type*) при преобразовании? Например вместо ...

объединить преимущества кодов - C++
Задание Написать программу. Пользователь вводит положительное или отрицательное число. Перевести число в 2-ую систему счисления и...

Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0] - C++
Задан массив из 3 указателей Bitmap, по адресу Bitmap необходимо записать 480*640 элементов из массива Bitmap. В последнем цикле for выдает...

QuickSort и MergeSort: недостатки и преимущества - C++
Добрый вечер! Qsort плоха тем, что в худшем случае работает за О(n^2). Mergesort стабильна и работает ВСЕГДА за n*log(n). Расскажите,...


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

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

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