2011-10-24 25 views
2

我不知道他们使用什么方法,因为代码库是巨大的调用函数的名字是类名本身?

它像这样定义一个类:

class ABC { 
    member_func(string c); 
}; 

main() { 
    ABC("").member_func("this random string"); 
} 

什么是缺少的代码,使我们打电话ABC("");

我没有看到任何地方创建该类的任何对象。

+0

还没有定义的函数或仿函数。 –

+0

这是一个函数调用或构造函数吗?它可以是任何这些。 –

回答

4

这只是构造一个ABC类型的对象,但不会初始化该对象的任何永久内存位置。也就是说,调用ABC构造函数创建的初始化对象是一个临时对象,在调用之后会丢失,因为它不是在可以在调用之后访问的内存位置(如堆栈中的自动变量,静态内存位置等等。因此,在“真实世界”中使用可用的调用的“缺失”代码是实际命名构建的对象,以便稍后可以访问该对象...例如,类似于ABC my_object("");ABC my_object = ABC("");

UPDATE:在您发布更新后的代码,这是怎么发生的又是正在建设ABC类型的临时对象,然后ABC类的非静态方法称为member_func正在呼吁临时这是通过调用ABC的构造函数创建的。当然,对于这个代码来说,在“真实世界”中有任何意义,对member_func的调用必须包含一些在类实例外可见的副作用(即,类实例可能包含数据成员这是一个指向调用然后修改的某个共享内存对象的指针)。因为尽管从你发布的代码示例看来,这个调用似乎没有任何副作用,但它的所有意图和目的都是非操作的......一个临时的ABC类实例被创建,它有一个名为在实例上,然后对该实例的任何引用都会丢失,因为它不在可从当前范围main()访问的内存位置中构建。

+0

实际呼叫不是ABC(“”);但它的ABC(“”)。member_func(); 让我更新在真正的问题本身 – PnotNP

+0

在走下bjarne stroustroup道路之后,我认为C++的一个微妙和非常重要的概念是**临时**。 – PnotNP

3
class ABC 
{ 
    std::string d; 
public: 
    ABC(std::string x)   // For the ABC(""). 
    { d = x; } 

    void foo(std::string x) // For the foo(""). 
    { std::cout << d << std::endl << x << std::endl; } 
}; 

int main() 
{ 
    ABC("This creates a temporary object.").foo("This calls foo()."); 

    // Is the same as... 

    { 
     ABC obj("This creates another object."); 
     obj.foo("This calls obj.foo()."); 
    } // obj is destroyed. 

    return(0); 
} 

自我解释......我希望。 :)

相关问题