色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言與C++面試知識點總結

Q4MP_gh_c472c21 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2022-05-12 14:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

相對而言,C語言C++相關的面試題比較少見,沒有Java方向寫的人那么多,這是一篇 C 語言與 C++面試知識點總結的文章,個人感覺非常難得,希望能對大家有所幫助。

const

作用

  1. 修飾變量,說明該變量不可以被改變;

  2. 修飾指針,分為指向常量的指針(pointer to const)和自身是常量的指針(常量指針,const pointer);

  3. 修飾引用,指向常量的引用(reference to const),用于形參類型,即避免了拷貝,又避免了函數對值的修改;

  4. 修飾成員函數,說明該成員函數內不能修改成員變量。

const 的指針與引用

  1. 指針
  • 指向常量的指針(pointer to const)
  • 自身是常量的指針(常量指針,const pointer)
  1. 引用
  • 指向常量的引用(reference to const)
  • 沒有 const reference,因為引用本身就是 const pointer

(為了方便記憶可以想成)被 const 修飾(在 const 后面)的值不可改變,如下文使用例子中的 p2、p3。

使用

// 類
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();

static

作用

  1. 修飾普通變量,修改變量的存儲區域和生命周期,使變量存儲在靜態區,在 main 函數運行前就分配了空間,如果有初始值就用初始值初始化它,如果沒有初始值系統用默認值初始化它。

  2. 修飾普通函數,表明函數的作用范圍,僅在定義該函數的文件內才能使用。在多人開發項目時,為了防止與他人命名空間里的函數重名,可以將函數定位為 static。

  3. 修飾成員變量,修飾成員變量使所有的對象只保存一個該變量,而且不需要生成對象就可以訪問該成員。

  4. 修飾成員函數,修飾成員函數使得不需要生成對象就可以訪問該函數,但是在 static 函數內不能訪問非靜態成員。

this 指針

  1. this 指針是一個隱含于每一個非靜態成員函數中的特殊指針。它指向調用該成員函數的那個對象。

  2. 當對一個對象調用成員函數時,編譯程序先將對象的地址賦給 this 指針,然后調用成員函數,每次成員函數存取數據成員時,都隱式使用 this 指針。

  3. 當一個成員函數被調用時,自動向它傳遞一個隱含的參數,該參數是一個指向這個成員函數所在的對象的指針。

  4. this 指針被隱含地聲明為: ClassNameconst this,這意味著不能給 this 指針賦值;在 ClassName 類的 const 成員函數中,this 指針的類型為:const ClassNameconst,這說明不能對 this 指針所指向的這種對象是不可修改的(即不能對這種對象的數據成員進行賦值操作);

  5. this 并不是一個常規變量,而是個右值,所以不能取得 this 的地址(不能 &this)。

在以下場景中,經常需要顯式引用 this 指針:

  • 為實現對象的鏈式引用;
  • 為避免對同一對象進行賦值操作;
  • 在實現一些數據結構時,如 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)。

優缺點


優點

  • 內聯函數同宏函數一樣將在被調用處進行代碼展開,省去了參數壓棧、棧幀開辟與回收,結果返回等,從而提高程序運行速度。
  • 內聯函數相比宏函數來說,在代碼展開時,會做安全檢查或自動類型轉換(同普通函數),而宏定義則不會。
  • 在類中聲明同時定義的成員函數,自動轉化為內聯函數,因此內聯函數可以訪問類的成員變量,宏定義則不能。
  • 內聯函數在運行時可調試,而宏定義不可以。

虛函數(virtual)可以是內聯函數(inline)嗎?


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

  • 虛函數可以是內聯函數,內聯是可以修飾虛函數的,但是當虛函數表現多態性的時候不能內聯。
  • 內聯是在編譯器建議編譯器內聯,而虛函數的多態性在運行期,編譯器無法知道運行期調用哪個代碼,因此虛函數表現為多態性時(運行期)不可以內聯。
  • inline virtual 唯一可以內聯的時候是:編譯器知道所調用的對象是哪個類(如 Base::who()),這只有在編譯器具有實際對象而不是對象的指針或引用時才會發生。

虛函數內聯使用

#include 
using namespace std;
class Base
{
public:
inline virtual void who()
{
cout << "I am Base
";
}
virtual ~Base() {}
};
class Derived : public Base
{
public:
inline void who() ?// 不寫inline時隱式內聯
{
cout << "I am Derived
";
}
};

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 宏的原型定義在 (C)、(C++)中,其作用是如果它的條件返回錯誤,則終止程序執行。可以通過定義 NDEBUG 來關閉 assert,但是需要在源代碼的開頭,include 之前。

assert() 使用

#define NDEBUG     // 加上這行,則 assert 不可用
#include 

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語言。

1.如果在類標識符空間定義了 struct Student {...};,使用 Student me; 時,編譯器將搜索全局標識符表,Student 未找到,則在類標識符內搜索。

即表現為可以使用 Student 也可以使用 struct Student,如下:

// cpp
struct Student {
  int age;
};

void f( Student me );    // 正確,"struct" 關鍵字可省略

2.若定義了與 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 更適合看成是一個對象的實現體。

區別:

最本質的一個區別就是默認的訪問控制

  • 默認的繼承訪問權限。struct 是 public 的,class 是 private 的。
  • struct 作為數據結構的實現體,它默認的數據訪問控制是 public 的,而 class 作為對象的實現體,它默認的成員變量訪問控制是 private 的。

union 聯合

聯合(union)是一種節省空間的特殊的類,一個 union 可以有多個數據成員,但是在任意時刻只有一個數據成員可以有值。當某個成員被賦值后其他成員變為未定義狀態。聯合有如下特點:

  • 默認訪問控制符為 public
  • 可以含有構造函數、析構函數
  • 不能含有引用類型的成員
  • 不能繼承自其他類,不能作為基類
  • 不能含有虛函數
  • 匿名 union 在定義所在作用域可直接訪問 union 成員
  • 匿名 union 不能包含 protected 成員或 private 成員
  • 全局匿名聯合必須是靜態(static)的

union 使用

#include

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; ?// 輸出全局靜態匿名聯合的 20

 ? ?i = 30;
 ? ?std::cout << i << std::endl; ? ?// 輸出局部匿名聯合的 30

 ? ?return 0;
}

C語言實現C++類

C 實現 C++ 的面向對象特性(封裝、繼承、多態)

  • 封裝:使用函數指針把屬性與方法封裝到結構體中
  • 繼承:結構體嵌套
  • 多態:父類與子類方法的函數指針不同

explicit(顯式)關鍵字

  • explicit 修飾構造函數時,可以防止隱式轉換和復制初始化
  • explicit 修飾轉換函數時,可以防止隱式轉換,但 按語境轉換 除外

explicit 使用

struct A
{
A(int) { }
operator bool() const { return true; }
};

struct B
{
explicit B(int) {}
explicit operator bool() const { return true; }
};

void doA(A a) {}

void doB(B b) {}

