繁体   English   中英

名称本身是类名的调用函数?

[英]calling function whose name is class name itself?

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

它定义了一个这样的类:

class ABC {
    member_func(string c);
};

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

什么使我们能够调用ABC("");缺少的代码ABC("");

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

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

更新:在您发布的更新代码中,正在发生的是再次构造了一个ABC类型的临时对象,然后在该调用所创建的临时对象上调用了名为member_func ABC类的非静态方法。交给ABC的构造函数。 当然,对于此代码在“现实世界”中具有任何含义,对member_func调用将必须包含一些在类实例外部可见的副作用(即,类实例可能包含一个数据成员) (指向该共享内存对象的指针,然后调用对其进行修改)。 尽管从您发布的代码示例来看,该调用似乎没有任何副作用,但出于所有目的和目的,它都是非操作的……创建了一个临时的ABC类实例,它有一个称为在实例上,然后对该实例的任何引用都将丢失,因为它不是在main()当前作用域可访问的内存位置中构造的。

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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM