2010-12-24 20 views
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; 
} 

功能测试正在被呼叫,其中构造依赖关系1()被用作一个函数调用,而不是依赖关系1 ::依赖关系1()和代码运行完全正常。

现在,如果我用类似的概念创造Dependency2的对象D1,这是行不通的。 似乎我在这里做错了错误的理解。

需要知道编译器如何解析依赖关系1()在主通话,即使不使用范围解析和它为什么当我使用它作为Dependency2

谢谢, 的构造函数的参数不工作阿南德

回答

1

依赖关系1()创建类型依赖关系1的临时对象,被传递到功能测试。

+0

+1简单易懂,易于理解。 – 2010-12-24 05:28:13

+0

谢谢,但是为什么当我使用类似的东西来创建Dependency2对象时它不起作用。 – Anand 2010-12-24 05:30:26

+0

@Anand:看看我的答案。 – 2010-12-24 05:40:10

7

test(Dependency1())

此调用一个函数test并传递Dependency1类的临时对象。因为在test定义的形式参数是const参考,因为临时对象可以绑定到const引用您的代码工作。

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

这就是所谓的C++最令人头痛的解析。 D1被解释为函数返回Dependency2并采用参数指向函数返回Dependency1

尝试Dependency2 D1((Dependency1()));,看到在输出的变化。

注:把一对额外的括号将使编译器治疗(Dependency1())作为一种表达。

+0

比我的更重要。 – Oswald 2010-12-24 05:34:04

+0

太好了。谢谢。有没有其他方法可以让编译器将D1作为对象而不是函数? – Anand 2010-12-24 05:51:50

+0

@Prasoon:+1这个完美的答案。好工作:-) – Nawaz 2010-12-24 05:52:01