int main()
{
A a1(1);// OK:直接初始化
A a2 = 1;// OK:復制初始化
A a3{ 1 };// OK:直接列表初始化
A a4 = { 1 };// OK:復制列表初始化
A a5 = (A)1;// OK:允許 static_cast 的顯式轉換
doA(1);// OK:允許從 int 到 A 的隱式轉換
if (a1);// OK:使用轉換函數 A::operator bool() 的從 A 到 bool 的隱式轉換
bool a6(a1);// OK:使用轉換函數 A::operator bool() 的從 A 到 bool 的隱式轉換
bool a7 = a1;// OK:使用轉換函數 A::operator bool() 的從 A 到 bool 的隱式轉換
bool a8 = static_cast(a1); // OK :static_cast 進行直接初始化

B b1(1);// OK:直接初始化
B b2 = 1;// 錯誤:被 explicit 修飾構造函數的對象不可以復制初始化
B b3{ 1 };// OK:直接列表初始化
B b4 = { 1 };// 錯誤:被 explicit 修飾構造函數的對象不可以復制列表初始化
B b5 = (B)1;// OK:允許 static_cast 的顯式轉換
doB(1);// 錯誤:被 explicit 修飾構造函數的對象不可以從 int 到 B 的隱式轉換
if (b1);// OK:被 explicit 修飾轉換函數 B::operator bool() 的對象可以從 B 到 bool 的按語境轉換
bool b6(b1);// OK:被 explicit 修飾轉換函數 B::operator bool() 的對象可以從 B 到 bool 的按語境轉換
bool b7 = b1;// 錯誤:被 explicit 修飾轉換函數 B::operator bool() 的對象不可以隱式轉換
bool b8 = static_cast(b1); // OK:static_cast 進行直接初始化

return 0;
}

friend 友元類和友元函數

  • 能訪問私有成員
  • 破壞封裝性
  • 友元關系不可傳遞
  • 友元關系的單向性
  • 友元聲明的形式及數量不受限制

using

using 聲明

一條 using 聲明 語句一次只引入命名空間的一個成員。它使得我們可以清楚知道程序中所引用的到底是哪個名字。如:

using namespace_name::name;

構造函數的 using 聲明

在 C++11 中,派生類能夠重用其直接基類定義的構造函數。

class Derived : Base {
public:
  using Base::Base;
  /* ... */
};

如上 using 聲明,對于基類的每個構造函數,編譯器都生成一個與之對應(形參列表完全相同)的派生類構造函數。生成如下類型構造函數:Derived(parms) : Base(args) { }

using 指示

using 指示 使得某個特定命名空間中所有名字都可見,這樣我們就無需再為它們添加任何前綴限定符了。如:

using namespace_name name;

盡量少使用 using 指示 污染命名空間

一般說來,使用 using 命令比使用 using 編譯命令更安全,這是由于它只導入了指定的名稱。如果該名稱與局部名稱發生沖突,編譯器將發出指示。using編譯命令導入所有的名稱,包括可能并不需要的名稱。如果與局部名稱發生沖突,則局部名稱將覆蓋名稱空間版本,而編譯器并不會發出警告。另外,名稱空間的開放性意味著名稱空間的名稱可能分散在多個地方,這使得難以準確知道添加了哪些名稱。

using 使用

盡量少使用 using 指示

using namespace std;

應該多使用 using 聲明

int x;
std::cin >> x ;
std::cout << x << std::endl;

或者

using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;

:: 范圍解析運算符

分類

  1. 全局作用域符(::name):用于類型名稱(類、類成員、成員函數、變量等)前,表示作用域為全局命名空間
  2. 類作用域符(class::name):用于表示指定類型的作用域范圍是具體某個類的
  3. 命名空間作用域符(namespace::name):用于表示指定類型的作用域范圍是具體某個命名空間的

:: 使用

int count = 11;     // 全局(::)的 count

class A {
public:
static int count;  // 類 A 的 count(A::count)
};
int A::count = 21;

void fun()
{
int count = 31;   // 初始化局部的 count 為 31
count = 32;     // 設置局部的 count 的值為 32
}

int main() {
::count = 12;    // 測試 1:設置全局的 count 的值為 12

A::count = 22;   // 測試 2:設置類 A 的 count 為 22

fun();    // 測試 3

return 0;
}

enum 枚舉類型

定作用域的枚舉類型

enum class open_modes { input, output, append };

不限定作用域的枚舉類型

enum color { red, yellow, green };
 
enum { floatPrec = 6, doublePrec = 10 };

decltype

decltype 關鍵字用于檢查實體的聲明類型或表達式的類型及值分類。語法:

decltype ( expression )

decltype 使用

// 尾置返回允許我們在參數列表之后聲明返回類型
template 
auto fcn(It beg, It end) -> decltype(*beg)
{
  // 處理序列
  return *beg;  // 返回序列中一個元素的引用
}
// 為了使用模板參數成員,必須用 typename
template 
auto fcn2(It beg, It end) -> typename remove_reference::type
{
  // 處理序列
  return *beg;  // 返回序列中一個元素的拷貝
}

引用

左值引用

常規引用,一般表示對象的身份。

右值引用

右值引用就是必須綁定到右值(一個臨時對象、將要銷毀的對象)的引用,一般表示對象的值。

右值引用可實現轉移語義(Move Sementics)和精確傳遞(Perfect Forwarding),它的主要目的有兩個方面:

  • 消除兩個對象交互時不必要的對象拷貝,節省運算存儲資源,提高效率。
  • 能夠更簡潔明確地定義泛型函數。

引用折疊

  • X& &、X& &&、X&& & 可折疊成 X&
  • X&& && 可折疊成 X&&

宏定義可以實現類似于函數的功能,但是它終歸不是函數,而宏定義中括弧中的“參數”也不是真的參數,在宏展開的時候對 “參數” 進行的是一對一的替換。

成員初始化列表

好處

  1. 更高效:少了一次調用默認構造函數的過程。
  2. 有些場合必須要用初始化列表:
  • 常量成員,因為常量只能初始化不能賦值,所以必須放在初始化列表里面
  • 引用類型,引用必須在定義的時候初始化,并且不能重新賦值,所以也要寫在初始化列表里面
  • 沒有默認構造函數的類類型,因為使用初始化列表可以不必調用默認構造函數來初始化

initializer_list 列表初始化

用花括號初始化器列表初始化一個對象,其中對應構造函數接受一個 std::initializer_list 參數.

initializer_list 使用

#include 
#include 
#include 
 
template 
struct S {
  std::vector v;
  S(std::initializer_list l) : v(l) {
     std::cout << "constructed with a " << l.size() << "-element list
";
 ? ?}
 ? ?void append(std::initializer_list l) {
    v.insert(v.end(), l.begin(), l.end());
  }
  std::pair c_arr() const {
    return {&v[0], v.size()}; // 在 return 語句中復制列表初始化
                  // 這不使用 std::initializer_list
  }
};
 
template 
void templated_fn(T) {}
 
