LINUX.ORG.RU

C++ и операторы . и ->


0

0

привет гурам плюсов

vector<myClass> tr; 

for ( int i = 0 ; i < DOFIGA ; i++ )
   tr.push_back ( new myClass() );

скажите пожалуйста что происходит при

tr.at(4) ?

всмысле не вызов метода at , а при операторе .? 
что\где создается дополнительно? откуда что берется и т.д.

можно закидать ссылками но не отсылайте дизасеблить и смотреть самому :)

спасибо!
★★★

Не совсем ясно. Имеется ввиду условный оператор вида 

  tr.at(4) ? X  : Y 

Или просто "точка"? 

gods-little-toy ★★★
()

нестатические методы в С++ это фактически функции у которых есть дополнительный аргумент -- this, адрес объекта. При точке происходит вызов этой функции с аргументом this равным адресу объекта.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

ок а tt.at(4).my_method()

тоже самое?

то есть никаких локальных переменных-указателей не создается? мне какой то умник щас доказывает что тут создается локальная переменная - указатель на объект myClass с помощью которой уже происходит вызов метода

fura13 ★★★
() автор топика
Ответ на: комментарий от fura13

> создается локальная переменная - указатель на объект myClass с помощью которой уже происходит вызов метода

Может быть как раз имеется ввиду this?

execve
()
Ответ на: комментарий от fura13

> tt.at(4).my_method() тоже самое? то есть никаких локальных переменных-указателей не создается? мне какой то умник щас доказывает что тут создается локальная переменная - указатель на объект myClass с помощью которой уже происходит вызов метода

at возвращает ссылку: reference at(size_type n);

Поэтому временной переменной нет. Методу передается непосредственно адрес элемента лежащего в контейнере

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Это можно рассматривать, как

MyClass& tmp = tt.at(4);
tmp.my_method();

Т.е. некая воображаемая временная переменная может быть.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

вот !!! как раз про это он и говорил, так это может быть или есть? где бы про это почитать ?? в стандартных книженциях по плюсам нету :(

fura13 ★★★
() автор топика
Ответ на: комментарий от fura13

http://www.cppreference.com/cppvector/at.html

TYPE& at( size_type loc );

const TYPE& at( size_type loc ) const;

Да, создается временная ссылка на объект, на которой и вызывается метод.

Т.е. временный объект есть, но фактически это - ~указатель и при его создании ни чего страшного не происходит.

YesSSS ★★★
()
Ответ на: комментарий от fura13

> вот !!! как раз про это он и говорил, так это может быть или есть? где бы про это почитать ?? в стандартных книженциях по плюсам нету :(

это тебя интересует с точки зрения стандарта Си++ или с точки зрения того какой код будет сгенерирован??

С точки зрения стандарта -- создание временного объекта типа указатель или ссылка ничего не означает -- это ни к чему не обязывает -- поэтому пофиг создается или нет -- в отличие от временного объекта самого класса -- который обязывает к вызову конструктора-деструктора.

С точки зрения оптимизации -- есть 2 крайних случая. Первый -- это метод инлайнится, метод константный, и сам объект какой-то совсем простой типа инт. Тогда вполне вероятно будет использовано индексная адресация без явного вычисления и хранения где-либо адреса.

Вторая крайность -- если метод не инлайновый, тогда наверняка будет явно вычисляться адрес и передаваться в функцию.

dilmah ★★★★★
()

>vector<myClass> tr; 

>   tr.push_back ( new myClass() );

В этих двух строчках противоречие. 

Надо либо vector<myClass*>, и тогда в векторе будут хранится указатели. 
А вторая строчка будет черевата утечками памяти. Оператор new создает 
объект и возврачает на него указатель (myClass*, по сути номер ячейки 
памяти). Потом этот указатель передается в tr.push_back. Если там 
возникнет исключение, то вектор изменен не будет, а созданный объект не удалится. Правильный код: 

myClass temp* = new myClass(); 
try { tr.push_back(temp) } catch(...) { delete temp; throw;}

Второй вариант - оставить vector<myClass> tr, тогда нужно писать 
tr.push_back(myClass()); Тогда возможно несколько копирований. 
Их будет точно не менее одного (нужно скопировать объект myClass из 
стека в вектор). 

С жабы переходим?

ival ★★
()
Ответ на: комментарий от ival

> С жабы переходим?

ыыыы

не , заставили месяц пописать на жабе уже наложило очепяток

ВСЕМ ОГРОМНОЕ СПАСИБО!!

fura13 ★★★
() автор топика
Ответ на: комментарий от dilmah

> С точки зрения стандарта -- создание временного объекта типа указатель или ссылка ничего не означает -- это ни к чему не обязывает -- поэтому пофиг создается или нет -- в отличие от временного объекта самого класса -- который обязывает к вызову конструктора-деструктора.

так я получается "с точки зрения стандарта" всегда и думал :)) - а тут зашел спор и я лоханулся :(, терь буду знать еще и как устроенно.

fura13 ★★★
() автор топика
Ответ на: комментарий от ival

> Правильный код: 
> myClass temp* = new myClass(); 
try { tr.push_back(temp) } catch(...) { delete temp; throw;}

1. ну тогда уж хотя бы

#include <memory>

std::auto_ptr<myClass> p(new myClass);
tr.push_back(p.get());
p.release();

пложение try {} catch() где ни поподя есть зло.

2. use boost pointer containers
http://www.boost.org/libs/ptr_container/doc/ptr_container.html

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Kpoxman

у нас по ссылкам не ходят. Объясняй здесь:)

dilmah ★★★★★
()
Ответ на: комментарий от Kpoxman

> NEVER ever use auto_ptr in containers! Читайте Саттера, если не очевидно.

А Вы случайно не попутали tr.push_back(_p.get()_); с tr.push_back(_p_); ?

Eshkin_kot ★★
()
Ответ на: комментарий от Kpoxman

> NEVER ever use auto_ptr in containers! Читайте Саттера, если не очевидно.

если вы внимательно посмотрите приведённый код то заметите, что в списке лежат именно указатели но никак не обёртки. последние используются лишь для защиты временного указателя от исключения в списке here and now.

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.