#c
#c
Вопрос:
Я видел следующий фрагмент кода: test()
вывод функции равен 6
#include <iostream>
using namespace std;
int z = 0;
class A{
public:
int a = 2;
A(){
a = 1;
z ;
}
A(const Aamp; aa){
a = 3;
z = 2;
}
Aamp; f(){return *this;}
};
void test(){
{A a, b(a), c(A().f());}
cout << z;
}
int main()
{
test();
return 0;
}
Я понимаю, что происходит во всех строках, кроме c
инициализации объекта: c(A().f())
? Я был бы рад, если бы вы объяснили мне эту строку?
Комментарии:
1. @MatthieuBrucher: Что ты имеешь в виду? Это третья локальная переменная типа
A
, ограниченная внутренним блоком. ЕстьA a
(инициализация по умолчанию),A b(a)
(прямой вызов конструктора копирования) иA c(A().f())
(другой прямой вызов конструктора копирования, копирующий временное значение, которое было инициализировано значением)
Ответ №1:
Строки разбиваются следующим образом:
A a; // Calls A::A(); (Default constructor. Has `z ;`, so `z` is now 1)
A b(a); // Calls A::A(const Aamp;); (Copy constructor. `z = 2;`, so `z` is now 3)
A c(
A() // Calls A::A(); (`z ;`, `z` is now 4)
// This creates a temporary `A` object
.f() // Just returns `*this`, the temporary. No copy made, nothing happens to `z`
); // Calls A::A(const Aamp;); (`z = 2;`, `z` is now 6)