2

我正在尝试使用以下代码了解 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;
}

函数测试被调用,其中构造函数Dependency1()被用作函数调用,而不是Dependency1::Dependency1(),并且代码运行得非常好。

现在如果我使用类似的概念来创建 Dependency2 的对象 D1,它就不起作用。似乎我在这里做错了什么是基于错误的理解。

需要知道编译器如何在 main 中解析 Dependency1() 调用,即使没有使用范围解析,以及为什么当我将它用作Dependency2的构造函数中的参数时它不起作用

谢谢, 阿南德

4

2 回答 2

7

test(Dependency1())

这会调用一个函数test并传递一个临时对象 class Dependency1。因为定义中的形式参数test是对的引用,const并且因为临时对象可以绑定到const引用您的代码作品。

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

这被称为 C++ 最令人头疼的解析。D1被解释为一个函数返回Dependency2并接受一个指向函数返回的指针Dependency1

试着Dependency2 D1((Dependency1()));看看输出的变化。

注意:添加一对额外的括号会使编译器将(Dependency1())其视为表达式。

于 2010-12-24T05:30:47.787 回答
1

Dependency1() 创建一个类型为 Dependency1 的临时对象,该对象被传递给函数测试。

于 2010-12-24T05:24:46.343 回答