簡體   English   中英

&function_name在以下代碼中描述了什么

[英]what does &function_name depicts in the following code

我有以下代碼片段, &main&user在這里描述了什么? 每次運行時,為什么它賦予不同的值? 在什么情況下,傳遞&function_name是有用的?

int user()
{
      return 0;  
}

int main()
{
    int a, b = 0;
    a = ((int)&main);
    b = ((int)&user);
    cout << a <<" " << b;
    return 0;
}

它發送您的函數的地址。 每次運行時其不同的原因是,您的程序可能每次都不使用相同的內存空間。

&main為您提供主函數的地址,就像&var為您提供名為var的變量的地址一樣。 強制轉換為int可能有問題。 64位系統上的指針為64位寬,一個int可能不會那么長。

sbi 在這里很好地解釋了這一點

大多數示例都歸結為回調 :您調用函數f()傳遞另一個函數g()的地址,而f()調用g()進行某些特定任務。 如果傳遞f()代替h() f()的地址,則f()將代替回調h()

基本上,這是一種參數化函數的方法:它的某些行為不是硬編碼為f() ,而是硬編碼為回調函數。 通過傳遞不同的回調函數,調用者可以使f()行為不同。 一個經典的qsort()是C標准庫中的qsort() ,它將其排序標准作為指向比較函數的指針。

在C ++中,通常使用函數對象 (也稱為函子)來完成此操作。 這些對象使函數調用運算符過載,因此您可以像調用它們一樣調用它們。 例:

 class functor { public: void operator()(int i) {std::cout << "the answer is: " << i << '\\n';} }; functor f; f(42); 

其背后的想法是,與函數指針不同,函數對象不僅可以承載算法,還可以承載數據:

 class functor { public: functor(const std::string& prompt) : prompt_(prompt) {} void operator()(int i) {std::cout << prompt_ << i << '\\n';} private: std::string prompt_; }; functor f("the answer is: "); f(42); 

另一個優點是,內聯調用函數對象有時比通過函數指針進行調用要容易。 這就是為什么在C ++中進行排序有時比在C中進行排序更快的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM