日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++11新特性学习

發布時間:2024/4/11 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11新特性学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是C+11

C++11標準為C++編程語言的第三個官方標準,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式標準發布前,原名C++0x。它將取代C++標準第二版ISO/IEC 14882:2003 - Programming languages -- C++成為C++語言新標準。

C++11是對目前C++語言的擴展和修正, C++11不僅包含核心語言的新機能,而且擴展了C++的標準程序庫(STL) ,并入了大部分的C++ Technical Report 1(TR1) 程序庫(數學的特殊函數除外)。

C++11包括大量的新特性:包括lambda表達式,類型推導關鍵字auto、 decltype,和模板的大量改進。
?

類型推導:auto

auto的自動類型推導,用于從初始化表達式中推斷出變量的數據類型。從這個意義上講,auto并非一種“類型”聲明,而是一個類型聲明時的“占位符”,編譯器在編譯時期會將auto替換為變量實際的類型。

通過auto的自動類型推導,可以大大簡化我們的編程工作:

#include <iostream> #include <vector> #include <string> using namespace std;double foo() {}void func(vector<string> & tmp) {for (auto i = tmp.begin(); i < tmp.end(); i++){// 一些代碼} }int main() {auto x = 1; // x的類型為intauto y = foo(); // y的類型為doublestruct m { int i; }str;auto str1 = str; // str1的類型是struct mauto z; // err, 無法推導,無法通過編譯z = x;return 0; }

注意點:

void fun(auto x =1) {} // 1: auto函數參數,有些編譯器無法通過編譯struct str {auto var = 10; // 2: auto非靜態成員變量,無法通過編譯 };int main() {char x[3];auto y = x;auto z[3] = x; // 3: auto數組,無法通過編譯// 4: auto模板參數(實例化時),無法通過編譯vector<auto> x = {1};return 0; }

decltype

decltype實際上有點像auto的反函數, auto可以讓你聲明一個變量,而decltype則可以從一個變量或表達式中得到其類型,如下:

#include <typeinfo> #include <iostream> #include <vector> using namespace std;int main() {int i;decltype(i) j = 0;cout << typeid(j).name() << endl; // 打印出"i", g++表示integerfloat a;double b;decltype(a + b) c;cout << typeid(c).name() << endl; // 打印出"d", g++表示doublevector<int> vec;typedef decltype(vec.begin()) vectype; // decltype(vec.begin()) 改名為 vectypevectype k; // 這是auto無法做到的//decltype(vec.begin()) k; // 這是auto無法做到的for (k = vec.begin(); k < vec.end(); k++){// 做一些事情}enum {Ok, Error, Warning}flag; // 匿名的枚舉變量decltype(flag) tmp = Ok;return 0; }

追蹤返回類型

返回類型后置:在函數名和參數列表后面指定返回類型。

