c++程式可以建立、銷毀、引用、訪問並操作物件
在c++中,乙個物件可以擁有這些性質
以下實體都不是物件:值,引用,函式,列舉項,型別,類的非靜態成員,模板,類或函式模板的特化,命名空間,形參包,和 this。
變數由宣告所引入,是乙個物件或不是對非靜態資料成員的引用。
物件能由定義、new 表示式、throw表示式
、更改聯合體
的活躍成員和求值要求臨時物件
的表示式顯示建立。顯式物件建立中建立的物件時唯一定義的
吟詩生存期型別
的物件也可以由下列操作隱式建立
呼叫下列物件表示複製函式,該情況下在目標儲存區域或結果中建立這種物件:
#include
struct x
;x *
makex()
#include
struct s };
voidf(
);s s2 = s1;
reinterpret_cast
<
unsigned
char
*>
(&s1)[2
]='b';
// 更改填充的第 2 位元組
assert
(s1 == s2)
;// 值並未更改
}
乙個物件可以擁有子物件。子物件包括
不是其他任何物件的子物件的物件稱為完整物件
如果子物件是下面之一,則它潛在重疊
完整物件、成員物件和陣列物件也被稱為最終派生物件,也便和基類子物件分開。既非潛在重疊亦非位域的物件的大小不能為零(基類子物件的大小可能為零,即使無 [[no_unique_address]] 也是如此 (c++20 起):參見空基類優化
乙個物件能含有其他物件,該情況下被含有的物件內嵌於前序物件。若符合下列條件,則物件 a 內嵌於另一物件 b :
任何兩個具有交疊的生存期的(非位域)物件必然有不同的位址,除非其中乙個物件內嵌於另乙個物件,或者兩個物件都是同乙個完整物件中的不同型別的子物件,且其中乙個是大小為零的子物件。
static
const
char c1 =
'x';
static
const
char c2 =
'x';
assert
(&c1 !=
&c2)
;// 值相同,位址不同
宣告或繼承了至少乙個虛函式的類型別的物件是多型物件每個多型物件中,實現都會儲存額外的資訊(在所有現存的實現中,如果沒被編譯器優化掉的話,這就是乙個指標),它被用於進行虛函式的呼叫,rtti 功能特性(dynamic_cast 和 typeid
)也用它在執行時確定物件建立時所用的型別,而不管使用它的表示式是什麼型別。
對於非多型物件,值的解釋方式由使用物件的表示式所確定,這在編譯器就已經決定了
// s 型別的物件可以在任何位址上分配
// 因為 s.a 和 s.b 都可以在任何位址上分配
struct s
;// 大小:2,對齊:1
// x 型別的物件只能在 4 位元組邊界上分配
// 因為 x.n 必須在 4 位元組邊界上分配
// 因為 int 的對齊要求(通常)就是 4
struct x
;// 大小:8,對齊:4
intmain()
最弱的對齊(最小的對齊要求)是char、signed char 和 unsigned char
的對齊,等於 1 ;所有型別中最大的基礎對齊(fundamental alignment)是實現定義的,並等於std::max_align_t
的對齊。 (c++11 起)
當使用 alignas 使某個型別的對齊比 std::max_align_t 的更嚴格(更大)時,稱其為具有擴充套件對齊要求的型別。
作用語法返回值:解釋:
#include
struct foo
;// 注:下面的 `alignas(alignof(long double))` 如果需要可以簡化為
標頭檔案原型
template
<
class
t>
struct alignment_of;
作用:
標頭檔案原型
void
*align
( std::size_t alignment,
std::size_t size,
void
*& ptr,
std::size_t& space )
;
引數:返回值:作用:官方文件:
標頭檔案原型
template
< std::size_t len, std::size_t align =
/*default-alignment*/
>
struct aligned_storage;
官方文件:
C C 程式設計基礎 基於物件的程式設計
拷貝建構函式 三種拷貝方式 淺拷貝 深拷貝以及寫時拷貝 淺拷貝 又稱位拷貝。將原物件或原陣列的引用直接賦給新物件,新陣列,新物件只是原物件的乙個引用 等號操作 只拷貝了的指標的值,實際上變成了多個指標物件指向同乙個位址,共用同一塊記憶體。例子如下 實際使用 當物件中的值不能進行改變是乙個const常...
C C 程式設計 列印變數或物件的位址
int a 0 char p hello printf a 輸出變數a的位址 printf p 輸出字串的位址c 中,可以使用如下形式 int a 0 const char p hello cout a endl 變數a的位址 cout static cast void a endl 變數a的位址 ...
c c 程式設計風格
1.程式設計風格 請寫出 bool flag 與 零值 比較的 if 語句。3分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if flag 0 請寫出 float x 與 零值 比較的 if 語句...