int main()
{
  S s = {1, 2, 3, 4, 5}; // 復制初始化
  s.append({6, 7, 8});   // 函數調用中的列表初始化
 
  std::cout << "The vector size is now " << s.c_arr().second << " ints:
";
 
 ? ?for (auto n : s.v)
 ? ? ? ?std::cout << n << ' ';
 ? ?std::cout << '
';
 
 ? ?std::cout << "Range-for over brace-init-list: 
";
 
 ? ?for (int x : {-1, -2, -3}) // auto 的規則令此帶范圍 for 工作
 ? ? ? ?std::cout << x << ' ';
 ? ?std::cout << '
';
 
 ? ?auto al = {10, 11, 12}; ? // auto 的特殊規則
 
 ? ?std::cout << "The list bound to auto has size() = " << al.size() << '
';
 
// ?  templated_fn({1, 2, 3}); // 編譯錯誤!“ {1, 2, 3} ”不是表達式,
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 它無類型,故 T 無法推導
 ? ?templated_fn>({1, 2, 3}); // OK
  templated_fn>({1, 2, 3});      // 也 OK
}

面向對象

面向對象程序設計(Object-oriented programming,OOP)是種具有對象概念的程序編程典范,同時也是一種程序開發的抽象方針。

面向對象特征

面向對象三大特征 —— 封裝、繼承、多態

封裝

把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。關鍵字:public, protected, private。不寫默認為 private。

  • public 成員:可以被任意實體訪問
  • protected 成員:只允許被子類及本類的成員函數訪問
  • private 成員:只允許被本類的成員函數、友元類或友元函數訪問

繼承

  • 基類(父類)——> 派生類(子類)

多態

  1. 多態,即多種狀態(形態)。簡單來說,我們可以將多態定義為消息以多種形式顯示的能力。
  2. 多態是以封裝和繼承為基礎的。
  3. C++ 多態分類及實現:
  • 重載多態(Ad-hoc Polymorphism,編譯期):函數重載、運算符重載
  • 子類型多態(Subtype Polymorphism,運行期):虛函數
  • 參數多態性(Parametric Polymorphism,編譯期):類模板、函數模板
  • 強制多態(Coercion Polymorphism,編譯期/運行期):基本類型轉換、自定義類型轉換

靜態多態(編譯期/早綁定)

函數重載

class A
{
public:
  void do(int a);
  void do(int a, int b);
};

動態多態(運行期期/晚綁定)

  • 虛函數:用 virtual 修飾成員函數,使其成為虛函數

注意

  • 普通函數(非類成員函數)不能是虛函數
  • 靜態函數(static)不能是虛函數
  • 構造函數不能是虛函數(因為在調用構造函數時,虛表指針并沒有在對象的內存空間中,必須要構造函數調用完成后才會形成虛表指針)
  • 內聯函數不能是表現多態性時的虛函數,解釋見:虛函數(virtual)可以是內聯函數(inline)嗎?

動態多態使用

class Shape           // 形狀類
{
public:
  virtual double calcArea()
  {
    ...
  }
  virtual ~Shape();
};
class Circle : public Shape   // 圓形類
{
public:
  virtual double calcArea();
  ...
};
class Rect : public Shape    // 矩形類
{
public:
  virtual double calcArea();
  ...
};
int main()
{
  Shape * shape1 = new Circle(4.0);
  Shape * shape2 = new Rect(5.0, 6.0);
  shape1->calcArea();     // 調用圓形類里面的方法
  shape2->calcArea();     // 調用矩形類里面的方法
  delete shape1;
  shape1 = nullptr;
  delete shape2;
  shape2 = nullptr;
  return 0;
}

虛析構函數

虛析構函數是為了解決基類的指針指向派生類對象,并用基類的指針刪除派生類對象。

虛析構函數使用

class Shape
{
public:
  Shape();          // 構造函數不能是虛函數
  virtual double calcArea();
  virtual ~Shape();      // 虛析構函數
};
class Circle : public Shape   // 圓形類
{
public:
  virtual double calcArea();
  ...
};
int main()
{
  Shape * shape1 = new Circle(4.0);
  shape1->calcArea();
   delete shape1; // 因為Shape有虛析構函數,所以delete釋放內存時,先調用子類析構函數,再調用基類析構函數,防止內存泄漏。
  shape1 = NULL;
   return 0;
}

純虛函數

純虛函數是一種特殊的虛函數,在基類中不能對虛函數給出有意義的實現,而把它聲明為純虛函數,它的實現留給該基類的派生類去做。

virtual int A() = 0;

虛函數、純虛函數

  • 類里如果聲明了虛函數,這個函數是實現的,哪怕是空實現,它的作用就是為了能讓這個函數在它的子類里面可以被覆蓋(override),這樣的話,編譯器就可以使用后期綁定來達到多態了。純虛函數只是一個接口,是個函數的聲明而已,它要留到子類里去實現。
  • 虛函數在子類里面可以不重寫;但純虛函數必須在子類實現才可以實例化子類。虛函數的類用于 “實作繼承”,繼承接口的同時也繼承了父類的實現。
  • 純虛函數關注的是接口的統一性,實現由子類完成。
  • 帶純虛函數的類叫抽象類,這種類不能直接生成對象,而只有被繼承,并重寫其虛函數后,才能使用。抽象類被繼承后,子類可以繼續是抽象類,也可以是普通類。
  • 虛基類是虛繼承中的基類,具體見下文虛繼承。

虛函數指針、虛函數表

  • 虛函數指針:在含有虛函數類的對象中,指向虛函數表,在運行時確定。
  • 虛函數表:在程序只讀數據段(.rodata section,見:目標文件存儲結構),存放虛函數指針,如果派生類實現了基類的某個虛函數,則在虛表中覆蓋原本基類的那個虛函數指針,在編譯時根據類的聲明創建。

虛繼承

虛繼承用于解決多繼承條件下的菱形繼承問題(浪費存儲空間、存在二義性)。

底層實現原理與編譯器相關,一般通過虛基類指針和虛基類表實現,每個虛繼承的子類都有一個虛基類指針(占用一個指針的存儲空間,4字節)和虛基類表(不占用類對象的存儲空間)(需要強調的是,虛基類依舊會在子類里面存在拷貝,只是僅僅最多存在一份而已,并不是不在子類里面了);當虛繼承的子類被當做父類繼承時,虛基類指針也會被繼承。

實際上,vbptr 指的是虛基類表指針(virtual base table pointer),該指針指向了一個虛基類表(virtual table),虛表中記錄了虛基類與本類的偏移地址;通過偏移地址,這樣就找到了虛基類成員,而虛繼承也不用像普通多繼承那樣維持著公共基類(虛基類)的兩份同樣的拷貝,節省了存儲空間。

虛繼承、虛函數

  1. 相同之處:都利用了虛指針(均占用類的存儲空間)和虛表(均不占用類的存儲空間)
  2. 不同之處:

虛繼承

  • 虛基類依舊存在繼承類中,只占用存儲空間
  • 虛基類表存儲的是虛基類相對直接繼承類的偏移

虛函數

  • 虛函數不占用存儲空間
  • 虛函數表存儲的是虛函數地址

模板類、成員模板、虛函數

  • 模板類中可以使用虛函數
  • 一個類(無論是普通類還是類模板)的成員模板(本身是模板的成員函數)不能是虛函數