int func(int, int); auto func2(int, int) -> int;template<typename T1, typename T2> auto sum(const T1 & t1, const T2 & t2) -> decltype(t1 + t2) {return t1 + t2; }template <typename T1, typename T2> auto mul(const T1 & t1, const T2 & t2) -> decltype(t1 * t2) {return t1 * t2; }int main() {auto a = 3;auto b = 4L;auto pi = 3.14;auto c = mul( sum(a, b), pi );cout << c << endl; // 21.98return 0; }

?

初始化

類內成員初始化

class Mem { public:Mem(int i): m(i){} //初始化列表給m初始化int m; }; class Group { public:Group(){}private:int data = 1; // 使用"="初始化非靜態普通成員,也可以 int data{1};Mem mem{2}; // 對象成員,創建對象時,可以使用{}來調用構造函數string name{"mike"}; };

列表初始化

C++11引入了一個新的初始化方式,稱為初始化列表(List Initialize),具體的初始化方式如下:

int a[]{1, 3, 5}; int i = {1}; int j{3};

初始化列表可以用于初始化結構體類型,例如:

struct Person { std::string name; int age; }; int main() { Person p = {"Frank", 25}; std::cout << p.name << " : " << p.age << std::endl; }

防止類型收窄

類型收窄指的是導致數據內容發生變化或者精度丟失的隱式類型轉換。使用列表初始化可以防止類型收窄。

int main(void) {const int x = 1024;const int y = 10;char a = x; // 收窄,但可以通過編譯char* b = new char(1024); // 收窄,但可以通過編譯char c = { x }; // err, 收窄,無法通過編譯char d = { y }; // 可以通過編譯unsigned char e{ -1 }; // err,收窄,無法通過編譯float f{ 7 }; // 可以通過編譯int g{ 2.0f }; // err,收窄,無法通過編譯float * h = new float{ 1e48 }; // err,收窄,無法通過編譯float i = 1.2l; // 可以通過編譯return 0; }

基于范圍的for循環

在C++中for循環可以使用基于范圍的for循環,示例代碼如下

int a[] = { 1, 2, 3, 4, 5 };int n = sizeof(a) / sizeof(*a); //元素個數for (int i = 0; i < n; ++i){int tmp = a[i];cout << tmp << ", ";}cout << endl;for (int tmp : a){cout << tmp << ", ";}cout << endl;for (int i = 0; i < n; ++i){int &tmp = a[i];tmp = 2 * tmp;cout << tmp << ", ";}cout << endl;for (int &tmp : a){tmp = 2 * tmp;cout << tmp << ", ";}cout << endl;

使用基于范圍的for循環,其for循環迭代的范圍必須是可確定的:

int func(int a[])//形參中數組是指針變量,無法確定元素個數 {for(auto e: a) // err, 編譯失敗{cout << e;} }int main() {int a[] = {1, 2, 3, 4, 5};func(a);return 0; }

靜態斷言

?

C/C++提供了調試工具assert,這是一個宏,用于在運行階段對斷言進行檢查,如果條件為真,執行程序,否則調用abort()。

int main() {bool flag = false;//如果條件為真,程序正常執行,如果為假,終止程序,提示錯誤assert(flag == true); //#include <cassert>或#include <assert.h>cout << "Hello World!" << endl;return 0; }

C++ 11新增了關鍵字static_assert,可用于在編譯階段對斷言進行測試。

靜態斷言的好處:

  • 更早的報告錯誤,我們知道構建是早于運行的,更早的錯誤報告意味著開發成本的降低
  • 減少運行時開銷,靜態斷言是編譯期檢測的,減少了運行時開銷

語法如下:

static_assert(常量表達式,提示字符串)注意:只能是常量表達式,不能是變量 int main() {//該static_assert用來確保編譯僅在32位的平臺上進行,不支持64位的平臺static_assert( sizeof(void *)== 4, "64-bit code generation is not supported."); cout << "Hello World!" << endl;return 0; }

noexcept修飾符、nullptr、原生字符串字面值

noexcept修飾符

void func3() throw(int, char) //只能夠拋出 int 和char類型的異常 {//C++11已經棄用這個聲明throw 0; }void BlockThrow() throw() //代表此函數不能拋出異常,如果拋出,就會異常 {throw 1; }//代表此函數不能拋出異常,如果拋出,就會異常 //C++11 使用noexcept替代throw() void BlockThrowPro() noexcept {throw 2; }

nullptr

nullptr是為了解決原來C++中NULL的二義性問題而引進的一種新的類型,因為NULL實際上代表的是0。

void func(int a) {cout << __LINE__ << " a = " << a <<endl; }void func(int *p) {cout << __LINE__ << " p = " << p <<endl; }int main() {int *p1 = nullptr;int *p2 = NULL;if(p1 == p2){cout << "equal\n";}//int a = nullptr; //err, 編譯失敗,nullptr不能轉型為intfunc(0); //調用func(int), 就算寫NULL,也是調用這個func(nullptr);return 0; }

原生字符串字面值

int main(void) {cout << R"(hello, \n world)" << endl;cout << "(hello, \n world)" << endl;string str = R"(helo \4 \r abc, mikehello\n)";cout << endl;cout << str << endl;return 0; }

強類型枚舉

C++ 11引入了一種新的枚舉類型,即“枚舉類”,又稱“強類型枚舉”。聲明請類型枚舉非常簡單,只需要在enum后加上使用class或struct。如:

enum Old{Yes, No}; // old style enum class New{Yes, No}; // new style enum struct New2{Yes, No}; // new style

“傳統”的C++枚舉類型有一些缺點:它會在一個代碼區間中拋出枚舉類型成員(如果在相同的代碼域中的兩個枚舉類型具有相同名字的枚舉成員,這會導致命名沖突),它們會被隱式轉換為整型,并且不可以指定枚舉的底層數據類型。

int main() {enum Status{Ok, Error};//enum Status2{Ok, Error};//err, 導致命名沖突, Status已經有成員叫Ok, Errorreturn 0; }

在C++11中,強類型枚舉解決了這些問題:

int main() {enum class Status {Ok, Error};enum struct Status2{Ok, Error};//Status flag1 = 10; // err,無法隱式轉換為int類型//Status flag2 = Ok; // err,必須使用強類型名稱Status flag3 = Status::Ok;enum class C : char { C1 = 1, C2 = 2};//指定枚舉的底層數據類型enum class D : unsigned int { D1 = 1, D2 = 2, Dbig = 0xFFFFFFF0U };cout << sizeof(C::C1) << endl; // 1cout << (unsigned int)D::Dbig << endl; // 編譯器輸出一致,4294967280cout << sizeof(D::D1) << endl; // 4cout << sizeof(D::Dbig) << endl; // 4return 0; }

常量表達式

?

常量表達式主要是允許一些計算發生在編譯時,即發生在代碼編譯而不是運行的時候。

這是很大的優化:假如有些事情可以在編譯時做,它將只做一次,而不是每次程序運行時都計算。

使用constexpr,你可以創建一個編譯時的函數:

constexpr int GetConst() {return 3; }int main() {int arr[ GetConst() ] = {0};enum { e1 = GetConst(), e2 };constexpr int num = GetConst();return 0; }

constexpr函數的限制:

  • 函數中只能有一個return語句(有極少特例)
  • 函數必須返回值(不能是void函數)
  • 在使用前必須已有定義
  • return返回語句表達式中不能使用非常量表達式的函數、全局數據,且必須是一個常量表達式
//err,函數中只能有一個return語句 constexpr int data() {constexpr int i = 1;return i; }constexpr int data2() {//一個constexpr函數,只允許包含一行可執行代碼//但允許包含typedef、 using 指令、靜態斷言等。static_assert(1, "fail");return 100; }int a = 3; constexpr int data3() {return a;//err, return返回語句表達式中不能使用非常量表達式的函數、全局數據 }int main() {constexpr int func(); //函數聲明,定義放在main函數后面constexpr int c = func(); //err, 無法通過編譯, 在使用前必須已有定義return 0; }constexpr int func() {return 1; }

常量表達式的構造函數有以下限制:

  • 函數體必須為空
  • 初始化列表只能由常量表達式來賦值
struct Date {constexpr Date(int y, int m, int d): year(y), month(m), day(d) {}constexpr int GetYear() { return year; }constexpr int GetMonth() { return month; }constexpr int GetDay() { return day; }private:int year;int month;int day; };int main() {constexpr Date PRCfound {1949, 10, 1};constexpr int foundmonth = PRCfound.GetMonth();cout << foundmonth << endl; // 10return 0; }

用戶定義字面量

用戶自定義字面值,或者叫“自定義后綴”更直觀些,主要作用是簡化代碼的讀寫

long double operator"" _mm(long double x) { return x / 1000; } long double operator"" _m(long double x) { return x; } long double operator"" _km(long double x) { return x * 1000; }int main() {cout << 1.0_mm << endl; //0.001cout << 1.0_m << endl; //1cout << 1.0_km << endl; //1000return 0; }

?

根據 C++ 11 標準,只有下面參數列表才是合法的

char const * unsigned long long long double char const *, size_t wchar_t const *, size_t char16_t const *, size_t char32_t const *, size_t

最后四個對于字符串相當有用,因為第二個參數會自動推斷為字符串的長度。例如:

size_t operator"" _len(char const * str, size_t size) {return size; }int main() {cout << "mike"_len <<endl; //結果為4return 0; }

對于參數char const *,應該被稱為原始字面量 raw literal 操作符。例如:

char const * operator"" _r(char const* str) {return str; }int main() {cout << 250_r <<endl; //結果為250return 0; }

類的改進

繼承構造

C++ 11允許派生類繼承基類的構造函數(默認構造函數、復制構造函數、移動構造函數除外)。

#include <iostream> using namespace std;//基類 class A { public:A(int x, int y){a = x;b = y;}protected:int a;int b; };//派生類 class B:public A { public: #if 0//通過參數列表給基類構造函數傳參B(int x, int y): A(x, y){} #endif//繼承構造using A::A;void display(){cout << "a = " << a << ", b = " << b << endl;}//沒有增加新的成員變量int tmp; };int main() {//派生類對象B obj(10, 20);obj.display();return 0; }

注意:

  • 繼承的構造函數只能初始化基類中的成員變量,不能初始化派生類的成員變量
  • 如果基類的構造函數被聲明為私有,或者派生類是從基類中虛繼承,那么不能繼承構造函數
  • 一旦使用繼承構造函數,編譯器不會再為派生類生成默認構造函數

繼承控制:final和override

C++11之前,一直沒有繼承控制關鍵字,禁用一個類的進一步衍生比較麻煩。

C++ 11添加了兩個繼承控制關鍵字:final和override。

final阻止類的進一步派生和虛函數的進一步重寫:

//final阻止類的進一步派生,虛函數的進一步重寫 #if 0 class A1 final //加上final,指定A1不能派生 {int a; };class A2: public A1 //err, 基類不能再派生了 {}; #endif//基類 class B1 { public:virtual void func() final {} //這是最終版本的虛函數,不能再重寫};//派生類重寫基類的虛函數 class B2: public B1 { public://virtual void func() {} //err, 基類中的虛函數是最終版本,不能再重寫 };

override確保在派生類中聲明的函數跟基類的虛函數有相同的簽名:

class A1 { public://這是第一個虛函數,沒有重寫,不能用override修飾virtual int func(int a){} };class A2:public A1 { public://在重寫虛函數地方,加上override, 要求重寫的虛函數和基類一模一樣virtual int func(int b) override{} };

defaulted 和 deleted 函數

defaulted 函數

背景問題

C++ 的類有四類特殊成員函數,它們分別是:默認構造函數、析構函數、拷貝構造函數以及拷貝賦值運算符。這些類的特殊成員函數負責創建、初始化、銷毀,或者拷貝類的對象。如果程序員沒有顯式地為一個類定義某個特殊成員函數,而又需要用到該特殊成員函數時,則編譯器會隱式的為這個類生成一個默認的特殊成員函數。

示例 1:

class X{ private: int a; }; X obj;

在示例 1 中

該自動生成的默認構造函數沒有參數,包含一個空的函數體,即 X::X(){ }。雖然自動生成的默認構造函數僅有一個空函數體,但是它仍可用來成功創建類 X 的對象 obj,示例 1 也可以編譯通過。

但是,如果程序員為類 X 顯式的自定義了非默認構造函數,卻沒有定義默認構造函數的時候,示例 2 將會出現編譯錯誤:

示例 2:

class X { public: X(int i){ a = i; } private: int a; }; X obj; // 錯誤 , 默認構造函數 X::X() 不存在

示例 2 編譯出錯的原因在于:類 X 已經有了用戶自定義的構造函數,所以編譯器將不再會為它隱式的生成默認構造函數。

如果需要用到默認構造函數來創建類的對象時,程序員必須自己顯式的定義默認構造函數。例如:

示例 3:

class X { public: X(){}; // 手動定義默認構造函數X(int i){ a = i; } private: int a; }; X obj; // 正確,默認構造函數 X::X() 存在

從示例 3 可以看出,原本期望編譯器自動生成的默認構造函數卻需要程序員手動編寫了,即程序員的工作量加大了。此外,手動編寫的默認構造函數的代碼執行效率比編譯器自動生成的默認構造函數低。

類的其它幾類特殊成員函數也和默認構造函數一樣,當存在用戶自定義的特殊成員函數時,編譯器將不會隱式的自動生成默認特殊成員函數,而需要程序員手動編寫,加大了程序員的工作量。類似的,手動編寫的特殊成員函數的代碼執行效率比編譯器自動生成的特殊成員函數低。

defaulted 函數的提出

為了解決如示例 3 所示的兩個問題:
1. 減輕程序員的編程工作量;
2. 獲得編譯器自動生成的默認特殊成員函數的高的代碼執行效率。

C++11 標準引入了一個新特性:defaulted 函數。程序員只需在函數聲明后加上“=default;”,就可將該函數聲明為 defaulted 函數,編譯器將為顯式聲明的 defaulted 函數自動生成函數體。例如:

示例 4:

class X { public: X()= default; X(int i){ a = i; } private: int a; }; X obj;

在示例 4 中,編譯器會自動生成默認構造函數 X::X(){},該函數可以比用戶自己定義的默認構造函數獲得更高的代碼效率。

defaulted 函數的用法及示例

defaulted 函數特性僅適用于類的特殊成員函數,且該特殊成員函數沒有默認參數。例如:

示例 5:

class X{ public: int f() = default; // 錯誤 , 函數 f() 非類 X 的特殊成員函數X(int, int) = default; // 錯誤 , 構造函數 X(int, int) 非 X 的特殊成員函數X(int = 1) = default; // 錯誤 , 默認構造函數 X(int=1) 含有默認參數};

defaulted 函數既可以在類體里(inline)定義,也可以在類體外(out-of-line)定義。例如:

示例 6:

class X { public: X() = default; //Inline defaulted 默認構造函數X(const X&); X& operator = (const X&); ~X() = default; //Inline defaulted 析構函數}; X::X(const X&) = default; //Out-of-line defaulted 拷貝構造函數X& X::operator = (const X&) = default; //Out-of-line defaulted 拷貝賦值操作符

在 C++ 代碼編譯過程中,如果程序員沒有為類 X 定義析構函數,但是在銷毀類 X 對象的時候又需要調用類 X 的析構函數時,編譯器會自動隱式的為該類生成一個析構函數。該自動生成的析構函數沒有參數,包含一個空的函數體,即 X::~X(){ }。例如:

示例 7:

class X { private:int x; };class Y : public X { public:Y(){p = new int;cout << "Y構造函數\n";}~Y(){delete p;cout << "Y析構函數\n";}private:int *p; };int main() {X *p = new Y;delete p;return 0; }

在示例 7 中,程序員沒有為基類 X 定義析構函數,當在主函數內 delete 基類指針 p 的時候,需要調用基類的析構函數。于是,編譯器會隱式自動的為類 X 生成一個析構函數,從而可以成功的銷毀 p 指向的派生類對象中的基類子對象。

但是,這段代碼存在內存泄露的問題,當利用 delete 語句刪除指向派生類對象的指針 p 時,系統調用的是基類的析構函數,而非派生類 Y 類的析構函數,因此,編譯器無法析構派生類的已經在堆區分配空間 p 。

因此,一般情況下我們需要將基類的析構函數定義為虛函數,當利用 delete 語句刪除指向派生類對象的基類指針時,系統會調用相應的派生類的析構函數(實現多態性),從而避免內存泄露。

但是編譯器隱式自動生成的析構函數都是非虛函數,這就需要由程序員手動的為基類 X 定義虛析構函數,例如:

示例 8:

class X { public: virtual ~X(){}; // 手動定義虛析構函數 private:int x; };class Y : public X { public:Y(){p = new int;cout << "Y構造函數\n";}~Y(){delete p;cout << "Y析構函數\n";}private:int *p; };int main() {X *p = new Y;delete p;return 0; }

在示例 8 中,由于程序員手動為基類 X 定義了虛析構函數,當利用 delete 語句刪除指向派生類對象的基類指針 p 時,系統會調用相應的派生類 Y 的析構函數以及基類 X 的析構函數,從而將派生類對象完整的銷毀,可以避免內存泄露。

但是,在示例 8 中,程序員需要手動的編寫基類的虛構函數的定義(哪怕函數體是空的),增加了程序員的編程工作量。更值得一提的是,手動定義的析構函數的代碼執行效率要低于編譯器自動生成的析構函數。

為了解決上述問題,我們可以將基類的虛析構函數聲明為 defaulted 函數,這樣就可以顯式的指定編譯器為該函數自動生成函數體。例如:

示例 9:

class X { public: virtual ~X()= defaulted; // 編譯器自動生成 defaulted 函數定義體 private:int x; };class Y : public X { public:Y(){p = new int;cout << "Y構造函數\n";}~Y(){delete p;cout << "Y析構函數\n";}private:int *p; };int main() {X *p = new Y;delete p;return 0; }

在示例 9 中,編譯器會自動生成虛析構函數 virtual X::X(){},該函數比用戶自己定義的虛析構函數具有更高的代碼執行效率。

deleted 函數

為了能夠讓程序員顯式的禁用某個函數,C++11 標準引入了一個新特性:deleted 函數。程序員只需在函數聲明后上“=delete;”,就可將該函數禁用。

例如,我們可以將類 X 的拷貝構造函數以及拷貝賦值操作符聲明為 deleted 函數,就可以禁止類 X 對象之間的拷貝和賦值。

示例 11:

class X { public: X(); X(const X&) = delete; // 聲明拷貝構造函數為 deleted 函數X& operator = (const X &) = delete; // 聲明拷貝賦值操作符為 deleted 函數 }; int main(){ X obj1; X obj2=obj1; // 錯誤,拷貝構造函數被禁用X obj3; obj3=obj1; // 錯誤,拷貝賦值操作符被禁用}

在示例 11 中,雖然只顯式的禁用了一個拷貝構造函數和一個拷貝賦值操作符,但是由于編譯器檢測到類 X 存在用戶自定義的拷貝構造函數和拷貝賦值操作符的聲明,所以不會再隱式的生成其它參數類型的拷貝構造函數或拷貝賦值操作符,也就相當于類 X 沒有任何拷貝構造函數和拷貝賦值操作符,所以對象間的拷貝和賦值被完全禁止了。

deleted 函數的用法及示例

class X { public:X(double);X(int) = delete; };int main() {X obj1(1.2);X obj2(2); // 錯誤,參數為整數 int 類型的轉換構造函數被禁用 }

deleted 函數特性還可以用來禁用某些用戶自定義的類的 new 操作符,從而避免在自由存儲區創建類的對象。例如:

示例 13:

class X { public:void *operator new(size_t) = delete;void *operator new[](size_t) = delete; };int main() {X *pa = new X; // 錯誤,new 操作符被禁用X *pb = new X[10]; // 錯誤,new[] 操作符被禁用 }

必須在函數第一次聲明的時候將其聲明為 deleted 函數,否則編譯器會報錯。即對于類的成員函數而言,deleted 函數必須在類體里(inline)定義,而不能在類體外(out-of-line)定義。例如:

示例 14:

int add(int, int) = delete;int main() {int a, b;add(a, b); // 錯誤,函數 add(int, int) 被禁用 }

值得一提的是,在示例 15 中,雖然 add(int, int)函數被禁用了,但是禁用的僅是函數的定義,即該函數不能被調用。但是函數標示符 add 仍是有效的,在名字查找和函數重載解析時仍會查找到該函數標示符。如果編譯器在解析重載函數時,解析結果為 deleted 函數,則會出現編譯錯誤。例如:

示例 16:

int add(int, int) = delete; double add(double a, double b) {return a + b; } int main() {cout << add(1, 3) << endl; // 錯誤,調用了 deleted 函數 add(int, int) cout << add(1.2, 1.3) << endl;return 0; }

?

lambda基礎使用

lambda 表達式(lambda expression)是一個匿名函數,lambda表達式基于數學中的 λ 演算得名。

C++11中的lambda表達式用于定義并創建匿名的函數對象,以簡化編程工作。

lambda表達式的基本構成:

① 函數對象參數

[],標識一個lambda的開始,這部分必須存在,不能省略。函數對象參數是傳遞給編譯器自動生成的函數對象類的構造函數的。函數對象參數只能使用那些到定義lambda為止時lambda所在作用范圍內可見的局部變量(包括lambda所在類的this)。函數對象參數有以下形式:

  • 空。沒有使用任何函數對象參數。
  • =。函數體內可以使用lambda所在作用范圍內所有可見的局部變量(包括lambda所在類的this),并且是值傳遞方式(相當于編譯器自動為我們按值傳遞了所有局部變量)。
  • 。函數體內可以使用lambda所在作用范圍內所有可見的局部變量(包括lambda所在類的this),并且是引用傳遞方式(相當于編譯器自動為我們按引用傳遞了所有局部變量)。
  • this。函數體內可以使用lambda所在類中的成員變量。
  • a。將a按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的a的拷貝,因為默認情況下函數是const的。要修改傳遞進來的a的拷貝,可以添加mutable修飾符。
  • &a。將a按引用進行傳遞。
  • a, &b。將a按值進行傳遞,b按引用進行傳遞。
  • =,&a, &b。除a和b按引用進行傳遞外,其他參數都按值進行傳遞。
  • &, a, b。除a和b按值進行傳遞外,其他參數都按引用進行傳遞。

?

② 操作符重載函數參數
標識重載的()操作符的參數,沒有參數時,這部分可以省略。參數可以通過按值(如:(a,b))和按引用(如:(&a,&b))兩種方式進行傳遞。

③ 可修改標示符
mutable聲明,這部分可以省略。按值傳遞函數對象參數時,加上mutable修飾符后,可以修改按值傳遞進來的拷貝(注意是能修改拷貝,而不是值本身)

④ 錯誤拋出標示符
exception聲明,這部分也可以省略。exception聲明用于指定函數拋出的異常,如拋出整數類型的異常,可以使用throw(int)

⑤ 函數返回值
->返回值類型,標識函數返回值的類型,當返回值為void,或者函數體中只有一處return的地方(此時編譯器可以自動推斷出返回值類型)時,這部分可以省略。

⑥ 是函數體
{},標識函數的實現,這部分不能省略,但函數體可以為空。

class Test { public:int i = 0;void func(int x, int y){auto x1 = []{ return i; }; //err, 沒有捕獲外部變量auto x2 = [=]{ return i+x+y; }; //ok, 值傳遞方式捕獲所有外部變量auto x3 = [=]{ return i+x+y; }; //ok, 引用傳遞方式捕獲所有外部變量auto x4 = [this]{ return i; }; //ok, 捕獲this指針auto x5 = [this]{ return i+x+y; }; //err, 沒有捕獲x, yauto x6 = [this, x, y]{ return i+x+y; };//ok, 捕獲this指針, x, yauto x7 = [this]{ return i++; }; //ok, 捕獲this指針, 并修改成員的值} };int main() {int a = 0, b = 1;auto f1 = []{ return a; }; //err, 沒有捕獲外部變量auto f2 = [=]{ return a; }; //ok, 值傳遞方式捕獲所有外部變量auto f3 = [=]{ return a++; }; //err, a是以賦值方式捕獲的,無法修改auto f4 = [=]() mutable { return a++; }; //ok, 加上mutable修飾符后,可以修改按值傳遞進來的拷貝auto f5 = [&]{ return a++; }; //ok, 引用傳遞方式捕獲所有外部變量, 并對a執行自加運算auto f6 = [a]{ return a+b; }; //err, 沒有捕獲變量bauto f7 = [a,&b]{ return a+(b++); }; //ok, 捕獲a, &bauto f8 = [=,&b]{ return a+(b++); }; //ok, 捕獲所有外部變量,&breturn 0; }

值傳遞和引用傳遞區別:

#include <iostream> using namespace std;int main() {int j = 12;auto by_val_lambda = [=] { return j + 1;};auto by_ref_lambda = [&] { return j + 1;};cout << "by_val_lambda: " << by_val_lambda() << endl;cout << "by_ref_lambda: " << by_ref_lambda() << endl;j++;cout << "by_val_lambda: " << by_val_lambda() << endl;cout << "by_ref_lambda: " << by_ref_lambda() << endl;return 0; }

第3次調用結果還是13,原因是由于by_val_lambda中,j被視為了一個常量,一旦初始化后不會再改變。

lambda與仿函數

#include <iostream> using namespace std;class MyFunctor { public:MyFunctor(int tmp) : round(tmp) {}int operator()(int tmp) { return tmp + round; }private:int round; };int main() {//仿函數int round = 2;MyFunctor f1(round);//調用構造函數cout << "result1 = " << f1(1) << endl; //operator()(int tmp)//lambda表達式auto f2 = [=](int tmp) -> int { return tmp + round; } ;cout << "result2 = " << f2(1) << endl;return 0; }

?

通過上面的例子,我們看到,仿函數以round初始化類,而lambda函數也捕獲了round變量,其它的,如果在參數傳遞上,兩者保持一致。

除去在語法層面上的不同,lambda和仿函數有著相同的內涵——都可以捕獲一些變量作為初始化狀態,并接受參數進行運行。

而事實上,仿函數是編譯器實現lambda的一種方式,通過編譯器都是把lambda表達式轉化為一個仿函數對象。因此,在C++11中,lambda可以視為仿函數的一種等價形式。

模板的改進

右尖括號>改進

在C++98/03的泛型編程中,模板實例化有一個很繁瑣的地方,就是連續兩個右尖括號(>>)會被編譯解釋成右移操作符,而不是模板參數表的形式,需要一個空格進行分割,以避免發生編譯時的錯誤。

template <int i> class X{}; template <class T> class Y{};int main() {Y<X<1> > x1; // ok, 編譯成功Y<X<2>> x2; // err, 編譯失敗return 0; };

在實例化模板時會出現連續兩個右尖括號,同樣static_cast、dynamic_cast、reinterpret_cast、const_cast表達式轉換時也會遇到相同的情況。C++98標準是讓程序員在>>之間填上一個空格,在C++11中,這種限制被取消了。在C++11標準中,要求編譯器對模板的右尖括號做單獨處理,使編譯器能夠正確判斷出”>>”是一個右移操作符還是模板參數表的結束標記。
?

模板的別名

#include <iostream> #include <type_traits> //std::is_same using namespace std;using uint = unsigned int; typedef unsigned int UINT; using sint = int;int main() {//std::is_same 判斷類型是否一致//這個結構體作用很簡單,就是兩個一樣的類型會返回truecout << is_same<uint, UINT>::value << endl; // 1return 0; }

左值引用、右值引用

?

左值引用是對一個左值進行引用的類型,右值引用則是對一個右值進行引用的類型。

左值引用和右值引用都是屬于引用類型。無論是聲明一個左值引用還是右值引用,都必須立即進行初始化。而其原因可以理解為是引用類型本身自己并不擁有所綁定對象的內存,只是該對象的一個別名。

左值引用是具名變量值的別名,而右值引用則是不具名(匿名)變量的別名。

左值引用

int &a = 2; // 左值引用綁定到右值,編譯失敗, err int b = 2; // 非常量左值 const int &c = b; // 常量左值引用綁定到非常量左值,編譯通過, ok const int d = 2; // 常量左值 const int &e = c; // 常量左值引用綁定到常量左值,編譯通過, ok const int &b = 2; // 常量左值引用綁定到右值,編程通過, ok

const 類型 &”為 “萬能”的引用類型,它可以接受非常量左值、常量左值、右值對其進行初始化

右值引用,使用&&表示:

int && r1 = 22; int x = 5; int y = 8; int && r2 = x + y; T && a = ReturnRvalue();

測試示例:

#include <iostream> using namespace std;void process_value(int & i) //參數為左值引用 {cout << "LValue processed: " << i << endl; }void process_value(int && i) //參數為右值引用 {cout << "RValue processed: " << i << endl; }int main() {int a = 0;process_value(a); //LValue processed: 0process_value(1); //RValue processed: 1return 0; }

移動語義

#include <iostream> using namespace std;class Test { public:Test(int a = 0){//普通構造函數d = new int(a);cout << "構造函數\n";}Test(const Test & tmp){//拷貝構造函數d = new int;*d = *(tmp.d);cout << "拷貝構造函數\n";}~Test(){//析構函數if(d != NULL){delete d;cout << "delete d\n";}cout << "析構函數\n";}int * d; };Test GetTmp() {Test h;cout << "Resource from " << __func__ << ": " << (void *)h.d << endl;return h; }int main() {Test obj = GetTmp();cout << "Resource from " << __func__ << ": " << (void *)obj.d << endl;return 0; }

編譯器會對返回值進行優化,簡稱RVO,是編譯器的一項優化技術,它涉及(功能是)消除為保存函數返回值而創建的臨時對象。

-fno-elide-constructors,此選項作用是,在 g++ 上編譯時關閉 RVO。

通過上面的例子看到,臨時對象的維護 ( 創建和銷毀 ) 對性能有嚴重影響。

右值引用是用來支持轉移語義的。轉移語義可以將資源 ( 堆,系統對象等 ) 從一個對象轉移到另一個對象,這樣能夠減少不必要的臨時對象的創建、拷貝以及銷毀,能夠大幅度提高 C++ 應用程序的性能。

轉移語義是和拷貝語義相對的,可以類比文件的剪切與拷貝,當我們將文件從一個目錄拷貝到另一個目錄時,速度比剪切慢很多。

通過轉移語義,臨時對象中的資源能夠轉移其它的對象里。
移動語義定義

在現有的 C++ 機制中,我們可以定義拷貝構造函數和賦值函數。要實現轉移語義,需要定義轉移構造函數,還可以定義轉移賦值操作符。對于右值的拷貝和賦值會調用轉移構造函數和轉移賦值操作符。

如果轉移構造函數和轉移拷貝操作符沒有定義,那么就遵循現有的機制,拷貝構造函數和賦值操作符會被調用。

普通的函數和操作符也可以利用右值引用操作符實現轉移語義
轉移構造函數

class Test { public:Test(int a = 0){ptr = new int(a);cout << " 構造函數" << endl;}Test(Test &tmp){ptr = new int;*ptr = *(tmp.ptr);tmp.ptr = NULL;cout << "拷貝構造函數" << endl;} // Test &operator=(Test &tmp) // { // if (this != &tmp) // { // delete ptr; // ptr = new int; // *ptr = *(tmp.ptr); // } // cout << "賦值構造函數" << endl; // return *this; // }Test(Test &&tmp){ // 移動構造函數ptr = tmp.ptr;tmp.ptr = NULL; // 將臨時值的指針成員置空cout << "移動構造函數" << endl;}Test &operator=(Test &&tmp){ //轉移賦值函數if (&tmp == this){return *this;}*ptr = *(tmp.ptr;tmp.ptr = NULL;cout << "轉移賦值函數\n";return *this;}~Test(){if (ptr){delete ptr;ptr = NULL;}cout << "析構函數" << endl;}int *ptr; };Test test() {Test h;cout << "Resource from :" << __func__ << ":" << h.ptr << endl;return h; }int main() {Test obj = test();//轉移cout << "Resource from :" << __func__ << ":" << obj.ptr << endl;return 0; }

?

?

總結

以上是生活随笔為你收集整理的C++11新特性学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

97夜夜澡人人爽人人免费 | 国产精品一区二区三区在线播放 | 81国产精品久久久久久久久久 | 久久久久99精品国产片 | 亚洲色影爱久久精品 | 国产成人久久av | 色狠狠综合 | 一区二区三区免费播放 | 区一区二区三区中文字幕 | 亚洲精品国产精品国自产观看 | 蜜臀久久99静品久久久久久 | 免费观看国产视频 | 国产精品私人影院 | 日日干天天射 | 日韩免费中文字幕 | 久久久久久麻豆 | 九九九热精品免费视频观看网站 | 日本三级吹潮在线 | 国产精品一区二区久久精品 | 亚洲 综合 国产 精品 | 在线视频福利 | 国产精品美女网站 | 热九九精品 | 九九久| 久久精品国产一区二区三 | 国产精品久久久久一区二区三区共 | 欧美一区二区三区在线 | 人人干人人添 | 国产成人黄色在线 | 久久国产美女 | 日韩区欧美久久久无人区 | 亚洲精品在线观看网站 | 九九亚洲精品 | 国产三级视频在线 | 久久久黄视频 | 免费高清av在线看 | 一区二区激情视频 | 91久久偷偷做嫩草影院 | 又污又黄网站 | wwwwwww黄| 欧美国产大片 | 国内久久精品 | av高清在线 | 免费av看片| 日本中文不卡 | 欧美久久影院 | 最新国产精品亚洲 | 超碰午夜 | 国产精品久久久久久久久久久不卡 | 97免费视频在线 | ,午夜性刺激免费看视频 | 日日夜夜爱 | 成人在线视频在线观看 | 国产日本在线 | 免费视频久久 | 久久久久国产精品免费 | a级成人毛片 | 97国产大学生情侣白嫩酒店 | 97精品国产97久久久久久久久久久久 | 国产精品videoxxxx| 99高清视频有精品视频 | 欧美成人亚洲 | 国产资源网站 | 国内精品小视频 | 久久精品欧美日韩精品 | 黄色av成人在线观看 | 福利在线看片 | 久久免费福利 | 黄色大片入口 | 日韩免费成人 | 久久久久免费网站 | 日韩免费在线观看 | 国产精品久久久久久久久久了 | 97色综合| 黄色在线观看免费 | 欧日韩在线视频 | 国内精品久久久久影院一蜜桃 | 91亚洲精品国偷拍自产在线观看 | 人人澡视频 | 91看片网址 | 国产又粗又猛又爽又黄的视频先 | 三日本三级少妇三级99 | 亚州免费视频 | 国产成人久久精品一区二区三区 | 五月天婷婷视频 | 国产高清第一页 | 色在线网 | 2021国产精品| 成人精品视频久久久久 | 色网站在线观看 | 五月婷婷中文网 | 久久这里只有精品9 | 日韩三级中文字幕 | 午夜久久成人 | 亚洲精品久久久久999中文字幕 | 日韩精品一区二区三区免费观看 | 欧美午夜性生活 | 美女免费视频一区二区 | 91色影院| 深夜福利视频一区二区 | 国产资源av | 欧美精品999 | 国产日韩精品一区二区 | av在线播放一区二区三区 | 手机成人av在线 | 五月天丁香综合 | 久久精品草 | 黄色成人av | 五月婷av| 99久久精品国产毛片 | 国产精品私拍 | 中文字幕丝袜 | 久久人人爽视频 | 探花视频在线观看免费版 | 国色天香永久免费 | 欧产日产国产69 | 免费又黄又爽视频 | 天天操 夜夜操 | 婷婷丁香久久五月婷婷 | 99色精品视频 | 欧美日韩视频观看 | 中文字幕精品久久 | 狂野欧美激情性xxxx欧美 | 国产91学生粉嫩喷水 | 一二三区高清 | 91网站在线视频 | 日韩免费视频在线观看 | 亚洲欧洲久久久 | 99久久婷婷国产综合亚洲 | 日韩精品一区二区久久 | 免费人成网ww44kk44 | 色a在线观看 | 四虎国产精品成人免费4hu | 好看av在线 | 一区二区三区免费 | 免费亚洲黄色 | 亚洲国产精品传媒在线观看 | 国产精品视频 | av免费在线免费观看 | 国产亚洲精品电影 | 在线91精品 | 另类老妇性bbwbbw高清 | 国产视| 久久久久亚洲精品男人的天堂 | 五月婷婷激情综合网 | 亚洲视频 视频在线 | 干综合网 | 久久亚洲视频 | 免费大片黄在线 | 成人永久视频 | 亚洲免费视频在线观看 | 国产黄色片免费 | a天堂中文在线 | 午夜久草 | 丁香综合五月 | 国产伦精品一区二区三区在线 | 99精品色 | 欧美韩日精品 | 最新成人在线 | 久久人人爽视频 | 中午字幕在线观看 | 日本巨乳在线 | 日韩亚洲国产精品 | 亚洲一区精品人人爽人人躁 | 国产日韩在线播放 | 久久成人国产精品一区二区 | 一区二区三区四区精品 | 美女网站在线看 | 国产精品九九久久99视频 | 天堂网中文在线 | 久久久久夜色 | 久草网在线视频 | 在线视频欧美精品 | 欧美一级日韩三级 | 欧美污污视频 | 五月婷在线播放 | 久久99在线视频 | 69国产精品成人在线播放 | 欧洲一区精品 | 操一草| 综合色站 | www.色国产| 亚洲天堂网在线观看视频 | 亚洲精品在线视频播放 | 不卡的av中文字幕 | 丁香高清视频在线看看 | 久久国产精品免费观看 | 天天舔天天射天天操 | 亚洲午夜精品在线观看 | 色婷婷亚洲综合 | 在线看国产日韩 | 中文字幕av最新更新 | 一区二区三区四区五区六区 | 91在线视频免费观看 | 黄色av影视 | 日本精品一区二区三区在线观看 | 亚洲免费一级 | 亚洲国内精品在线 | 久久综合久色欧美综合狠狠 | 欧美日韩国产欧美 | 国产精品美女久久久久久久 | 91精品在线免费视频 | www五月天 | 国产99久久久精品 | 国产二区免费视频 | 亚洲激情精品 | 欧美日韩一级视频 | 国产精品久久久久久久久久不蜜月 | 五月天综合 | 精品人人爽 | 成年人免费在线播放 | 婷婷在线视频 | 亚洲视频第一页 | 国产午夜在线观看视频 | 黄色在线观看网站 | 黄色av网站在线免费观看 | 综合色伊人 | 成片免费观看视频大全 | 公与妇乱理三级xxx 在线观看视频在线观看 | 丁香激情综合 | 91精品一 | 日本精品中文字幕 | 色综合夜色一区 | 一区二区三区在线不卡 | 国产九色视频在线观看 | 日韩美女一级片 | 在线国产一区二区三区 | 高清久久久 | 久草视频免费看 | 久久久精品一区二区三区 | 中文字幕首页 | av福利在线看 | 国产日韩精品一区二区在线观看播放 | 久久精品综合 | 国产视| 亚洲另类久久 | 色婷婷综合久久久久中文字幕1 | 日韩美女av在线 | www.亚洲在线| 521色香蕉网站在线观看 | 日韩欧美视频在线观看免费 | 久精品视频在线观看 | 亚洲视频 一区 | 91网站在线视频 | 成人av免费在线看 | 天天干天天摸 | 日本中文字幕电影在线免费观看 | 天天天干天天天操 | 六月丁香社区 | 国产一级特黄毛片在线毛片 | 精品亚洲欧美一区 | 国产一级在线 | 欧美性生活小视频 | 日韩和的一区二在线 | 国产偷国产偷亚洲清高 | 欧美 另类 交 | 日韩黄色在线观看 | 中午字幕在线观看 | 二区三区av | 国内外成人在线视频 | 精品福利网 | aaa日本高清在线播放免费观看 | 韩国精品一区二区三区六区色诱 | 91人人爽久久涩噜噜噜 | 国产美女在线免费观看 | 亚洲欧洲中文日韩久久av乱码 | 狠狠久久 | 国产午夜三级一区二区三 | 99精品欧美一区二区三区 | 伊人五月天.com| 婷婷深爱五月 | 欧美 日韩 国产 成人 在线 | 久久国产精品一国产精品 | 国产精品乱码高清在线看 | 国产一区自拍视频 | 狠狠操狠狠干天天操 | 欧美精品亚洲精品日韩精品 | 三级动态视频在线观看 | 在线观看国产麻豆 | 一级欧美日韩 | av无限看| 国产午夜一级毛片 | 欧美成人影音 | 亚洲免费婷婷 | 日本中文一区二区 | 爱av在线网| 天天亚洲综合 | 成人免费大片黄在线播放 | 99久久精品国产网站 | 久久福利精品 | 色噜噜在线观看 | 在线影视 一区 二区 三区 | 欧美精品三级在线观看 | 久久激情影院 | 日韩在线免费观看视频 | 九九久久影院 | 日韩网站在线看片你懂的 | 91精品国产电影 | 在线看日韩av | www免费 | 在线观看成人小视频 | 婷婷色网视频在线播放 | 国产天天综合 | 韩日视频在线 | 久久免费视频在线观看6 | 伊人天堂久久 | 成人国产精品免费观看 | 日韩精品一区二区在线观看 | 99久久婷婷国产一区二区三区 | 久久久久久久久久久久电影 | 欧美了一区在线观看 | 久久久久久久久久免费视频 | 亚洲精品成人av在线 | 手机看片1042 | 欧美福利久久 | 日产乱码一二三区别在线 | 午夜久久久久久久久久久 | 国产精品不卡一区 | 亚洲波多野结衣 | 亚洲天天综合网 | 99视频一区二区 | 亚洲欧美日本一区二区三区 | 国产中文字幕精品 | 毛片网在线播放 | 人人爱人人添 | 免费日韩 精品中文字幕视频在线 | 粉嫩高清一区二区三区 | 狠狠色丁香婷婷综合最新地址 | 91看片黄色| 人人狠狠综合久久亚洲婷 | 久久国产一区二区三区 | 综合网伊人 | 日韩午夜剧场 | av免费观看网站 | 国产精品高清在线 | 久草在线这里只有精品 | 一区二区三区在线观看免费视频 | 日韩簧片在线观看 | 黄色毛片视频免费观看中文 | 激情在线免费视频 | 天天综合色网 | 91av免费观看 | 2019天天干夜夜操 | 97视频网站| 日韩欧美在线观看一区二区三区 | 曰本免费av | 午夜av激情 | 亚洲最大成人网4388xx | 菠萝菠萝在线精品视频 | 久久人91精品久久久久久不卡 | 超碰免费av | 国产不卡在线 | 国产在线一线 | 在线探花| 日本中文字幕电影在线免费观看 | 丁香花在线视频观看免费 | www.激情五月.com | 中文字幕在线观看完整版 | 日韩一区精品 | 91色一区二区三区 | 久久久久黄 | 97超碰总站 | 日本中文字幕免费观看 | 久久试看 | 中文视频一区二区 | 婷婷激情网站 | 色wwwww | 激情影音先锋 | 在线观看视频国产 | 欧美激情综合色综合啪啪五月 | 91天天操| 久久国产精品99国产 | 狠狠干干 | 中文字幕在线国产 | 97免费| 激情五月激情综合网 | 久热免费在线观看 | 91精品国产一区二区三区 | 亚洲精品九九 | 精品国产色 | 玖玖综合网 | 91在线播 | 不卡在线一区 | 亚洲精品综合在线观看 | 日韩精品免费 | 免费特级黄色片 | 97电影院在线观看 | 欧洲视频一区 | 日本三级国产 | 久久久麻豆精品一区二区 | 国产精品免费一区二区三区 | 免费看成人av | 精品视频免费在线 | 国产成人av一区二区三区在线观看 | 最近最新mv字幕免费观看 | 激情视频免费观看 | 天天操天天干天天爱 | 亚洲精品欧美精品 | 日韩av快播电影网 | 久久爽久久爽久久av东京爽 | 亚洲精品国产欧美在线观看 | 精品一二三四在线 | 日韩在线免费看 | 天天操天天是 | 久久久久久久免费看 | 中文字幕中文字幕中文字幕 | 九九精品久久 | 96超碰在线 | 成人av电影免费 | 91成品视频| 成人免费视频免费观看 | 国产精品1区2区3区 久久免费视频7 | 欧美污污网站 | 亚洲综合小说电影qvod | 婷婷日| 欧美天天综合 | 欧美日韩精品在线免费观看 | 免费视频一二三 | 91精品视屏 | 99久久爱| 99久久久久久 | 国产玖玖视频 | 国产精品久久久区三区天天噜 | 久久精品首页 | 久久99精品国产99久久6尤 | 黄色不卡av | 91视频传媒 | 亚洲va韩国va欧美va精四季 | 国产1区2 | 欧美激情在线网站 | 精品国产一区二区三区在线 | 亚洲精品一区二区三区新线路 | 日批视频在线 | 亚洲欧美日韩一级 | 成人av亚洲 | 久久高清毛片 | 国内精品在线观看视频 | 99r在线| 国产精品1区2区 | 欧美另类一二三四区 | www.天天操 | 日韩视频欧美视频 | 成人精品一区二区三区中文字幕 | 91亚州 | 国产精品一区二区三区四 | 亚洲国产999| 久99久在线视频 | 婷婷av色综合 | 午夜婷婷综合 | 二区三区在线观看 | 精品久久久久久一区二区里番 | 欧美日韩在线观看一区二区三区 | 久久污视频 | 日韩夜夜爽 | 国产男女爽爽爽免费视频 | 国产精品99久久久久人中文网介绍 | 久草剧场 | 九九日韩 | 最新av在线免费观看 | 久久午夜精品 | 欧美人人爱 | 国产一级片直播 | 国产手机av | 国产一区91 | 美女免费黄网站 | 国产精品mv | 国产一区二区在线播放视频 | 国产网站色 | 日韩亚洲国产精品 | 丁香亚洲 | 91网免费看| 国产一卡久久电影永久 | 999热视频 | 91免费观看国产 | 欧美日韩视频精品 | 一区三区视频在线观看 | 久久国产精品一二三区 | 欧洲精品码一区二区三区免费看 | 国产美女视频网站 | 亚洲国产偷 | 国产视频一区精品 | 国产精品久久久久久久久久久久 | 国产一级二级三级在线观看 | 国产精品成人自产拍在线观看 | 欧美一级片在线观看视频 | 国产天天综合 | 欧美精品三级 | 91视频免费播放 | 国产免费叼嘿网站免费 | 久久99视频 | 激情av在线播放 | 婷婷看片| 黄色av一级 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 在线黄色免费av | 超碰在线官网 | 97电影在线观看 | 狠狠五月婷婷 | 久久黄色精品视频 | 精品一区二区影视 | 日日夜夜噜 | 中文字幕视频网站 | 免费在线观看成人av | 色婷婷六月| 五月婷婷六月丁香在线观看 | 91系列在线 | 97在线观视频免费观看 | 日韩影视在线观看 | 中文字幕人成乱码在线观看 | 五月开心六月婷婷 | 免费日韩 精品中文字幕视频在线 | 99久久久久成人国产免费 | 四虎成人免费观看 | 成人影片在线免费观看 | 这里只有精品视频在线 | 国产又粗又猛又黄又爽 | 日韩av三区 | 麻豆传媒视频在线 | 99精品在线播放 | 日本精品视频免费 | 99久久网站 | 日韩视频一区二区 | 日韩av电影中文字幕 | 亚洲国产精品成人va在线观看 | 日韩 国产 | 国产91免费观看 | 免费福利在线视频 | 开心丁香婷婷深爱五月 | 2023av在线| 伊人日日干 | 精品国产资源 | 四虎永久精品在线 | 视频一区亚洲 | 韩国精品一区二区三区六区色诱 | 狠狠操电影网 | 国产最新在线观看 | 尤物一区二区三区 | 欧美 日韩 视频 | 7799av| 亚洲精品国产精品久久99热 | 久久免费av电影 | 国产中文字幕一区 | 日本一区二区高清不卡 | 99久久精品免费看国产四区 | 国产一级黄色免费看 | 一区二区中文字幕在线 | 2022中文字幕在线观看 | 成人av中文字幕在线观看 | 在线观看免费中文字幕 | 色婷婷综合久久久久 | 国产黄色一级片在线 | www.大网伊人 | 中文字幕在线观看视频一区 | 国产老太婆免费交性大片 | 中文字幕在线看视频国产 | 日韩免费久久 | 夜夜骑首页 | 日韩在线观看免费 | 丁香综合| 日韩,精品电影 | 国产麻豆果冻传媒在线观看 | 91精品免费在线 | 一级a性色生活片久久毛片波多野 | 国产黄在线 | 欧美日韩在线电影 | 国产成人av免费在线观看 | 久久国产精品视频观看 | 亚洲午夜精品久久久 | 国内精品久久久久久久久久 | 在线天堂中文www视软件 | 亚洲一级黄色 | 免费在线观看中文字幕 | 国产亚洲免费的视频看 | 亚洲精品久久久久999中文字幕 | 国产成人高清在线 | 久久er99热精品一区二区三区 | 亚洲无人区小视频 | 人人插人人艹 | 天天透天天插 | 欧美中文字幕久久 | 少妇精品久久久一区二区免费 | 国产婷婷| 久色免费视频 | bbw av| 在线看的av网站 | 国产主播大尺度精品福利免费 | 制服丝袜成人在线 | 91视频91蝌蚪 | 九九热免费视频在线观看 | 久久一区91 | 91资源在线观看 | 天堂av网站| 国产精品免费在线 | 97在线精品 | 男女免费视频观看 | 亚洲精品男人的天堂 | 日韩欧美高清视频在线观看 | 婷婷五情天综123 | 国产一级高清 | 午夜精品成人一区二区三区 | 一区二区三区四区久久 | 色吊丝在线永久观看最新版本 | 欧美片网站yy | 超碰97在线资源 | 日日夜夜天天综合 | 久草在线视频首页 | www.色午夜,com | 免费人人干 | 精品国产区在线 | 国产在线色站 | 美女性爽视频国产免费app | 亚洲一区二区精品视频 | 欧美a级片网站 | 天天做天天干 | 伊人五月 | sesese图片| 天天操 夜夜操 | 免费网站看v片在线a | 午夜精品久久久久久久99无限制 | a爱爱视频 | 国产精品久久久久久久久久不蜜月 | 亚洲专区欧美 | 免费一级特黄毛大片 | 久久黄色网 | 国产美腿白丝袜足在线av | av综合网址| 亚洲欧美激情精品一区二区 | 新版资源中文在线观看 | 久久精品视频日本 | 免费看成年人 | 免费看高清毛片 | 久久综合久久综合这里只有精品 | 又湿又紧又大又爽a视频国产 | 91亚洲视频在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 免费看片网页 | 国产最新视频在线观看 | 亚洲乱码在线 | 午夜婷婷在线播放 | 成人亚洲欧美 | 国产精品美女毛片真酒店 | 福利视频区 | 亚洲视频免费在线观看 | 亚洲精品乱码久久久久久9色 | 亚洲国产网址 | 欧美在线1| 99久久er热在这里只有精品66 | 深夜福利视频一区二区 | 国产欧美高清 | 国产丝袜制服在线 | 免费高清在线视频一区· | 久久免费a| 久久国产精品99久久久久 | 国产剧情在线一区 | 最近更新中文字幕 | 久久精品超碰 | 99热最新精品 | 久久66热这里只有精品 | 久久久久久草 | 久久久久久久久久电影 | 五月激情亚洲 | 最新日韩中文字幕 | 午夜久久福利 | 在线视频欧美日韩 | 狠狠操.com| 国产精品成人aaaaa网站 | 五月婷婷激情网 | 在线观看亚洲精品 | 91中文字幕在线播放 | 欧美日产一区 | 99操视频 | 日韩一区精品 | 国产精品美女久久久免费 | 99精品国产aⅴ | 91免费国产在线观看 | 欧美精品久久久久久久久老牛影院 | 999视频在线播放 | 国产一区二区三区高清播放 | 亚洲黄色片在线 | 日韩精品视频免费专区在线播放 | 久久久国产99久久国产一 | 婷婷激情久久 | 午夜av一区| 在线中文字幕播放 | 国产精品大片免费观看 | 在线va网站 | 91精品秘密在线观看 | 亚洲mv大片欧洲mv大片免费 | 国产精品视频专区 | 免费裸体视频网 | 美女精品久久久 | 亚洲精品免费在线视频 | 色网站中文字幕 | 午夜精品中文字幕 | 93久久精品日日躁夜夜躁欧美 | 久久黄色精品视频 | 丁香婷婷综合色啪 | 黄在线免费观看 | 蜜臀久久99精品久久久无需会员 | 久久夜色精品国产欧美乱 | 色5月婷婷 | 在线看毛片网站 | 国产成人亚洲精品自产在线 | 国产专区在线看 | www免费在线观看 | 国产日韩欧美视频 | 欧美少妇影院 | 中文字幕999 | 国产精品大片 | 国产精品一区在线播放 | 欧美日韩不卡在线视频 | 亚洲最新av | 国产美女网站视频 | 伊人婷婷网 | 日韩精品一区二区三区中文字幕 | 久久伊人爱 | 国产在线视频不卡 | av片在线看| 亚洲精品综合欧美二区变态 | 欧美激情精品 | 激情在线网址 | 日韩大片在线免费观看 | 久热国产视频 | 国产高清在线看 | 国产色拍拍拍拍在线精品 | 国产午夜剧场 | 一级片黄色片网站 | 日韩三级视频在线观看 | 亚洲不卡av一区二区三区 | 午夜精品一区二区三区在线播放 | 久久婷婷丁香 | 日本中文字幕久久 | 九色91av| 久久三级视频 | 91九色视频在线播放 | 婷色| 在线91色 | 天天综合网入口 | 色a资源在线 | 精品美女视频 | 成人av免费在线 | 在线免费观看麻豆 | 九九九热精品免费视频观看网站 | 久久香蕉国产 | 欧美日韩国产二区三区 | 久久精品免费观看 | 91在线免费观看网站 | 国内精品久久久 | 国产一区二区久久 | 免费视频99 | 美女啪啪图片 | 亚洲综合视频在线观看 | 激情开心站 | 久久草在线视频国产 | 伊人国产女 | 欧美精品在线一区 | 成人avav | 一区二区三区在线观看免费视频 | 久久人人爽人人爽人人片av软件 | 色悠悠久久综合 | 成人免费观看网站 | 久久久久久久久久久电影 | 中文国产字幕 | 久久99久久99精品中文字幕 | 欧美日韩在线免费观看视频 | 国产精品黑丝在线观看 | 久久精品视频播放 | 国产99久久久久久免费看 | 综合久久久久久久久 | 久久精品中文 | 日韩xxxxxxxxx| 五月婷婷六月丁香 | 日韩爱爱网站 | 久久久国产一区二区三区四区小说 | 欧美一级免费黄色片 | 日韩高清免费电影 | 国产精品久久久久久久久久免费 | 91尤物国产尤物福利在线播放 | 国产高清绿奴videos | 午夜国产福利在线观看 | 黄色aaaaa| 成人在线小视频 | 91亚洲精品久久久蜜桃网站 | 国产资源免费在线观看 | 久草在线在线视频 | 日韩精品视频在线观看免费 | 最新中文字幕视频 | 激情影院在线 | av蜜桃在线 | www色婷婷com | 亚洲视频电影在线 | 亚洲欧洲一区二区在线观看 | 国产精品久久久久久久久久三级 | 一本一本久久a久久精品牛牛影视 | 人人干人人超 | www.狠狠| 99爱视频在线观看 | 丁香一区二区 | 天天操天天添天天吹 | 国产精品不卡在线播放 | 91在线免费播放 | www.啪啪.com| 国产成人无码AⅤ片在线观 日韩av不卡在线 | 在线视频在线观看 | 亚洲电影图片小说 | 国产在线观看,日本 | 日本护士三级少妇三级999 | 欧美日韩裸体免费视频 | 国产大陆亚洲精品国产 | 人人要人人澡人人爽人人dvd | 97在线免费视频观看 | 日韩字幕在线观看 | 精品日韩在线一区 | 激情综合五月天 | 三级性生活视频 | 99久久精品午夜一区二区小说 | 综合激情网 | 精品a视频 | 青春草视频 | 精品国产一区二区三区不卡 | 国产成人精品国内自产拍免费看 | 日韩在线第一 | 在线日韩中文字幕 | 日日干综合 | 日韩aⅴ视频 | 久久国产网| 亚洲在线视频播放 | 精品日韩中文字幕 | 欧美日韩在线播放一区 | 探花视频免费观看 | www.久久视频 | 五月在线 | av 一区二区三区 | 日韩精品一区在线观看 | 国产午夜精品福利视频 | 中文字幕一区二区三区乱码在线 | 日韩欧美视频一区 | 色婷婷久久久综合中文字幕 | 天天激情在线 | 99精品福利 | 在线看国产日韩 | 日本激情中文字幕 | 精品久久亚洲 | 亚洲一区二区三区在线看 | 国产精品美女久久久久久久久久久 | 国内成人精品视频 | 国产精品久久久久久久午夜 | 免费看的黄色 | 97视频人人澡人人爽 | 国产99久久精品一区二区300 | 四虎欧美 | 视频91在线| 色婷婷www | 日本爱爱免费 | 成人av片免费观看app下载 | 毛片永久免费 | 国产你懂的在线 | 日本公妇在线观看 | 亚洲片在线 | 91电影福利| 日韩av三区 | 狠狠的干狠狠的操 | 国产精品毛片久久蜜 | 日本在线观看一区二区三区 | 久久精品波多野结衣 | 四川bbb搡bbb爽爽视频 | 国产精品久久久久久久99 | 精品视频在线免费 | 999国产| 视频在线观看一区 | 久久久久久看片 | 特黄免费av | 国产一区播放 | 国精产品满18岁在线 | 精品播放 | 亚洲欧美国产精品久久久久 | 亚洲最大成人网4388xx | 中文字幕网站 | 国产成人精品网站 | 国产一级黄色片免费看 | 激情久久久 | 激情综合网色播五月 | 91av在线视频播放 | 成人9ⅰ免费影视网站 | 日日摸日日添日日躁av | 视频在线观看入口黄最新永久免费国产 | 99性视频 | 91中文字幕永久在线 | 高清av免费一区中文字幕 | 免费看黄色91 | 伊人导航 | 久久婷婷色 | 国产精品久久久久久久久费观看 | 成人av在线直播 | 国产精品精品久久久久久 | 久久久91精品国产一区二区三区 | 国产中文字幕在线视频 | 超碰人人在| 久久久久久高潮国产精品视 | 亚洲国产理论片 | 欧美一区二区视频97 | 国产亲近乱来精品 | 久久久国产精品网站 | 国产精品久久久久久久久久久久久久 | 国产aa免费视频 | 黄色大片入口 | 最新av网站在线观看 | 成 人 黄 色 视频播放1 | 成年人免费看片 | 久久久免费看视频 | 亚洲国产日韩一区 | 精品久久久久亚洲 | 国产精品久久在线观看 | 日韩三级视频 | 91精品在线免费视频 | 狠狠ri| 激情视频一区二区三区 | 午夜精品视频一区二区三区在线看 | 操操日日| 在线观看黄色国产 | 天天天天天天天天操 | 99久久99久久免费精品蜜臀 | 欧美日视频 | 日韩视频免费 | 免费在线看v | 超碰免费在线公开 | 97超碰在线人人 | 日韩视频一区二区在线 | 国产精品欧美激情在线观看 | 国产福利91精品一区二区三区 | 97色涩 | 99久久精品久久久久久动态片 | 在线看日韩av| 色播六月天 | 国模精品一区二区三区 | av成人动漫在线观看 | 999亚洲国产996395 | 亚洲精品合集 | 色婷婷综合久久久 | 国产精品日韩久久久久 | 欧美亚洲专区 | 精品国产精品久久一区免费式 | 久久久高清一区二区三区 | 成人黄色av免费在线观看 | 在线观看av大片 | 日本黄色大片免费 | 精品国模一区二区三区 | 日韩在线首页 | 国产麻豆剧传媒免费观看 | 精品国精品自拍自在线 | 国产精品专区在线 | 国产在线观看av | 久久99国产精品久久99 | 最近2019中文免费高清视频观看www99 | 国产高清专区 | 玖玖精品在线 | 美女视频永久黄网站免费观看国产 | 成人午夜剧场在线观看 | 亚洲人成人99网站 | 天天五月天色 | 99久久精品免费 | 国产精品欧美久久久久三级 | 久久国产99 | 久久久久区 | 国产91勾搭技师精品 | 毛片网站在线观看 | 91看毛片| 久久久国产日韩 | 亚洲国产精品久久久久 | 久久国产精品精品国产色婷婷 | 日本黄色免费电影网站 | 高清免费av在线 | 久久精品国产亚洲精品2020 | 狠狠地操 | 久久久99久久 | av免费电影在线 | 在线观看91 | 夜夜躁日日躁狠狠躁 | 久草视频在线免费 | 麻豆国产精品va在线观看不卡 | 久久99热精品这里久久精品 | 国产精品福利久久久 | 天天天综合| 伊人狠狠色丁香婷婷综合 | 国产九九九九九 | 91精品啪在线观看国产81旧版 | 国产成人精品福利 | 国产精品美女久久久久久久久 | 欧美大jb | 免费在线播放av电影 | 四虎在线免费观看 | 极品美女被弄高潮视频网站 | 在线午夜电影神马影院 | 欧美三级高清 | 亚洲精品久久激情国产片 | 日本久久电影网 | 久久综合久久综合这里只有精品 | 婷婷色中文网 |