簡體   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