抽象類、接口類、聚合類

抽象類:含有純虛函數的類

接口類:僅含有純虛函數的抽象類

聚合類:用戶可以直接訪問其成員,并且具有特殊的初始化語法形式。滿足如下特點:

  • 所有成員都是 public
  • 沒有定義任何構造函數
  • 沒有類內初始化
  • 沒有基類,也沒有 virtual 函數

內存分配和管理

malloc、calloc、realloc、alloca


  1. malloc:申請指定字節數的內存。申請到的內存中的初始值不確定。
  2. calloc:為指定長度的對象,分配能容納其指定個數的內存。申請到的內存的每一位(bit)都初始化為 0。
  3. realloc:更改以前分配的內存長度(增加或減少)。當增加長度時,可能需將以前分配區的內容移到另一個足夠大的區域,而新增區域內的初始值則不確定。
  4. alloca:在棧上申請內存。程序在出棧的時候,會自動釋放內存。但是需要注意的是,alloca 不具可移植性, 而且在沒有傳統堆棧的機器上很難實現。alloca 不宜使用在必須廣泛移植的程序中。C99 中支持變長數組 (VLA),可以用來替代 alloca。

malloc、free

用于分配、釋放內存

malloc、free 使用

申請內存,確認是否申請成功

char *str = (char*) malloc(100);
assert(str != nullptr);

釋放內存后指針置空

free(p);
p = nullptr;

new、delete

  1. new / new[]:完成兩件事,先底層調用 malloc 分配了內存,然后調用構造函數(創建對象)。
  2. delete/delete[]:也完成兩件事,先調用析構函數(清理資源),然后底層調用 free 釋放空間。
  3. new 在申請內存時會自動計算所需字節數,而 malloc 則需我們自己輸入申請內存空間的字節數。

new、delete 使用

申請內存,確認是否申請成功

int main()
{
  T* t = new T();   // 先內存分配 ,再構造函數
  delete t;      // 先析構函數,再內存釋放
  return 0;
}

定位 new

定位 new(placement new)允許我們向 new 傳遞額外的地址參數,從而在預先指定的內存區域創建對象。

new (place_address) type
new (place_address) type (initializers)
new (place_address) type [size]
new (place_address) type [size] { braced initializer list }
  • place_address 是個指針
  • initializers 提供一個(可能為空的)以逗號分隔的初始值列表

delete this 合法嗎?

合法,但:

  • 必須保證 this 對象是通過 new(不是 new[]、不是 placement new、不是棧上、不是全局、不是其他對象成員)分配的
  • 必須保證調用 delete this 的成員函數是最后一個調用 this 的成員函數
  • 必須保證成員函數的 delete this 后面沒有調用 this 了
  • 必須保證 delete this 后沒有人使用了

定義只在堆(棧)生成對象類

只能在堆上

方法:將析構函數設置為私有

原因:C++ 是靜態綁定語言,編譯器管理棧上對象的生命周期,編譯器在為類對象分配棧空間時,會先檢查類的析構函數的訪問性。若析構函數不可訪問,則不能在棧上創建對象。

能在棧上

方法:將 new 和 delete 重載為私有

原因:在堆上生成對象,使用 new 關鍵詞操作,其過程分為兩階段:第一階段,使用 new 在堆上尋找可用內存,分配給對象;第二階段,調用構造函數生成對象。將 new 操作設置為私有,那么第一階段就無法完成,就不能夠在堆上生成對象。

智能指針

C++ 標準庫(STL)中

頭文件:#include

C++ 98

std::auto_ptr ps (new std::string(str));

C++ 11

對于該論述,歡迎讀者查閱之前發過的文章,你是《未來世界的幸存者》么?

3.7 分割線

可以在一行中用三個以上的減號來建立一個分隔線,同時需要在分隔線的上面空一行。如下:

  1. shared_ptr
  2. unique_ptr
  3. weak_ptr
  4. auto_ptr(被 C++11 棄用)
  • Class shared_ptr 實現共享式擁有(shared ownership)概念。多個智能指針指向相同對象,該對象和其相關資源會在 “最后一個 reference 被銷毀” 時被釋放。為了在結構較復雜的情景中執行上述工作,標準庫提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等輔助類。
  • Class unique_ptr 實現獨占式擁有(exclusive ownership)或嚴格擁有(strict ownership)概念,保證同一時間內只有一個智能指針可以指向該對象。你可以移交擁有權。它對于避免內存泄漏(resource leak)——如 new 后忘記 delete ——特別有用。

shared_ptr

多個智能指針可以共享同一個對象,對象的最末一個擁有著有責任銷毀對象,并清理與該對象相關的所有資源。

  • 支持定制型刪除器(custom deleter),可防范 Cross-DLL 問題(對象在動態鏈接庫(DLL)中被 new 創建,卻在另一個 DLL 內被 delete 銷毀)、自動解除互斥鎖

weak_ptr

weak_ptr 允許你共享但不擁有某對象,一旦最末一個擁有該對象的智能指針失去了所有權,任何 weak_ptr 都會自動成空(empty)。因此,在 default 和 copy 構造函數之外,weak_ptr 只提供 “接受一個 shared_ptr” 的構造函數。

  • 可打破環狀引用(cycles of references,兩個其實已經沒有被使用的對象彼此互指,使之看似還在 “被使用” 的狀態)的問題

unique_ptr

unique_ptr 是 C++11 才開始提供的類型,是一種在異常時可以幫助避免資源泄漏的智能指針。采用獨占式擁有,意味著可以確保一個對象和其相應的資源同一時間只被一個 pointer 擁有。一旦擁有著被銷毀或編程 empty,或開始擁有另一個對象,先前擁有的那個對象就會被銷毀,其任何相應資源亦會被釋放。

  • unique_ptr 用于取代 auto_ptr

auto_ptr

被 c++11 棄用,原因是缺乏語言特性如 “針對構造和賦值” 的 std::move 語義,以及其他瑕疵。

auto_ptr 與 unique_ptr 比較

  • auto_ptr 可以賦值拷貝,復制拷貝后所有權轉移;unqiue_ptr 無拷貝賦值語義,但實現了move 語義;
  • auto_ptr 對象不能管理數組(析構調用 delete),unique_ptr 可以管理數組(析構調用 delete[] );

強制類型轉換運算符

static_cast

  • 用于非多態類型的轉換
  • 不執行運行時類型檢查(轉換安全性不如 dynamic_cast)
  • 通常用于轉換數值數據類型(如 float -> int)
  • 可以在整個類層次結構中移動指針,子類轉化為父類安全(向上轉換),父類轉化為子類不安全(因為子類可能有不在父類的字段或方法)

dynamic_cast

  • 用于多態類型的轉換
  • 執行行運行時類型檢查
  • 只適用于指針或引用
  • 對不明確的指針的轉換將失敗(返回 nullptr),但不引發異常
  • 可以在整個類層次結構中移動指針,包括向上轉換、向下轉換

const_cast

  • 用于刪除 const、volatile 和 __unaligned 特性(如將 const int 類型轉換為 int 類型 )

