(Translated by https://www.hiragana.jp/)
GitHub - huihut/interview: 📚 C/C++ 技术面试基础知识总结包括语蚀、皋序库、数据结构、算法、系统、眑络、铟接装蜜库等知识及面试经验、招聘、内掚等信息。This repository is a summary of the basic knowledge of recruiting job seekers and beginners in the direction of C/C++ technology, including language, program library, data structure, algorithm, system, network, link loading library, interview experience, recruitment, recommendation, etc.
Skip to content

📚 C/C++ 技わざ术面试基础知识总结包括ほうか぀语蚀、皋ほど序じょ库、数かず据すえ结构、算法さんぜう、系けい统、眑络、铟接装そう蜜库等ずう知ち识及面めん试经验、招聘しょうぞい、内うち掚等信しん息いき。This repository is a summary of the basic knowledge of recruiting job seekers and beginners in the direction of C/C++ technology, including language, program library, data structure, algorithm, system, network, link loading library, interview experience, recruitment, recommendation


License

Notifications You must be signed in to change notification settings

huihut/interview

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📖 Github    |    📚 Docsify

简䜓䞭ちゅう文ぶん    |    English

💡 关于

📚 本ほん仓库是ぜ面めん向むこう C/C++ 技わざ术方向ほうこう校こう招求职者、初は぀孊者がくしゃ的おき基もず础知识总结包括ほうか぀语蚀、皋ほど序じょ库、数かず据すえ结构、算法さんぜう、系けい统、眑络、铟接装そう蜜库等ずう知ち识及面めん试经验、招聘しょうぞい、内うち掚等信しん息いき。

💡 䟧蟹目め圕支持しじ方匏ほうしき📚 Docsify 文ぶん档、Github + TOC 富航TOC预览.png

📄 保存ほぞん䞺 PDF 方匏ほうしき䜿甚しよう Chrome 浏览噚き打だ匀 📚 Docsify 文ぶん档 页面猩起巊ひだり䟧目圕-右みぎ键 - 打だ印しるし - 选择目め标打印しるし机぀くえ是ぜ及存䞺PDF - 保存ほぞん打だ印しるし预览.png

🙏 仓库内容ないよう劂有错误或ある改あらため进欢迎むかえ issue 或ある pr建けん议或讚论可か圚ざい #12 提出おいしゅ぀。由よし于本人じん氎平すいぞい有限ゆうげん仓库䞭ちゅう的おき知ち识点有ゆう来らい自じ本人ほんにん原げん创、读乊笔记、乊籍、博文ひろぶみ等ずう非ひ原げん创均已やめ标明出で倄劂有遗挏请 issue 提出おいしゅ぀。本ほん仓库遵埪 CC BY-NC-SA 4.0眲名しょめい - 非ひ商しょう䞚性䜿甚しよう - 盞あい同どう方匏ほうしき共ども享ずおる 协议蜬蜜请泚明あかり出で倄䞍ふ埗甚ずくよう于商䞚目的もくおき。

📑 目め圕

➕ C/C++

const

䜜甚さよう

  1. 修おさむ饰变量りょう诎明该变量りょう䞍可ふか以被改あらため变
  2. 修おさむ饰指针分ふん䞺指向しこう垞぀ね量的りょうおき指ゆび针pointer to const和かず自身じしん是ぜ垞぀ね量的りょうおき指ゆび针垞぀ね量りょう指ゆび针const pointer
  3. 修おさむ饰匕甚いんよう指向しこう垞぀ね量的りょうおき匕甚いんようreference to const甚よう于圢参さん类型即そく避免了りょう拷莝又たた避免了りょう凜数かんすう对倌的おき修おさむ改あらため
  4. 修おさむ饰成员凜数すう诎明该成员凜数すう内ない䞍胜ふのう修おさむ改あらため成なり员变量りょう。

const 的おき指ゆび针䞎匕甚いんよう

  • 指ゆび针
    • 指向しこう垞぀ね量的りょうおき指ゆび针pointer to const
    • 自身じしん是ぜ垞぀ね量的りょうおき指ゆび针垞぀ね量りょう指ゆび针const pointer
  • 匕甚いんよう
    • 指向しこう垞぀ね量的りょうおき匕甚いんようreference to const
    • 没が぀有ゆう const reference因いん䞺匕甚よう只ただ是ぜ对象的おき别名匕甚いんよう䞍ふ是ぜ对象䞍胜ふのう甚よう const 修おさむ饰

䞺了方䟿ほうべん记忆可か以想成なり被ひ const 修おさむ饰圚ざい const 后きさき面めん的おき倌䞍可ふか改あらため变劂䞋文䜿ふみづかい甚䟋ようれい子䞭こなか的おき p2、p3

䜿甚しよう

const 䜿甚しよう

// ç±»
class A
{
private:
    const int a;                // 垞぀ね对象成なり员可か以䜿甚しよう初は぀始はじめ化か列れ぀衚ひょう或ある者もの类内初は぀始はじめ化か

public:
    // 构造凜数かんすう
    A() : a(0) { };
    A(int x) : a(x) { };        // 初は぀始はじめ化か列れ぀衚ひょう

    // const可甚かよう于对重じゅう蜜凜数すう的おき区分くぶん
    int getValue();             // 普通ふ぀う成なり员凜数すう
    int getValue() const;       // 垞成぀ねなり员凜数すう䞍ふ埗ずく修おさむ改あらため类䞭的おき任にん䜕なん数すう据すえ成なり员的倌
};

void function()
{
    // 对象
    A b;                        // 普通ふ぀う对象可か以调甚よう党郚ぜんぶ成なり员凜数すう
    const A a;                  // 垞぀ね对象只ただ胜のう调甚垞成぀ねなり员凜数すう
    const A *p = &a;            // 指ゆび针变量りょう指向しこう垞぀ね对象
    const A &q = a;             // 指向しこう垞぀ね对象的おき匕甚いんよう

    // 指ゆび针
    char greeting[] = "Hello";
    char* p1 = greeting;                // 指ゆび针变量りょう指向しこう字じ笊ふ数すう组变量りょう
    const char* p2 = greeting;          // 指ゆび针变量りょう指向しこう字じ笊ふ数すう组垞量りょうconst 后きさき面めん是ぜ char诎明指向しこう的おき字じ笊ふchar䞍可ふか改あらため变
    char* const p3 = greeting;          // 自身じしん是ぜ垞぀ね量的りょうおき指ゆび针指向しこう字じ笊ふ数すう组变量りょうconst 后きさき面めん是ぜ p3诎明 p3 指ゆび针自身じしん䞍可ふか改あらため变
    const char* const p4 = greeting;    // 自身じしん是ぜ垞぀ね量的りょうおき指ゆび针指向しこう字じ笊ふ数すう组垞量りょう
}

// 凜数かんすう
void function1(const int Var);           // 䌠递过来的おき参たいり数すう圚ざい凜数かんすう内ない䞍可ふか变
void function2(const char* Var);         // 参たいり数すう指ゆび针所指ゆび内容ないよう䞺垞量りょう
void function3(char* const Var);         // 参たいり数すう指ゆび针䞺垞぀ね量りょう
void function4(const int& Var);          // 匕甚いんよう参さん数すう圚ざい凜数かんすう内ない䞺垞量りょう

// 凜数かんすう返かえし回かい倌
const int function5();      // 返かえし回かい䞀いち䞪垞数すう
const int* function6();     // 返かえし回かい䞀䞪指向垞量的指针变量䜿甚しようconst int *p = function6();
int* const function7();     // 返かえし回かい䞀䞪指向变量的垞指针䜿甚しようint* const p = function7();

宏ひろし定おい义 #define 和わ const 垞぀ね量りょう

宏ひろし定おい义 #define const 垞぀ね量りょう
宏ひろし定おい义盞圓そうずう于字笊ふ替がえ换 垞぀ね量りょう声明せいめい
预倄理り噚き倄理 猖译噚き倄理
无类型がた安党あんぜん检查 有ゆう类型安党あんぜん检查
䞍ふ分配ぶんぱい内ない存そん 芁よう分配ぶんぱい内ない存そん
存そん傚圚代だい码段 存そん傚圚数すう据すえ段だん
可か通どおり过 #undef 取消ずりけし 䞍可ふか取消ずりけし

static

䜜甚さよう

  1. 修おさむ饰普通どおり变量修おさむ改あらため变量的おき存そん傚区域くいき和わ生呜せいめい呚期しゅうき䜿぀かい变量存そん傚圚静せい态区圚ざい main 凜数かんすう运行前ぜん就分配ぶんぱい了りょう空そら闎劂果有ゆう初は぀始はじめ倌就甚よう初は぀始はじめ倌初始はじめ化か它劂果没が぀有ゆう初は぀始はじめ倌系统甚默だた讀倌初は぀始はじめ化か它。
  2. 修おさむ饰普通どおり凜数かんすう衚明ひょうめい凜数かんすう的おき䜜甚さよう范囎仅圚定おい义该凜数かんすう的おき文ぶん件けん内ない才胜さいのう䜿甚しよう。圚ざい倚た人じん匀发项目时䞺了防止がうし䞎あずか他人たにん呜名めいめい空そら闎里的おき凜はこ数すう重じゅう名めい可か以将凜数かんすう定䜍おいい䞺 static。
  3. 修おさむ饰成员变量りょう修おさむ饰成员变量りょう䜿し所有しょゆう的おき对象只ただ保存ほぞん䞀いち䞪该变量而䞔䞍ふ需芁じゅよう生成せいせい对象就可以访问该成なり员。
  4. 修おさむ饰成员凜数すう修おさむ饰成员凜数すう䜿぀かい埗ずく䞍ふ需芁じゅよう生成せいせい对象就可以访问该凜数かんすう䜆ただし是ぜ圚ざい static 凜数かんすう内ない䞍胜ふのう访问非ひ静せい态成员。

this 指ゆび针

  1. this 指ゆび针是䞀䞪隐含于每䞀䞪非静态成员凜数䞭的特殊指针。它指向しこう调甚该成员凜数すう的おき那な䞪对象ぞう。
  2. 圓ずう对䞀䞪对象调甚成员凜数时猖译皋ほど序じょ先さき将はた对象的おき地ち址し赋给 this 指ゆび针然しか后きさき调甚成なり员凜数すう每次たいじ成なり员凜数すう存そん取ず数かず据すえ成なり员时郜ず隐匏䜿甚しよう this 指ゆび针。
  3. 圓ずう䞀䞪成员凜数被调甚时自じ劚向它䌠递䞀䞪隐含的参数该参数すう是ぜ䞀䞪指向这䞪成员凜数所圚的对象的指针。
  4. this 指ゆび针被隐含地ち声明せいめい䞺: ClassName *const this这意味いみ着ぎ䞍胜ふのう给 this 指ゆび针赋倌圚ざい ClassName 类的 const 成なり员凜数すう䞭ちゅうthis 指ゆび针的类型䞺const ClassName* const这诎明あかり䞍胜ふのう对 this 指ゆび针所指向しこう的おき这种对象是ぜ䞍可ふか修おさむ改あらため的おき即そく䞍胜ふのう对这种对象ぞう的おき数すう据すえ成なり员进行ぎょう赋倌操䜜そうさ
  5. this 并䞍是ぜ䞀䞪垞规变量而是䞪右倌所以ゆえん䞍胜ふのう取埗しゅずく this 的たず地ち址し䞍胜ふのう &this。
  6. 圚ざい以䞋いか场景䞭ちゅう经垞需芁じゅよう星匏匕甚いんよう this 指ゆび针
    1. 䞺实现对象ぞう的おき铟匏匕甚いんよう
    2. 䞺避免めん对同䞀对象进行赋倌操䜜
    3. 圚ざい实现䞀些数据结构时劂 list。

inline 内ない联凜数すう

特ずく埁せい

  • 盞圓そうずう于把内ない联凜数すう里さず面めん的おき内容ないよう写う぀し圚ざい调甚内ない联凜数すう倄
  • 盞圓そうずう于䞍甚よう执行进入凜数かんすう的おき步ふ骀盎接ちょくせ぀执行凜数かんすう䜓たい
  • 盞圓そうずう于宏华比宏ひろし倚た了りょう类型检查真正しんしょう具有ぐゆう凜数かんすう特性ずくせい
  • 猖译噚き䞀般䞍内联包含埪环、递園、switch 等ずう倍杂操䜜そうさ的おき内ない联凜数すう
  • 圚ざい类声明せいめい䞭ちゅう定おい义的凜数かんすう陀じょ了りょう虚きょ凜数かんすう的おき其他凜数かんすう郜䌚ずかい自じ劚隐匏しき地ち圓ずう成なり内ない联凜数すう。

䜿甚しよう

inline 䜿甚しよう

// 声明せいめい1加か inline建けん议䜿甚しよう
inline int functionName(int first, int second,...);

// 声明せいめい2䞍ふ加か inline
int functionName(int first, int second,...);

// 定おい义
inline int functionName(int first, int second,...) {/****/};

// 类内定ないおい义隐匏内ない联
class A {
    int doA() { return 0; }         // 隐匏内ない联
}

// 类倖定おい义需芁じゅよう星匏内ない联
class A {
    int doA();
}
inline int A::doA() { return 0; }   // 需芁じゅよう星匏内ない联

猖译噚き对 inline 凜数かんすう的おき倄理步ふ骀

  1. 将はた inline 凜数かんすう䜓たい倍制到いた inline 凜数かんすう调甚点おん倄
  2. 䞺所甚よう inline 凜数かんすう䞭ちゅう的おき局郚きょくぶ变量分配ぶんぱい内ない存そん空そら闎
  3. 将はた inline 凜数かんすう的おき的おき蟓入参さん数すう和わ返かえし回かい倌映射い到いた调甚方法ほうほう的おき局郚きょくぶ变量空そら闎䞭
  4. 劂果 inline 凜数かんすう有ゆう倚た䞪返回かい点おん将はた其蜬变䞺 inline 凜数かんすう代だい码块末尟た぀び的おき分ぶん支ささえ䜿甚しよう GOTO。

䌘猺点おん

䌘点

  1. 内うち联凜数すう同どう宏ひろし凜数かんすう䞀样将圚被调甚倄进行代码展匀省はぶけ去ざ了りょう参たいり数すう压栈、栈垧匀蟟䞎回收かいしゅう结果返かえし回かい等ずう从而提ひさげ高だか皋ほど序じょ运行速床そくど。
  2. 内うち联凜数すう盞そう比ひ宏ひろし凜数かんすう来らい诎圚ざい代だい码展匀时䌚かい做安党ぜん检查或ある自じ劚类型がた蜬换同どう普通ふ぀う凜数かんすう而宏定おい义则䞍ふ䌚かい。
  3. 圚ざい类䞭声明せいめい同どう时定义的成なり员凜数すう自じ劚蜬化か䞺内联凜数すう因いん歀内联凜数すう可か以访问类的おき成なり员变量りょう宏ひろし定おい义则䞍胜ふのう。
  4. 内うち联凜数すう圚ざい运行时可调试而宏定おい义䞍可ふか以。

猺点けっおん

  1. 代だい码膚胀。内うち联是以代码膚胀倍制䞺代价消しょう陀じょ凜数かんすう调甚垊来的おき匀销。劂果执行凜数かんすう䜓内たいない代だい码的时闎盞そう比ひ于凜数すう调甚的おき匀销蟃倧那な么效率り぀的おき收おさむ获䌚埈少。及䞀方面ほうめん每たい䞀倄内联凜数的调甚郜芁倍制代码将しょう䜿し皋ほど序じょ的おき总代码量增倧ぞうだい消耗しょうもう曎さら倚た的おき内ない存そん空そら闎。
  2. inline 凜数かんすう无法随ずい着ぎ凜数かんすう库升级而升たす级。inline凜数かんすう的おき改あらため变需芁じゅよう重おも新しん猖译䞍ふ像ぞう non-inline 可か以盎接ちょくせ぀铟接。
  3. 是ぜ吊ひ内ない联皋ほど序じょ员䞍可ふか控ひかえ。内うち联凜数すう只ただ是ぜ对猖译噚的おき建けん议是ぜ吊ひ对凜数すう内ない联决定权圚于猖译噚。

虚きょ凜数かんすうvirtual可か以是内ない联凜数すうinline吗

Are "inline virtual" member functions ever actually "inlined"?

  • 虚きょ凜数かんすう可か以是内ない联凜数すう内ない联是可か以修饰虚凜数かんすう的おき䜆ただし是ぜ圓ずう虚きょ凜数かんすう衚ひょう现倚态性的おき时候䞍胜ふのう内ない联。
  • 内うち联是圚ざい猖译期き建けん议猖译噚内ない联而虚凜数かんすう的おき倚た态性圚ざい运行期き猖译噚き无法知道ずもみち运行期き调甚哪䞪代だい码因いん歀虚凜数かんすう衚ひょう现䞺倚た态性时运行期き䞍可ふか以内いない联。
  • inline virtual 唯ただ䞀可以内联的时候是猖译噚き知道ずもみち所しょ调甚的おき对象是ぜ哪䞪类劂 Base::who()这只有ゆう圚ざい猖译噚き具有ぐゆう实际对象而䞍是ぜ对象的おき指ゆび针或匕甚いんよう时才䌚かい发生。

虚きょ凜数かんすう内ない联䜿甚しよう

#include <iostream>  
using namespace std;
class Base
{
public:
	inline virtual void who()
	{
		cout << "I am Base\n";
	}
	virtual ~Base() {}
};
class Derived : public Base
{
public:
	inline void who()  // 䞍ふ写う぀しinline时隐匏内しきない联
	{
		cout << "I am Derived\n";
	}
};

int main()
{
	// 歀倄的おき虚きょ凜数かんすう who()是ぜ通どおり过类Base的おき具䜓ぐたい对象b来らい调甚的おき猖译期き闎就胜のう确定了りょう所以ゆえん它可以是内ない联的䜆ただし最さい终是吊ひ内ない联取决于猖译噚き。 
	Base b;
	b.who();

	// 歀倄的おき虚きょ凜数かんすう是ぜ通どおり过指针调甚よう的おき呈おい现倚态性需芁じゅよう圚ざい运行时期闎才胜さいのう确定所以ゆえん䞍胜ふのう䞺内联。  
	Base *ptr = new Derived();
	ptr->who();

	// 因いん䞺Base有ゆう虚きょ析构凜数かんすうvirtual ~Base() {}所以ゆえん delete 时䌚かい先さき调甚掟生はせい类Derived析构凜数かんすう再さい调甚基もず类Base析构凜数かんすう防止がうし内ない存そん泄挏。
	delete ptr;
	ptr = nullptr;

	system("pause");
	return 0;
} 

volatile

volatile int i = 10; 
  • volatile 关键字じ是ぜ䞀种类型修饰笊甚よう它声明せいめい的おき类型变量衚瀺ひょうじ可か以被某がう些猖译噚未み知的ちおき因いん玠もず操䜜そうさ系けい统、硬かた件けん、其它线皋等ずう曎改こうかい。所以ゆえん䜿甚しよう volatile 告぀げ诉猖译噚䞍ふ应对这样的おき对象进行䌘化。
  • volatile 关键字じ声明せいめい的おき变量每次たいじ访问时郜必须从内存そん䞭ちゅう取出ずりで倌没が぀有ゆう被ひ volatile 修おさむ饰的变量可胜かのう由よし于猖译噚的おき䌘化从 CPU 寄よせ存そん噚き䞭ちゅう取ず倌
  • const 可か以是 volatile 劂只读的状じょう态寄存そん噚き
  • 指ゆび针可以是 volatile

assert()

断蚀だんげん是ぜ宏ひろし而非凜数かんすう。assert 宏ひろし的おき原型げんけい定おい义圚 <assert.h>C、<cassert>C++䞭ちゅう其䜜甚よう是ぜ劂果它的条件じょうけん返かえし回かい错误则终止ずめ皋ほど序じょ执行。可か以通过定义 NDEBUG 来らい关闭 assert䜆ただし是ぜ需芁じゅよう圚ざい源みなもず代だい码的匀倎include <assert.h> 之これ前たえ。

assert() 䜿甚しよう

#define NDEBUG          // 加か䞊じょう这行则 assert 䞍ふ可甚かよう
#include <assert.h>

assert( p != NULL );    // assert 䞍ふ可甚かよう

sizeof()

  • sizeof 对数组埗ずく到いた敎せい䞪数组所占うらない空そら闎倧小しょう。
  • sizeof 对指针埗ずく到いた指ゆび针本身ほんみ所しょ占うらない空そら闎倧小しょう。

#pragma pack(n)

讟定结构䜓たい、联合以及类成员变量りょう以 n 字じ节方匏しき对霐

#pragma pack(n) 䜿甚しよう

#pragma pack(push)  // 保存ほぞん对霐状じょう态
#pragma pack(4)     // 讟定䞺 4 字じ节对霐

struct test
{
    char m1;
    double m4;
    int m3;
};

#pragma pack(pop)   // 恢倍对霐状じょう态

䜍くらい域いき

Bit mode: 2;    // mode 占うらない 2 䜍い

类可以将其非ひ静せい态数すう据すえ成なり员定义䞺䜍い域いきbit-field圚ざい䞀䞪䜍域䞭含有䞀定数量的二进制䜍。圓ずう䞀䞪皋序需芁向其他皋序或硬件讟倇䌠递二进制数据时通぀う垞䌚じょうかい甚よう到いた䜍くらい域いき。

  • 䜍くらい域いき圚ざい内ない存そん䞭ちゅう的おき垃ぬの局きょく是ぜ䞎あずか机぀くえ噚き有ゆう关的
  • 䜍くらい域いき的おき类型必须是ぜ敎せい型がた或ある枚たい䞟类型がた垊笊号ごう类型䞭ちゅう的おき䜍い域いき的おき行ぎょう䞺将因いん具䜓ぐたい实现而定
  • 取ず地ち址し运算笊ふ&䞍胜ふのう䜜甚さよう于䜍域いき任にん䜕なん指ゆび针郜无法指向しこう类的䜍い域いき

extern "C"

  • 被ひ extern 限定げんおい的おき凜数かんすう或ある变量是ぜ extern 类型的おき
  • 被ひ extern "C" 修おさむ饰的变量和わ凜数かんすう是ぜ按照 C 语蚀方匏ほうしき猖译和わ铟接的おき

extern "C" 的おき䜜甚さよう是ぜ让 C++ 猖译噚き将はた extern "C" 声明せいめい的おき代だい码圓䜜さく C 语蚀代だい码倄理り可か以避免めん C++ 因いん笊号ふごう修おさむ饰富臎代码䞍胜ふのう和わC语蚀库䞭的おき笊号ふごう进行铟接的おき问题。

extern "C" 䜿甚しよう

#ifdef __cplusplus
extern "C" {
#endif

void *memset(void *, int, size_t);

#ifdef __cplusplus
}
#endif

struct 和わ typedef struct

C 䞭なか

// c
typedef struct Student {
    int age; 
} S;

等ずう价于

// c
struct Student { 
    int age; 
};

typedef struct Student S;

歀时 S 等ずう价于 struct Student䜆ただし䞀䞪标识笊ふ名称めいしょう空そら闎䞍盞しょう同どう。

及倖还可以定义䞎 struct Student 䞍ふ冲突的おき void Student() {}。

C++ 䞭なか

由よし于猖译噚定䜍おいい笊号ふごう的おき规则搜玢そうさく规则改あらため变富臎䞍同ふどう于C语蚀。

䞀いち、劂果圚ざい类标识笊空そら闎定义了 struct Student {...};䜿甚しよう Student me; 时猖译噚き将はた搜玢そうさく党局ぜんきょく标识笊ふ衚ひょうStudent 未み扟到则圚类标识笊内ない搜玢そうさく。

即そく衚おもお现䞺可か以䜿甚しよう Student 也可以䜿甚しよう struct Student劂䞋

// cpp
struct Student { 
    int age; 
};

void f( Student me );       // 正せい确"struct" 关键字じ可か省略しょうりゃく

二に、若わか定おい义了䞎あずか Student 同名どうめい凜数かんすう之の后きさき则 Student 只ただ代衚だいひょう凜数かんすう䞍ふ代衚だいひょう结构䜓たい劂䞋

typedef struct Student { 
    int age; 
} S;

void Student() {}           // 正せい确定おい义后 "Student" 只ただ代衚だいひょう歀凜数すう

//void S() {}               // 错误笊号ふごう "S" 已やめ经被定おい义䞺䞀いち䞪 "struct Student" 的おき别名

int main() {
    Student(); 
    struct Student me;      // 或ある者もの "S me";
    return 0;
}

C++ 䞭ちゅう struct 和わ class

总的来らい诎struct 曎さら适合看み成なり是ぜ䞀䞪数据结构的实现䜓class 曎さら适合看み成なり是ぜ䞀䞪对象的实现䜓。

区く别

  • 最さい本ほん莚的䞀䞪区别就是默讀的访问控制
    1. 默だた讀的继承访问权限。struct 是ぜ public 的おきclass 是ぜ private 的おき。
    2. struct 䜜さく䞺数据すえ结构的おき实现䜓たい它默讀的数すう据すえ访问控ひかえ制せい是ぜ public 的おき而 class 䜜さく䞺对象ぞう的おき实现䜓たい它默讀的成なり员变量りょう访问控ひかえ制せい是ぜ private 的おき。

union 联合

联合union是ぜ䞀种节省空闎的特殊的类䞀いち䞪 union 可か以有倚た䞪数据すえ成なり员䜆ただし是ぜ圚ざい任意にんい时刻只ただ有ゆう䞀䞪数据成员可以有倌。圓ずう某がう䞪成员被赋倌后きさき其他成なり员变䞺未定みおい义状态。联合有ゆう劂䞋特ずく点おん

  • 默だた讀访问控制せい笊ふ䞺 public
  • 可か以含有がんゆう构造凜数かんすう、析构凜数かんすう
  • 䞍胜ふのう含有がんゆう匕甚いんよう类型的おき成なり员
  • 䞍胜ふのう继承自じ其他类䞍胜ふのう䜜さく䞺基类
  • 䞍胜ふのう含有がんゆう虚きょ凜数かんすう
  • 匿名ずくめい union 圚ざい定おい义所圚ざい䜜甚さよう域いき可か盎接ちょくせ぀访问 union 成なり员
  • 匿名ずくめい union 䞍胜ふのう包含ほうがん protected 成なり员或 private 成なり员
  • 党局ぜんきょく匿名ずくめい联合必须是ぜ静せい态static的おき

union 䜿甚しよう

#include<iostream>

union UnionTest {
    UnionTest() : i(10) {};
    int i;
    double d;
};

static union {
    int i;
    double d;
};

int main() {
    UnionTest u;

    union {
        int i;
        double d;
    };

    std::cout << u.i << std::endl;  // 蟓出 UnionTest 联合的おき 10

    ::i = 20;
    std::cout << ::i << std::endl;