调用函数,其名称本身就是类名?

时间:2011-10-24 00:13:06

标签: c++

我不知道他们使用什么方法,因为代码库巨大

它定义了一个这样的类:

class ABC {
    member_func(string c);
};

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

哪些代码可以让我们拨打ABC("");

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

2 个答案:

答案 0 :(得分:4)

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

UPDATE:在您发布的更新代码中,正在构建的内容再次是正在构造的ABC类型的临时对象,然后是类的非静态方法{ {1}}调用ABC正在调用member_func的构造函数创建的临时函数。当然,为了使这段代码在“真实世界”中具有任何意义,对ABC的调用必须包含一些在类实例外可见的副作用(即,类实例可能包含一个数据成员,它是指向调用然后修改的某个共享内存对象的指针。虽然从你发布的代码示例中看起来似乎没有来自调用的任何副作用,但是对于所有意图和目的来说都是非操作......创建了一个临时的member_func类实例,它有一个在实例上调用的方法,然后对该实例的任何引用都会丢失,因为它没有在可从ABC的当前范围访问的内存位置中构建。

答案 1 :(得分: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);
}

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