reinterpret_cast

  • 用于位的簡單重新解釋
  • 濫用 reinterpret_cast 運算符可能很容易帶來風險。除非所需轉換本身是低級別的,否則應使用其他強制轉換運算符之一。
  • 允許將任何指針轉換為任何其他指針類型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之類的轉換,但其本身并不安全)
  • 也允許將任何整數類型轉換為任何指針類型以及反向轉換。
  • reinterpret_cast 運算符不能丟掉 const、volatile 或 __unaligned 特性。
  • reinterpret_cast 的一個實際用途是在哈希函數中,即,通過讓兩個不同的值幾乎不以相同的索引結尾的方式將值映射到索引。

bad_cast

  • 由于強制轉換為引用類型失敗,dynamic_cast 運算符引發 bad_cast 異常。

bad_cast 使用

try {
  Circle& ref_circle = dynamic_cast(ref_shape);
}
catch (bad_cast b) {
  cout << "Caught: " << b.what();
}

運行時類型信息 (RTTI)

dynamic_cast

  • 用于多態類型的轉換

typeid

  • typeid 運算符允許在運行時確定對象的類型
  • type_id 返回一個 type_info 對象的引用
  • 如果想通過基類的指針獲得派生類的數據類型,基類必須帶有虛函數
  • 只能獲取對象的實際類型

type_info

  • type_info 類描述編譯器在程序中生成的類型信息。此類的對象可以有效存儲指向類型的名稱的指針。type_info 類還可存儲適合比較兩個類型是否相等或比較其排列順序的編碼值。類型的編碼規則和排列順序是未指定的,并且可能因程序而異。
  • 頭文件:typeinfo

typeid、type_info 使用

#include 
using namespace std;

class Flyable            // 能飛的
{
public:
  virtual void takeoff() = 0;   // 起飛
  virtual void land() = 0;    // 降落
};
class Bird : public Flyable     // 鳥
{
public:
  void foraging() {...}      // 覓食
  virtual void takeoff() {...}
  virtual void land() {...}
  virtual ~Bird(){}
};
class Plane : public Flyable    // 飛機
{
public:
  void carry() {...}       // 運輸
  virtual void takeoff() {...}
  virtual void land() {...}
};

class type_info
{
public:
  const char* name() const;
  bool operator == (const type_info & rhs) const;
  bool operator != (const type_info & rhs) const;
  int before(const type_info & rhs) const;
  virtual ~type_info();
private:
  ...
};

void doSomething(Flyable *obj)         // 做些事情
{
  obj->takeoff();

  cout << typeid(*obj).name() << endl; ? ? ? ?// 輸出傳入對象類型("class Bird" or "class Plane")

 ? ?if(typeid(*obj) == typeid(Bird)) ? ? ? ? ? ?// 判斷對象類型
 ? ?{
 ? ? ? ?Bird *bird = dynamic_cast(obj); // 對象轉化
    bird->foraging();
  }

  obj->land();
}

int main(){
Bird *b = new Bird();
doSomething(b);
delete b;
b = nullptr;
return 0;
}

END
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7633

    瀏覽量

    142421
  • C++
    C++
    +關注

    關注

    22

    文章

    2119

    瀏覽量

    75679
  • 變量
    +關注

    關注

    0

    文章

    614

    瀏覽量

    29056

