[英]Lifetime and memory setup of this struct
以以下形式給出結構(在main()
之前或之后聲明)
struct
{
...
} bar;
我不知道該如何管理以及如何處理此類對象。
總的來說,我想對此做個360°的回答,但我也有幾個問題:
static
結構? 對於最后一個,我在這里准備了一個小片段,該片段不起作用,但顯示了我要實現的目標。
它是未命名結構的全局對象。 您不能將此類型用作函數的參數(因為您不知道對象的真實類型)。 您可以為此使用decltype,但由於它是全局對象,因此不需要。 這是合法和安全的。
#include <iostream>
struct
{
double k1 = 0.123;
} bar;
int foo(decltype(bar)& a)
{
return a.k1-1;
};
int main()
{
std::cout << foo(bar) << std::endl;
return(0);
}
確實,由於您只有此結構的一個全局對象-您只需使用
#include <iostream>
struct
{
double k1 = 0.123;
} bar;
int foo()
{
return bar.k1-1;
};
int main()
{
std::cout << foo() << std::endl;
return(0);
}
這只是一個全局變量 。 您可以從此編譯單元中的任何函數或方法訪問它。 聲明它的正確方法(關於您的代碼段)將是:
struct foo
{
double k = 1.23;
};
foo bar;
現在,您可以像這樣簡單地通過引用傳遞它:
void f(foo & b)
{
b.k = 34.5;
}
在您的代碼段中,bar是類型為未命名結構的變量:
struct <unnamed>
{
double k = 1.23;
} bar;
由於您沒有為類型指定任何名稱,因此無法以經典方式將其作為參數傳遞給函數。 C ++ 11允許您使用decltype指令執行此操作:
struct
{
double k = 1.23;
} bar;
void f(decltype(bar) & b)
{
b.k = 3.45;
}
至於您的問題:
它與靜態結構不同。 靜態變量的行為略有不同。 靜態類(=結構)也是如此。
在C ++ 11中使用全局變量是合法且安全的,但強烈建議不要使用它們,因為它們很容易破壞程序的邏輯或體系結構。 相反,應該使用靜態類或單例。
否static
是存儲屬性。 struct
與任何其他數據類型一樣:它可以是static
, volatile
, auto
, extern
and
其他由某些實現定義的類型。
這是合法和安全的。
引用這樣的結構:
struct {
int field1, field2;
double yada, yada2, yada3;
} bar1, bar2;
bar1.yada3 = 3.14159265358979; // assign a field in the struct
bar2 = bar1; // copy contents of bar1 to bar2
1> bar只是其類型的單個實例。 您不能有其他與bar類型相同的實例。 它的類型是未命名類型struct,就像匿名聯合一樣。 擁有一個這樣的是合法的。 它更像是全局靜態的(但不是靜態的),只是因為您不能通過其他文件中的extern
關鍵字來引用它。任何黑客您都必須在其他文件中引用它...?
3>擁有它是合法的。
4>您不能聲明對您不知道類型的變量的引用。 盡管您可以在文件中的任何位置訪問/修改同一對象,所以無需引用。 引用主要用於從代碼中刪除*和->,否則引用完全可以通過指針進行。
這是否等於聲明
static
結構?
不,您可以像其他任何static
變量一樣使用static
關鍵字。 它聲明一個全局變量,即具有靜態存儲持續時間和外部鏈接,等效於:
struct Bar {...};
Bar bar;
在C ++ 11中合法和安全嗎?
是。
如何通過引用訪問欄?
由於類型沒有名稱,因此必須通過模板參數推導或在C ++ 11中進行推斷:
auto & ref = bar;
template <typename Bar> void bar_by_ref(Bar & bar) {
/* do something with bar */
}
另外,在C ++ 11中,可以通過decltype
提取類型:
decltype(bar) & ref = bar;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.