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

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

Войти
Регистрация
Восстановить пароль
 
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
#1

Область видимости анонимного объекта при вызове функции - C++

22.07.2014, 09:29. Просмотров 266. Ответов 6
Метки нет (Все метки)

Доброго дня.
Хотел поинтересоваться: когда уничтожится анонимный объект, переданный как параметр функции?

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 <stdio.h>
#include <string>
 
using namespace std;
class Obj{
private:
  string s;
public:
friend 
  Obj(){s("asd"); printf("construct\n");}
  ~Obj(){printf("destroy\n");}
  operator const char * (){ return s.c_str();}
  friend Obj & operator <<(Obj & obj, const char * arg);
};
 
Obj & operator <<(Obj & obj, const char * arg){ s.append(arg); return obj;}
void print(const char * msg){
 printf("here\n");
 
 
}
int main()
{
 print(Obj() << "eh one" << "one one one" << "many many one one one");
 return 0;
}
Собственно у меня получилось
> ./a.out
construct
here
destroy

Я правильно понимаю что объект уничтожается при выходе из функции? Если у кого завалялась ссылка на стандарт по этому поводу - киньте в меня
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 09:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Область видимости анонимного объекта при вызове функции (C++):

Что такое область видимости объекта? - C++
Добрый день! Подскажите, пожалуйста, на простом примере, что такое область видимости объекта. Я понимаю, что такое область видимости...

Обрыв функции при вызове метода из объекта другого класса - C++
Почему выполнение функция обрывается на вызове метода из объекта другого класса? DataBuffer.cpp //Получаем класс FirstDlg void...

Непонятная ошибка при вызове функции от тут же создаваемого объекта - C++
Ошибка появляется в строке 42: #include &quot;list.h&quot; #include &lt;iostream&gt; using namespace std; int menu() { system(&quot;cls&quot;); ...

При вызове метода функционального объекта в шаблонной функции ошибка компиляции C2039 - C++
Объект класса Entry - это запись в журнале экзаменационной сессии: номер зачетки, фамилия, курс, группа, дисциплина, оценка. В задаче есть...

Дружественные функции и область видимости - C++
Компилятор mingw 4.9.3 (-std=c++14). Есть класс, определённый в SomeClass.h, в котором заявлена дружественная функция: class SomeClass...

Область видимости при линковании - C++
Привет всем! Работаю над проектом, в котором существует несколько папок (условно назовем их folder1, folder2....folder_n), в каждой из...

6
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
22.07.2014, 09:33 #2
Цитата Сообщение от brick12 Посмотреть сообщение
Если у кого завалялась ссылка на стандарт по этому поводу - киньте в меня

12.2/3
When an implementation introduces a temporary object of a class that has a non-trivial constructor (12.1, 12.8), it shall ensure that a constructor is called for the temporary object. Similarly, the destructor shall be called for a temporary with a non-trivial destructor (12.4). Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception. The value computations and side effects of destroying a temporary object are associated only with the full-expression, not with any specific subexpression.
Так же далее в стандарте описаны два случая, когда это не так и временный объект живет дольше
1
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
22.07.2014, 09:48  [ТС] #3
Исходя из вышенаписанного приведённый пример кода некорректен. Так как есть объект obj будет уничтожен после последовательного выполнения всех операторов `<<` как раз поле передачи в функцию указателя на содержащуюся в нём строку.

PS. Вот после таких вот фокусов программа начинает летать в случайных местах. Нiзенко-нiзенко. Видать к дождю/
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
22.07.2014, 09:56 #4
Цитата Сообщение от brick12 Посмотреть сообщение
Так как есть объект obj будет уничтожен после последовательного выполнения всех операторов `<<` как раз поле передачи в функцию указателя на содержащуюся в нём строку.
full-expression:
A full-expression is an expression that is not a subexpression of another expression. If a language construct is defined to produce an implicit call of a function, a use of the language construct is considered to be an expression for the purposes of this definition. A call to a destructor generated at the end of the lifetime of an object other than a temporary object is an implicit full-expression. Conversions applied to the result of an expression in order to satisfy the requirements of the language construct in which the expression appears are also considered to be part of the full-expression.
[ Example:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct S {
    S(int i): I(i) { }
    int& v() { return I; }
private:
    int I;
};
S s1(1);   // full-expression is call of S::S(int)
S s2 = 2;  // full-expression is call of S::S(int)
void f() {
    if (S(3).v()) {  // full-expression includes lvalue-to-rvalue and int to bool conversions, performed before temporary is deleted at end of full-expression
 }
}
— end example ]
0
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
22.07.2014, 12:11  [ТС] #5
Следуя этой логике вызов
C++
1
Obj() << "eh one" << "one one one" << "many many one one one"
является полным выражением. Obj уничтожится только после отработки всех <<.

Главное чтобы у авторов компиляторов не было другого мнения на этот счёт.
0
Alex5
1101 / 762 / 119
Регистрация: 12.04.2010
Сообщений: 1,932
22.07.2014, 17:03 #6
Цитата Сообщение от brick12 Посмотреть сообщение
Собственно у меня получилось
> ./a.out
construct
here
destroy
brick12, у Вас компилируется эта программа?

C++
1
2
3
public:
friend 
  Obj() /*  error C2633: Obj: 'inline' является единственным допустимым классом хранения для конструкторов */
C++
1
2
Obj & operator <<(Obj & obj, const char * arg){ s.append(arg); return obj;}
/*  error C2065: s: необъявленный идентификатор */
Если же исправить эти ошибки и добавить
C++
1
2
3
4
void print(const char * msg){
 printf("here\n");
 printf("    msg: %s \n", msg );
}
то получается

construct
here
msg: asdeh oneone one onemany many one one one
destroy
0
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
23.07.2014, 07:57  [ТС] #7
Да. Согласен. В коде чехорда. Накидывал по памяти и не особо внимательно ибо оригинал на linux машине доступ к которой через удалённый рабочий стол windows.
0
23.07.2014, 07:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 07:57
Привет! Вот еще темы с ответами:

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов - C++
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу избавиться. (Т.к. очень сильно плаваю в ООП)....

Почему в main(); При вызове объекта не выводится в консоль? - C++
Задача: Цифровой счетчик, это переменная с ограниченным диапазоном. Значение которой сбрасывается, когда ее целочисленное значение...

Aggregate inizialization с участием анонимного объекта - C++
Добрый день, #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; struct Data ...

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования - C++
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного типа. Но компилятор ругается на эту функцию ...


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

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

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