Инициализация объекта

#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)