явно используя вызов конструктора в main как параметр вызова функции - PullRequest
2 голосов
/ 24 декабря 2010

Я пытаюсь понять, как работает явный вызов конструктора в main, используя следующий код.

#include<iostream>

using namespace std;

class Dependency1
{
      bool init;
public:
  Dependency1() : init(true) {
    std::cout << "Dependency1 construction"
              << std::endl;
  }
  void print() const {
    std::cout << "Dependency1 init: "
              << init << std::endl;
  }



};


class Dependency2 {
   Dependency1 d1;
public:
   Dependency2(const Dependency1& dep1): d1(dep1){
     std::cout << "Dependency2 construction ";
     print();
   }
   void print() const { d1.print(); }
};

void test( const Dependency1& dd1)
{
    cout  << " inside Test \n";
    dd1.print();
}



int main()
{

    test(Dependency1());
    Dependency2 D1(Dependency1()); // this line does not work

    return 0;
}

Функция test вызывается, когда конструктор Dependency1 () используется в качестве вызова функции вместо Dependency1 :: Dependency1 () и код работает отлично хорошо.

Теперь, если я использую аналогичную концепцию для создания объекта D1 Dependency2, он не работает. Кажется, я делаю что-то не так, основываясь на неправильном понимании.

Необходимо знать, как компилятор разрешает вызов Dependency1 () в main, даже если разрешение области не используется, и почему оно не работает, когда я использую его в качестве параметра в конструкторе Dependency2

Спасибо, Ананд

Ответы [ 2 ]

7 голосов
/ 24 декабря 2010

test(Dependency1())

Вызывает функцию test и передает временный объект класса Dependency1.Поскольку формальный параметр в определении test является ссылкой на const и поскольку временные ссылки могут быть связаны с const ссылками, ваш код работает.

Dependency2 D1(Dependency1()); // this line does not work

Это называется C ++ самый неприятный анализ.D1 интерпретируется как функция, возвращающая Dependency2 и принимающая в качестве аргумента указатель на функцию, возвращающую Dependency1.

Попробуйте Dependency2 D1((Dependency1())); и просмотрите изменение в выводе.

Примечание:Если поставить лишнюю пару скобок, компилятор будет рассматривать (Dependency1()) как выражение.

1 голос
/ 24 декабря 2010

Dependency1 () создает временный объект типа Dependency1, который передается в функциональный тест.

...