原文標題:C語言 / C++基礎面試知識大集合

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    技能+1!如何在樹莓派上使用C++控制GPIO?

    在使用樹莓派時,你會發現Python和Scratch是許多任務(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發表于 08-06 15:33 ?1846次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹莓派上哪種語言更優?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯網項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富的庫和資源而被
    的頭像 發表于 07-24 15:32 ?193次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹莓派上哪種<b class='flag-5'>語言</b>更優?

    C語言精彩編程百例-364頁

    大量經驗,從而可以熟練地進行C程序設計。 全文共分為四篇,全面、系統地講述了C語言各個方面的知識點和程序設計的基本方法,以及編寫程序過程中值得注意的地方,內容深入淺出,通俗易懂。對于
    發表于 06-13 17:28

    主流的 MCU 開發語言為什么是 C 而不是 C++

    在單片機的地界兒里,C語言穩坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉。先說內存這道坎兒。您當stm32f4的
    的頭像 發表于 05-21 10:33 ?519次閱讀
    主流的 MCU 開發<b class='flag-5'>語言</b>為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    C51單片機及C語言知識點必備秘籍

    單片機關鍵知識點一覽: 系列一 1:單片機簡敘 2:單片機引腳介紹 3:單片機存儲器結構 4:第一個單片機小程序 5:單片機延時程序分析 6:單片機并行口結構 7:單片機的特殊
    發表于 05-15 14:00

    C++學到什么程度可以找工作?

    C++學到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開發人員或相關職位,通常需要掌握以下幾個方面: 1. **語言基礎**:你需要對C++的核心概念有扎實的理解,包括但不
    發表于 03-13 10:19

    源代碼加密、源代碼防泄漏c/c++與git服務器開發環境

    源代碼加密對于很多研發性單位來說是至關重要的,當然每家企業的業務需求不同所用的開發環境及開發語言也不盡相同,今天主要來講一下c++及git開發環境的源代碼防泄密保護方案。企業源代碼泄密場景一、在很多
    的頭像 發表于 02-12 15:26 ?585次閱讀
    源代碼加密、源代碼防泄漏<b class='flag-5'>c</b>/<b class='flag-5'>c++</b>與git服務器開發環境

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發表于 01-14 09:40 ?715次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    語言調用,成為開發者和廠商面臨的重要挑戰。為解決這一痛,一款名為AKI (Alpha Kernel Interacting)的開源三方庫應運而生,它通過高效封裝跨語言調用接口,幫助開發者將
    發表于 01-02 17:08

    同樣是函數,在CC++中有什么區別

    同樣是函數,在 CC++ 中有什么區別? 第一個返回值。 C語言的函數可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++
    的頭像 發表于 11-29 10:25 ?975次閱讀

    接口測試理論、疑問收錄與擴展相關知識點

    本文章使用王者榮耀游戲接口、企業微信接口的展示結合理論知識,講解什么是接口測試、接口測試理論、疑問收錄與擴展相關知識點知識學院,快來一起看看吧~
    的頭像 發表于 11-15 09:12 ?799次閱讀
    接口測試理論、疑問收錄與擴展相關<b class='flag-5'>知識點</b>

    C7000 C/C++優化指南用戶手冊

    電子發燒友網站提供《C7000 C/C++優化指南用戶手冊.pdf》資料免費下載
    發表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優化指南用戶手冊

    TMS320C6000優化C/C++編譯器v8.3.x

    電子發燒友網站提供《TMS320C6000優化C/C++編譯器v8.3.x.pdf》資料免費下載
    發表于 11-01 09:35 ?1次下載
    TMS320<b class='flag-5'>C</b>6000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v8.3.x

    C語言C++中結構體的區別

    同樣是結構體,看看在C語言C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?838次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器
    主站蜘蛛池模板: 免费国产又色又爽又黄的软件 | 天天夜夜久久 | 成人wxx视频免费 | 国产午夜鲁丝片av无码 | 老头边吃奶边弄进去呻吟 | 色小说香蕉| 18禁美女黄网站色大片免费看 | 中文在线亚洲 | 国产精品视频免费播放 | 99国产精品久久久久久久 | 成人免费黄色网址 | 欧美性折磨bdsm激情另类视频 | 淫片一级国产 | 国产精品久久久久免费 | 久久久亚洲国产精品麻豆综合天堂 | 成人综合影院 | 绿帽在线 | 欧美一级视频一区 | 亚洲精品无码永久在线观看你懂的 | 综合狠狠| 精品国产一区二区三区久久狼黑人 | 国产妇女乱码一区二区三区 | 国产三级av在线播放 | 性做久久 | 91成熟丰满女人少妇尤物 | 日本大尺度吃奶呻吟视频 | 亚洲最大成人综合网720p | 欧美日韩国产成人一区 | 毛片女人18片毛片点击进入 | 三级黄色免费网站 | 国产鲁鲁视频在线观看免费 | 日韩在线视频播放 | 99av视频| 欧美不卡在线观看 | 波多野结衣亚洲视频 | 国产丝袜无码一区二区三区视频 | 自拍偷自拍亚洲精品偷一 | 美女赤身免费网站 | 99精品国产成人一区二区 | 亚洲成人一区 | av久久天堂三区 | 一个色综合导航 | 免费看一级黄色毛片 | 亚洲 欧美 偷自乱 图片 | 国产精品人人爱一区二区白浆 | 久久久久无码中 | 美女隐私视频黄www曰本 | 日本一级吃奶淫片免费 | 嫩草大剧院 | 国产成人亚洲精品 | 18性欧美xxxⅹ性满足 | 国产最新av | 国产精品国产三级国产专播品爱网 | 无尺码精品产品视频 | 国产精品白丝av嫩草影院 | 午夜老司机福利 | 国产麻豆天美果冻无码视频 | 香蕉视频免费在线 | 麻豆文化传媒精品一区观看 | 国内综合精品午夜久久资源 | 香蕉成人伊视频在线观看 | 国产一区二区91 | 91高清网站 | 色综合天天综合色综合av | 久久伊人操 | 九九三级| 免费观看男女性高视频 | 黄在线免费看 | 99久久精品国产同性同志 | 一本一道av中文字幕无码 | 成人在线视频一区 | 久久人人爽人人爽人人片av高请 | 国产精品国产三级国产专播i12 | 噜噜噜狠狠夜夜躁精品仙踪林 | 一二三四国产精品 | 一区二区福利 | 4444亚洲人成无码网在线观看 | 日韩mv欧美mv亚洲mv | 国产人妖在线视频 | 国产精品伦视频看免费三 | 亚洲国产综合av | 台湾佬美性中文网 | 亚洲综合欧美 | 久久69av | 人妻大战黑人白浆狂泄 | 调教+趴+乳夹+国产+精品 | 国产精品高潮呻吟视频 | 91精品国产综合久久香蕉的特点 | 999精品视频一区二区三区 | 第一次圆房bbwbbwbbw | 国产亚洲精品自拍 | 播五月婷婷 | 精品福利一区二区 | 超碰神马 | 国内精品偷拍视频 | 九九视频在线观看视频6 | 亚洲一区中文字幕在线观看 | 国产真人做爰毛片视频直播 | 四虎免费久久 | 91社区福利 | 婷婷六月综合 | 免费的很黄很污的视频 | 情欲少妇人妻100篇 国产精品日韩av在线播放 | 7777精品久久久大香线蕉小说 | 久久毛片网| 天堂二区| 国产欧美在线观看不卡 | 伊人网在线视频观看 | 在线免费观看黄网 | 成人免费网站黄 | 国产h视频在线观看 | 亚洲精品国产精品国自产 | 少妇无套内谢久久久久 | 最新版天堂资源中文在线 | 中文字幕一区二区三区精品 | 成人精品在线视频 | 黄色免费在线网站 | 91天天色| 一级欧美视频 | 天天摸天天舔天天操 | 免费看成年人网站 | 免费毛片在线播放免费 | 亚洲女同二女同志 | 成人妖精视频yjsp地址 | 女优中文字幕 | 警花系列乱肉辣文小说 | 91亚洲精品在线观看 | 亚洲人成人天堂 | 国产精品一区二区在线播放 | 国产精品欧美一区二区三区喷水 | 国产91对白在线观看九色 | 在线丨暗呦小u女国产精品 在线爽 | 久久久一 | 国产精品久久久久久久久久久久午夜 | 国产精品久久久久久久久鸭 | 两个人看的www在线观看 | 美女内内免费看 | 熟女人妇 成熟妇女系列视频 | 在线国产欧美 | 国产精品一区在线看 | 中国女人内射6xxxxx | 爱情岛论坛网亚洲品质 | 成人精品视频在线看 | 欧美日韩免费高清 | 一级日韩毛片 | 精品国产黄色片 | 亚洲日本va午夜中文字幕 | 色女人网站 | 亚洲日韩国产av无码无码精品 | 丝袜人妻一区二区三区 | 18中国xxxxxⅹxxx96 | 超碰色偷偷男人的天堂 | 亚洲欧美综合视频 | 又粗又黄又硬又爽的免费视频 | 成年在线网69站 | 久久九九看黄一片 | 国产99久久久国产精品成人免费 | 欧美在线一区二区三区 | 亚洲欧美国产精品专区久久 | 性做久久久久久免费观看欧美 | 国产精华xxx | 看免费真人视频网站 | 天天射天天拍 | 国产地址一 | www7788久久久久久久久 | 成人免费精品 | 美女的mm免费视频 | 美利坚合众国av | 久久9国产偷伦 | 中国一级片黄色一级片黄 | 红杏成av人影院在线观看 | 久久综合给久久狠狠97色 | 国产成人久久久精品免费澳门 | 婷婷开心色四房播播 | jzzijzzij日本成熟少妇 | 天天综合网天天综合狠狠躁 | 日韩成人动漫在线观看 | 日韩一级影视 | 久久99热狠狠色一区二区 | 国模冰莲极品自慰人体 | 中文字幕在线观看av | www.youjizz.com久久| 国产偷自视频区视频 | 亚洲色图欧洲色图 | 色综合天天 | 森林影视官网在线观看 | 久久丫精品国产 | 合欢视频在线观看 | 黄色一级片毛片 | 久热在线中文字幕色999舞 | 色哟哟网站在线观看 | 成人蜜桃视频 | 成人免费毛片男人用品 | 无码人妻精品一区二区三 | 中文字幕日本最新乱码视频 | 91手机在线视频 | 国产精品久久久国产盗摄 | 夜夜高潮夜夜爽夜夜爱爱一区 | 污视频免费在线观看 | 国产成人精品无码免费看 | 免费看成人av | 艳妇乳肉豪妇荡乳av | 91免费在线视频 | 屁屁影院一区二区三区 | 亚洲欧美在线成人 | 超碰在线观看免费版 | 国产免费黄色片 | 高清一区二区三区四区 | 日本黄色三级 | 国产成人精品久久二区二区 | 亚洲精品成人av在线 | 97人妻天天爽夜夜爽二区 | 中午字幕在线观看 | 久操国产在线 | 亚洲精品日韩欧美 | 免费人成视频网站在线观看18 | 国内精品久久久久久久影视麻豆 | 亚洲国产婷婷 | 黄色片在线| 日韩精品 中文字幕 视频在线 | 久久久久97国产 | 国产一区日本 | av天堂午夜精品一区 | 男男啪啪激烈高潮cc漫画免费 | 免费夜色污私人影院在线观看 | 中国美女一级黄色片 | 人成网站在线观看 | 成人性能视频在线 | 久久久久人妻精品一区三寸蜜桃 | 免费福利在线 | 无码人妻久久一区二区三区蜜桃 | 国产尻逼视频 | 日韩午夜片| 人妻少妇精品无码专区 | 亚洲一区精品视频 | 欧美福利一区二区 | 天堂va欧美ⅴa亚洲va一国产 | 黑人一级| 中文字幕人成乱码在线观看 | 韩国三级欧美三级国产三级 | 久久精品国产亚 | 无码专区3d动漫精品免费 | 91精品国产综合久久久久久 | 久久久噜噜噜久久中文福利 | 亚洲小视频在线观看 | 午夜影院入口 | 成人欧美日韩一区二区三区 | 国内自拍视频在线播放 | 亚洲无av在线中文字幕 | 亚洲精品大片www | 猫咪av在线| 韩国一级淫一片免费放 | 青青视频免费 | 黄色免费网站在线 | 久久久久久中文字幕 | 日韩欧美在线不卡 | 高潮久久久久久久久 | 亚洲射色| 波多野结衣一区二区三区中文字幕 | 国产精品久久久一区二区 | 亚洲精品在线不卡 | 国产一区视频在线免费观看 | 四虎av在线播放 | 国产天堂 | 丰满少妇在线观看网站 | 国产免费a | 色噜噜狠狠色综合av | 欧美第一页草草影院 | 国产91蝌蚪 | 91精品国产91久久久久游泳池 | zzz444成人天堂7777 | 夜夜爽久久揉揉一区 | 精品少妇一区二区三区视频 | 久久精品中文字幕无码绿巨人 | 嫩呦国产一区二区三区av | 色老汉av一区二区三区 | 中文字幕精品三级久久久 | 无码人妻精品丰满熟妇区 | 久久国产精品一国产精品 | 国产最爽的乱淫视频国语对白 | av免费在线观看不卡 | 国产精品一区二区三区四 | 国内精品九九久久精品 | 黄色av网站免费看 | 久久九九免费视频 | 久久久噜噜噜www成人网 | 在线性视频 | 国产精品国产三级国产专播品爱网 | 日日碰狠狠躁久久躁2023 | 亚洲精品18在线观看 | 国产精品8888| 爱色影音| 免费无码又爽又高潮视频 | 亚洲天堂色2017 | 亚洲乱码国产乱码精品精小说 | 欧美日韩se| 调教+趴+乳夹+国产+精品 | 日本一本久 | 亚洲一区二区三区日本久久九 | 中国黄色录像一级片 | 国产在线视频卡一卡二 | 黄色a免费| 国产真实乱人偷精品人妻 | 99re在线| 国产成人精品免费 | 韩漫动漫免费大全在线观看 | 激情插插插 | 天天夜碰日日摸日日澡性色av | 亚洲自拍99 | 亚洲色欲色欲www在线播放 | 日韩91av | 色偷偷av一区二区三区 | 狠狠干2023| 日韩日韩日韩日韩日韩 | 在线欧美精品一区二区三区 | 欧美男生射精高潮视频网站 | 欧美日韩一本 | 国产熟女一区二区三区五月婷 | 日韩一级二级 | 日本一级爽快片野花 | 欧美高清videos高潮hd | 亚洲综合黄色 | 老子影院午夜精品无码 | a级毛片在线免费看 | 免费人成在线观看视频播放 | 福利片第一页 | 欧美视频精品在线 | 天干夜天干天天天爽视频 | 九一色视频| 18禁美女裸体无遮挡网站 | 57pao成人国产永久免费视频 | 最近中文字幕在线中文高清版 | 色哟哟国产 | 艹逼久久 | 精品国产999久久久免费 | 欧美日本在线观看 | 久久久五月天 | 欧美成人不卡视频 | 怡红院国产 | 91免费成人 | 久久草在线视频 | 女教师少妇高潮免费 | 久久99精品久久久久久噜噜 | 国产一区二区三区精品视频 | 欧美三日本三级少妇三99 | 国产四区 | 色99视频| 成人网在线免费观看 | 中文字幕天堂网 | 黄色免费在线观看视频 | 日韩精品1 | av色噜噜| 久久精品国产麻豆 | 国产乱淫av免费 | 女人裸体性做爰23 | 色哟哟免费在线观看 | 九色蜜桃臀丨porny丨自拍 | 疯狂做受xxxx高潮不断 | 丰满少妇大力进入av亚洲葵司 | 国产亚洲精品久久久久久大师 | 99性视频| 性生交大片免费看 | 15p亚洲| 97视频播放 | 人人妻人人妻人人片av | 91久色| 国产黄色片在线观看 | 搡老熟女老女人一区二区 | 99999久久久久久亚洲 | 久久99国产综合精品免费 | 极品少妇的粉嫩小泬视频 | 丰满少妇乱子伦精品看片 | 伊人涩涩 | 国产成人av一区二区三区在线观看 | 久久91久久久久麻豆精品 | 插插插av | 国产日韩精品欧美一区喷水 | 亚洲色图图片区 | 热久久精品| 国产偷久久一区精品69 | 少妇性i交大片免费 | 最新激情网站 | 亚洲国产精品久久久久秋霞1 | 中文字幕无码精品亚洲35 | av亚洲产国偷v产偷v自拍软件 | 欧美激情久久久久 | 国内少妇毛片视频 | 国产精品视频播放 | 伊人春色在线视频 | 精品国产乱码久久久久久1区2区 | 又黄又爽又色成人免费视频体验区 | 亚洲综合精品一区二区三区 | 极品尤物被啪到呻吟喷水 | 黑人超碰 | 久久理论 | 亚洲日韩v无码中文字幕 | 99久久精| 少妇系列av| 国产98在线 | 日韩 | av日韩网址| 色婷婷综合激情 | 乱女伦露脸对白在线播放 | 成人夜色视频网站在线观看 | 精品国产一级 | 国产三级农民怕怕乡下姝4 国产三级欧美三级 | 再深点灬舒服灬太大了网站 | 黄色免费片 | 日韩精品一区二区三区中文在线 | 黄色a大片 | 我想看黄色毛片 | 欧美国产综合欧美视频 | 免费观看激色视频网站 | 永久免费看mv网站入口亚洲 | 亚洲一区自拍 | 欧美理论视频 | 成人av时间停止系列在线 | 四虎影视久久久免费 | 97在线免费观看 | 欧美极品25p | 亚洲三级图片 | 日本高清视频www夜色资源 | 老人与老人免费a级毛片 | 99久久精品日本一区二区免费 | 免费无码不卡视频在线观看 | 亚洲国产午夜 | 麻花传媒在线观看免费 | 调教大乳女仆喷奶水 | 久久精品人妻中文系列 | 黄视频在线播放 | 99久久久精品国产一区二区 | 精品乱子伦一区二区三区 | 欧美日韩亚洲三区 | 古代中国春交性视频xxx | 国产亚洲精品aaaa片app | 国产骚b| 国产免费又硬又黄又爽的视频喷水 | 久久久久久黄色 | 成人国内精品久久久久影院成.人国产9 | 午夜精品久久久久久毛片 | 欧美在线精品一区 | 欧美成人亚洲 | 午夜性剧场 | 内地级a艳片高清免费播放 内谢老女人视频在线观看 嫩草99 | 中文字幕中文有码在线 | 91亚洲精品久久久久图片蜜桃 | 国产va免费精品高清在线观看 | 蜜色影院 | av中文天堂| 国产男女猛烈无遮挡免费网站 | h狠狠躁死你h出轨高h | 搡老女人老妇女老熟妇 | 日本伊人色 | mm131亚洲精品| 久久999视频 | 亚洲欧美丝袜精品久久 | 亚洲精品污一区二区三区 | 欧美精品久久久久久久免费软件 | 亚洲国产系列 | 日韩中文字幕视频在线观看 | 久久99精品久久久久久牛牛影视 | 亚洲成av人片在线观看无码 | 欧美体内谢she精2性欧美 | 呻吟揉丰满对白91乃欧美区 | 欧美熟妇丰满肥白大屁股免费视频 | 性讥渴的黄蓉与老汉 | 国产精品vⅰdeoxxxx国产 | 免费看片黄色 | 91成人入口| 国产成人精品亚洲一区 | 婷婷黄色网 | 欧美一级爆毛片 | 女人高潮潮呻吟喷水 | 一级免费黄色 | 成人妇女免费播放久久久 | 2019高清中文字幕在线免费看 | 91欧美激情一区二区三区成人 | 农村一级毛片 | 色偷偷色噜噜狠狠成人免费视频 | 中文字幕 视频一区 | 乱妇乱女熟妇熟女网站 | 成人免费毛片入口 | 色视频观看 | 老女人给我性启蒙 | 特黄特色免费视频 | 亚洲成av人无码综合在线观看 | 免费亚洲精品 | 午夜一区二区国产好的精华液 | 水蜜桃av导航 | videos亚洲 | 男女裸体影院高潮 | 少妇交换浪荡h肉辣文视频 少妇交换做爰中文字幕 | 国产成人免费观看视频 | 天天综合网天天综合狠狠躁 | 无码精品人妻一区二区三区免费看 | 狠狠色老熟妇老熟女 | 性按摩xxxx在线观看 | 午夜日韩精品 | 呦系列视频一区二区三区 | 久久精品3| 学生调教贱奴丨vk | 少妇影院yy111111| 久久久免费精品re6 在线精品无码字幕无码av | 懂色av蜜乳av一二三区 | www国产亚洲精品久久久日本 | 天天看天天射 | 亚洲骚| 高清精品一区二区三区 | 免费看日韩毛片 | 国产免费人成xvideos视频 | 亚洲精品乱码久久久久久蜜桃图片 | 久久久国产精品亚洲一区 | 亚洲国产果冻传媒av在线观看 | 天天干,夜夜爽 | 饥渴的少妇和男按摩师 | 免费在线看黄视频 | av毛片网站 | 波多野结衣在线视频免费观看 | 亚洲社区在线观看 | 无套内谢孕妇毛片免费看 | 精品成在人线av无码免费看 | 性国产丰满麻豆videosex | 免费无码的av片在线观看 | aⅴ资源番号库 | 狠狠色噜噜狠狠狠狠2018 | 女人天堂av| 亚洲国产成人久久精品软件 | 欧美美女性高潮 | 国产成人精品无码一区二区 | 亚洲精品一区二区三区h | 中文字幕乱码在线人视频 | av一区二| 蜜桃av抽搐高潮一区二区 | 国产性受xxxx黑人xyx性爽 | 婷婷综合另类小说色区 | 亚洲国产成人久久精品软件 | 日本69式三人交 | 欧美成人一区二免费视频软件 | 亚洲国产97在线精品一区 | 午夜大片在线观看 | 嫩草av91| 荫道bbwbbb高潮潮喷 | 国产又色又爽又黄的 | 日本乱淫视频 | 黄色工厂在线观看 | 亚洲成人网在线播放 | 成年人国产视频 | 亚洲欧美日韩久久精品 | 小视频在线观看 | 国产探花视频在线观看 | 精品一区二区三人妻视频 | 国产美女精品一区二区三区 | 久久久一区二区三区捆绑sm调教 | 在线观看午夜福利院视频 | 色午夜av| 成人av手机在线观看 | 亚洲一区二区日韩 | 人人插人人| 亚洲美女精品视频 | 揄拍自拍| 黄频在线免费观看 | 特黄性暴力强在线线播放 | 国产亚洲精品久久久久蜜臀 | 久久久久久久国产免费看 | 国产精选视频在线观看 | 日本亚洲欧洲无免费码在线 | h网站免费在线观看 | 日韩欧美在线综合网 | 99国产一区二区 | 欧美极品中文字幕 | 人人爽久久涩噜噜噜蜜桃 | 一区二区在线精品 | 丰满少妇高潮叫久久国产 | 色哟哟国产精品 | 欧美综合自拍亚洲综合图片区 | 国产无人区码熟妇毛片多 | 777米奇色狠狠888俺也去乱 | 无码乱人伦一区二区亚洲 | 日本加勒比一区二区 | 欧美日韩免费一区二区三区 | 全部免费播放在线毛片 | 日本免费三区 | 国产日韩一区二区三区在线观看 | 国产农村妇女精品久久 | 精品人妻无码一区二区三区抖音 | 成人在线观看小视频 | 日韩精品视频在线免费观看 | 美女又爽又黄视频毛茸茸 | 国产精品入口免费 | hd最新国产人妖ts视频 | 中文字幕第23页在线 | 人妻换人妻a片爽麻豆 | 99精品国产综合久久久久久 | 韩国bj大尺度vip福利网站 | 双性受爽到不停的喷水bl | 成人免费一区二区三区 | 91最新地址永久入口 | 日本色偷偷 | 懂色av中文一区二区三区天美 | 好看的黄色网址 | 少妇又紧又色又爽又刺激视频 | 精品h视频 | 日韩精品久久久久久久的张开腿让 | 免费专区 - 91爱爱 | 精品国产乱码久久久人妻 | 无人在线观看的免费高清视频 | 乱肉合集乱高h男男双龙视频 | 女人浣肠av大片 | 亚洲国产福利 | jizz高潮| 欧美一区2区三区4区贰佰公司 | 美女少妇翘臀啪啪呻吟网站 | 成人久久久久 | 99久久中文字幕三级久久日本 | 性欧美在线视频观看 | 成人精品毛片国产亚洲av十九禁 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品