當a被銷燬時,在這段代碼中調用析構函數嗎?當我在extern裏面創建對象時調用C++類析構函數c
extern "C" {
int func()
{
A a(); // a is object of class A
}
}
當a被銷燬時,在這段代碼中調用析構函數嗎?當我在extern裏面創建對象時調用C++類析構函數c
extern "C" {
int func()
{
A a(); // a is object of class A
}
}
extern "C"
是鏈接時指令。它不會改變語言本身的工作方式。
因爲A a();
正在爲不帶參數的函數聲明函數原型並返回A
,所以在您的情況下不會調用析構函數。它確實不是創建一個A
的實例。 (見最令人頭痛的解析)。
如果您已經編寫A a;
,則默認的構造函數將與a
超出作用域的析構函數一起被調用。
功能名的語言聯動對功能的語義沒有影響。它隻影響在程序中看到名字的方式。
您的函數按預期行爲。 (雖然your expectations may differ從你寫的。)
extern "C"
限定隻影響函數如何被調用並對函數簽名施加一些約束。它不影響其實施。也就是說,如果你的函數中有一個對象,它將被構造和銷燬。
當然,在問題的代碼中實際上沒有創建對象,因爲A a();
是函數聲明。如果要真正地創建一個對象,並調用它的默認構造函數,你會使用,例如,下面的定義之一:
A a1 = A();
A a2{};
這樣的問題可以在家裏通過建立一個小的測試程序來回答:
#include <iostream>
struct A
{
~A() { std::cout << __func__ << std::endl; }
};
extern "C" {
int func()
{
A a; // a is object of class A
return 0;
}
}
int main()
{
func();
return 0;
}
預期輸出:
~A
答:是
您的評論是不正確。 –
這是C++代碼,而不是C代碼。請刪除'c'標籤 – user3629249