亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++強(qiáng)制類型轉(zhuǎn)換的四種方式

 更新時(shí)間:2022年05月24日 15:41:03   作者:u_hcy2000  
本文主要介紹了C++強(qiáng)制類型轉(zhuǎn)換的四種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1 C++類型轉(zhuǎn)換本質(zhì)

1.1 自動(dòng)類型轉(zhuǎn)換(隱式)

利用編譯器內(nèi)置的轉(zhuǎn)換規(guī)則,或者用戶自定義的轉(zhuǎn)換構(gòu)造函數(shù)以及類型轉(zhuǎn)換函數(shù)(這些都可以認(rèn)為是已知的轉(zhuǎn)換規(guī)則)。
例如從 int 到 double、從派生類到基類、從type *到void *、從 double 到 Complex 等。
注:

type *是一個(gè)具體類型的指針,例如int *、double *、Student *等,它們都可以直接賦值給void *指針。
例如,malloc() 分配內(nèi)存后返回的就是一個(gè)void *指針,我們必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換后才能賦值給指針變量。

1.2 強(qiáng)制類型轉(zhuǎn)換(顯式)

隱式不能完成的類型轉(zhuǎn)換工作,就必須使用強(qiáng)制類型轉(zhuǎn)換
(new_type) expression

1.3 類型轉(zhuǎn)換的本質(zhì)

數(shù)據(jù)類型的本質(zhì):
這種「確定數(shù)據(jù)的解釋方式」的工作就是由數(shù)據(jù)類型(Data Type)來完成的。例如int a;表明,a 這份數(shù)據(jù)是整數(shù),不能理解為像素、聲音、視頻等。
數(shù)據(jù)類型轉(zhuǎn)換的本質(zhì):
數(shù)據(jù)類型轉(zhuǎn)換,就是對(duì)數(shù)據(jù)所占用的二進(jìn)制位做出重新解釋。

  • 隱式類型轉(zhuǎn)換:編譯器可以根據(jù)已知的轉(zhuǎn)換規(guī)則來決定是否需要修改數(shù)據(jù)的二進(jìn)制位
  • 強(qiáng)制類型轉(zhuǎn)換:由于沒有對(duì)應(yīng)的轉(zhuǎn)換規(guī)則,所以能做的事情僅僅是重新解釋數(shù)據(jù)的二進(jìn)制位,但無法對(duì)數(shù)據(jù)的二進(jìn)制位做出修正。

1.4 類型轉(zhuǎn)換的安全性

隱式類型轉(zhuǎn)換必須使用已知的轉(zhuǎn)換規(guī)則,雖然靈活性受到了限制,但是由于能夠?qū)?shù)據(jù)進(jìn)行恰當(dāng)?shù)卣{(diào)整,所以更加安全(幾乎沒有風(fēng)險(xiǎn))。
強(qiáng)制類型轉(zhuǎn)換能夠在更大范圍的數(shù)據(jù)類型之間進(jìn)行轉(zhuǎn)換,例如不同類型指針(引用)之間的轉(zhuǎn)換、從 const 到非 const 的轉(zhuǎn)換、從 int 到指針的轉(zhuǎn)換(有些編譯器也允許反過來)等,這雖然增加了靈活性,但是由于不能恰當(dāng)?shù)卣{(diào)整數(shù)據(jù),所以也充滿了風(fēng)險(xiǎn),程序員要小心使用。

2 四種類型轉(zhuǎn)換運(yùn)算符

2.1 C語(yǔ)言的強(qiáng)制類型轉(zhuǎn)換與C++的區(qū)別

C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換統(tǒng)一使用(),而()在代碼中隨處可見,所以也不利于使用檢索工具定位強(qiáng)轉(zhuǎn)的代碼位置。
C++ 對(duì)類型轉(zhuǎn)換進(jìn)行了分類,并新增了四個(gè)關(guān)鍵字來予以支持,它們分別是:

關(guān)鍵字                         說明
static_cast            用于良性轉(zhuǎn)換,一般不會(huì)導(dǎo)致意外發(fā)生,風(fēng)險(xiǎn)很低。
const_cast            用于 const 與非 const、volatile 與非 volatile 之間的轉(zhuǎn)換。
reinterpret_cast    高度危險(xiǎn)的轉(zhuǎn)換,這種轉(zhuǎn)換僅僅是對(duì)二進(jìn)制位的重新解釋,不會(huì)借助已有的轉(zhuǎn)換規(guī)則對(duì)數(shù)據(jù)進(jìn)行調(diào)整,但是可以實(shí)現(xiàn)最靈活的 C++ 類型轉(zhuǎn)換。
dynamic_cast        借助 RTTI,用于類型安全的向下轉(zhuǎn)型(Downcasting)。

語(yǔ)法格式為: xxx_cast<newType>(data)

3 static_cast

static_cast 是“靜態(tài)轉(zhuǎn)換”的意思,也就是在編譯期間轉(zhuǎn)換,轉(zhuǎn)換失敗的話會(huì)拋出一個(gè)編譯錯(cuò)誤。
舉個(gè)例子:

#include <iostream>
#include <cstdlib>
using namespace std;

class Complex{
public:
? ? Complex(double real = 0.0, double imag = 0.0): m_real(real), m_imag(imag){ }
public:
? ? operator double() const { return m_real; } ?//類型轉(zhuǎn)換函數(shù)
private:
? ? double m_real;
? ? double m_imag;
};

int main(){
? ? //下面是正確的用法
? ? int m = 100;
? ? Complex c(12.5, 23.8);
? ? long n = static_cast<long>(m); ?//寬轉(zhuǎn)換,沒有信息丟失
? ? char ch = static_cast<char>(m); ?//窄轉(zhuǎn)換,可能會(huì)丟失信息
? ? int *p1 = static_cast<int*>( malloc(10 * sizeof(int)) ); ?//將void指針轉(zhuǎn)換為具體類型指針
? ? void *p2 = static_cast<void*>(p1); ?//將具體類型指針,轉(zhuǎn)換為void指針
? ? double real= static_cast<double>(c); ?//調(diào)用類型轉(zhuǎn)換函數(shù)
? ?
? ? //下面的用法是錯(cuò)誤的
? ? float *p3 = static_cast<float*>(p1); ?//不能在兩個(gè)具體類型的指針之間進(jìn)行轉(zhuǎn)換
? ? p3 = static_cast<float*>(0X2DF9); ?//不能將整數(shù)轉(zhuǎn)換為指針類型

? ? return 0;
}

4 reinterpret_cast

reinterpret_cast 用于進(jìn)行各種不同類型的指針之間、不同類型的引用之間以及指針和能容納指針的整數(shù)類型之間的轉(zhuǎn)換。轉(zhuǎn)換時(shí),執(zhí)行的是逐個(gè)比特復(fù)制的操作。

#include <iostream>
using namespace std;
class A
{
public:
    int i;
    int j;
    A(int n):i(n),j(n) { }
};
int main()
{
    A a(100);
    int &r = reinterpret_cast<int&>(a); //強(qiáng)行讓 r 引用 a
    r = 200;  //把 a.i 變成了 200
    cout << a.i << "," << a.j << endl;  // 輸出 200,100
    int n = 300;
    A *pa = reinterpret_cast<A*> ( & n); //強(qiáng)行讓 pa 指向 n
    pa->i = 400;  // n 變成 400
    pa->j = 500;  //此條語(yǔ)句不安全,很可能導(dǎo)致程序崩潰
    cout << n << endl;  // 輸出 400
    long long la = 0x12345678abcdLL;
    pa = reinterpret_cast<A*>(la); //la太長(zhǎng),只取低32位0x5678abcd拷貝給pa
    unsigned int u = reinterpret_cast<unsigned int>(pa);//pa逐個(gè)比特拷貝到u
    cout << hex << u << endl;  //輸出 5678abcd
    typedef void (* PF1) (int);
    typedef int (* PF2) (int,char *);
    PF1 pf1;  PF2 pf2;
    pf2 = reinterpret_cast<PF2>(pf1); //兩個(gè)不同類型的函數(shù)指針之間可以互相轉(zhuǎn)換
}

reinterpret_cast體現(xiàn)了 C++ 語(yǔ)言的設(shè)計(jì)思想:用戶可以做任何操作,但要為自己的行為負(fù)責(zé)。

5 const_cast

const_cast 運(yùn)算符僅用于進(jìn)行去除 const 屬性的轉(zhuǎn)換,它也是四個(gè)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符中唯一能夠去除 const 屬性的運(yùn)算符。

將 const 引用轉(zhuǎn)換為同類型的非 const 引用,將 const 指針轉(zhuǎn)換為同類型的非 const 指針時(shí)可以使用 const_cast 運(yùn)算符。例如:

const string s = "Inception";
string& p = const_cast <string&> (s);
string* ps = const_cast <string*> (&s);  // &s 的類型是 const string*

6 dynamic_cast

用 reinterpret_cast 可以將多態(tài)基類(包含虛函數(shù)的基類)的指針強(qiáng)制轉(zhuǎn)換為派生類的指針,但是這種轉(zhuǎn)換不檢查安全性,即不檢查轉(zhuǎn)換后的指針是否確實(shí)指向一個(gè)派生類對(duì)象。
dynamic_cast專門用于將多態(tài)基類的指針或引用強(qiáng)制轉(zhuǎn)換為派生類的指針或引用,而且能夠檢查轉(zhuǎn)換的安全性。對(duì)于不安全的指針轉(zhuǎn)換,轉(zhuǎn)換結(jié)果返回 NULL 指針。

dynamic_cast 用于在類的繼承層次之間進(jìn)行類型轉(zhuǎn)換,它既允許向上轉(zhuǎn)型(Upcasting),也允許向下轉(zhuǎn)型(Downcasting)。向上轉(zhuǎn)型是無條件的,不會(huì)進(jìn)行任何檢測(cè),所以都能成功;向下轉(zhuǎn)型的前提必須是安全的,要借助 RTTI 進(jìn)行檢測(cè),所有只有一部分能成功。

dynamic_cast 與 static_cast 是相對(duì)的,dynamic_cast 是“動(dòng)態(tài)轉(zhuǎn)換”的意思,static_cast 是“靜態(tài)轉(zhuǎn)換”的意思。dynamic_cast 會(huì)在程序運(yùn)行期間借助 RTTI 進(jìn)行類型轉(zhuǎn)換,這就要求基類必須包含虛函數(shù);static_cast 在編譯期間完成類型轉(zhuǎn)換,能夠更加及時(shí)地發(fā)現(xiàn)錯(cuò)誤。

dynamic_cast 是通過“運(yùn)行時(shí)類型檢查”來保證安全性的。
dynamic_cast 不能用于將非多態(tài)基類的指針或引用強(qiáng)制轉(zhuǎn)換為派生類的指針或引用——這種轉(zhuǎn)換沒法保證安全性,只好用 reinterpret_cast 來完成。

6.1 向上轉(zhuǎn)型(Upcasting)

向上轉(zhuǎn)型時(shí),只要待轉(zhuǎn)換的兩個(gè)類型之間存在繼承關(guān)系,并且基類包含了虛函數(shù)(這些信息在編譯期間就能確定),就一定能轉(zhuǎn)換成功。因?yàn)橄蛏限D(zhuǎn)型始終是安全的,所以 dynamic_cast 不會(huì)進(jìn)行任何運(yùn)行期間的檢查,這個(gè)時(shí)候的 dynamic_cast 和 static_cast 就沒有什么區(qū)別了。
「向上轉(zhuǎn)型時(shí)不執(zhí)行運(yùn)行期檢測(cè)」雖然提高了效率,但也留下了安全隱患,請(qǐng)看下面的代碼:

#include <iostream>
#include <iomanip>
using namespace std;

class Base{
public:
? ? Base(int a = 0): m_a(a){ }
? ? int get_a() const{ return m_a; }
? ? virtual void func() const { }
protected:
? ? int m_a;
};

class Derived: public Base{
public:
? ? Derived(int a = 0, int b = 0): Base(a), m_b(b){ }
? ? int get_b() const { return m_b; }
private:
? ? int m_b;
};

int main(){
? ? //情況①
? ? Derived *pd1 = new Derived(35, 78);
? ? Base *pb1 = dynamic_cast<Derived*>(pd1);
? ? cout<<"pd1 = "<<pd1<<", pb1 = "<<pb1<<endl;
? ? cout<<pb1->get_a()<<endl;
? ? pb1->func();

? ? //情況②
? ? int n = 100;
? ? Derived *pd2 = reinterpret_cast<Derived*>(&n);
? ? Base *pb2 = dynamic_cast<Base*>(pd2);
? ? cout<<"pd2 = "<<pd2<<", pb2 = "<<pb2<<endl;
? ? cout<<pb2->get_a()<<endl; ?//輸出一個(gè)垃圾值
? ? pb2->func(); ?//內(nèi)存錯(cuò)誤

? ? return 0;
}

情況①是正確的,沒有任何問題。對(duì)于情況②,pd 指向的是整型變量 n,并沒有指向一個(gè) Derived 類的對(duì)象,在使用 dynamic_cast 進(jìn)行類型轉(zhuǎn)換時(shí)也沒有檢查這一點(diǎn),而是將 pd 的值直接賦給了 pb(這里并不需要調(diào)整偏移量),最終導(dǎo)致 pb 也指向了 n。因?yàn)?pb 指向的不是一個(gè)對(duì)象,所以get_a()得不到 m_a 的值(實(shí)際上得到的是一個(gè)垃圾值),pb2->func()也得不到 func() 函數(shù)的正確地址。
pb2->func()得不到 func() 的正確地址的原因在于,pb2 指向的是一個(gè)假的“對(duì)象”,它沒有虛函數(shù)表,也沒有虛函數(shù)表指針,而 func() 是虛函數(shù),必須到虛函數(shù)表中才能找到它的地址。

6.2 向下轉(zhuǎn)型(Downcasting)

向下轉(zhuǎn)型是有風(fēng)險(xiǎn)的,dynamic_cast 會(huì)借助 RTTI 信息進(jìn)行檢測(cè),確定安全的才能轉(zhuǎn)換成功,否則就轉(zhuǎn)換失敗。那么,哪些向下轉(zhuǎn)型是安全地呢,哪些又是不安全的呢?下面我們通過一個(gè)例子來演示:

#include <iostream>
using namespace std;

class A{
public:
? ? virtual void func() const { cout<<"Class A"<<endl; }
private:
? ? int m_a;
};

class B: public A{
public:
? ? virtual void func() const { cout<<"Class B"<<endl; }
private:
? ? int m_b;
};

class C: public B{
public:
? ? virtual void func() const { cout<<"Class C"<<endl; }
private:
? ? int m_c;
};

class D: public C{
public:
? ? virtual void func() const { cout<<"Class D"<<endl; }
private:
? ? int m_d;
};

int main(){
? ? A *pa = new A();
? ? B *pb;
? ? C *pc;
? ?
? ? //情況①
? ? pb = dynamic_cast<B*>(pa); ?//向下轉(zhuǎn)型失敗
? ? if(pb == NULL){
? ? ? ? cout<<"Downcasting failed: A* to B*"<<endl;
? ? }else{
? ? ? ? cout<<"Downcasting successfully: A* to B*"<<endl;
? ? ? ? pb -> func();
? ? }
? ? pc = dynamic_cast<C*>(pa); ?//向下轉(zhuǎn)型失敗
? ? if(pc == NULL){
? ? ? ? cout<<"Downcasting failed: A* to C*"<<endl;
? ? }else{
? ? ? ? cout<<"Downcasting successfully: A* to C*"<<endl;
? ? ? ? pc -> func();
? ? }
? ?
? ? cout<<"-------------------------"<<endl;
? ?
? ? //情況②
? ? pa = new D(); ?//向上轉(zhuǎn)型都是允許的
? ? pb = dynamic_cast<B*>(pa); ?//向下轉(zhuǎn)型成功
? ? if(pb == NULL){
? ? ? ? cout<<"Downcasting failed: A* to B*"<<endl;
? ? }else{
? ? ? ? cout<<"Downcasting successfully: A* to B*"<<endl;
? ? ? ? pb -> func();
? ? }
? ? pc = dynamic_cast<C*>(pa); ?//向下轉(zhuǎn)型成功
? ? if(pc == NULL){
? ? ? ? cout<<"Downcasting failed: A* to C*"<<endl;
? ? }else{
? ? ? ? cout<<"Downcasting successfully: A* to C*"<<endl;
? ? ? ? pc -> func();
? ? }
? ?
? ? return 0;
}

當(dāng)使用 dynamic_cast 對(duì)指針進(jìn)行類型轉(zhuǎn)換時(shí),程序會(huì)先找到該指針指向的對(duì)象,再根據(jù)對(duì)象找到當(dāng)前類(指針指向的對(duì)象所屬的類)的類型信息,并從此節(jié)點(diǎn)開始沿著繼承鏈向上遍歷,如果找到了要轉(zhuǎn)化的目標(biāo)類型,那么說明這種轉(zhuǎn)換是安全的,就能夠轉(zhuǎn)換成功,如果沒有找到要轉(zhuǎn)換的目標(biāo)類型,那么說明這種轉(zhuǎn)換存在較大的風(fēng)險(xiǎn),就不能轉(zhuǎn)換。

對(duì)于本例中的情況①,pa 指向 A 類對(duì)象,根據(jù)該對(duì)象找到的就是 A 的類型信息,當(dāng)程序從這個(gè)節(jié)點(diǎn)開始向上遍歷時(shí),發(fā)現(xiàn) A 的上方?jīng)]有要轉(zhuǎn)換的 B 類型或 C 類型(實(shí)際上 A 的上方?jīng)]有任何類型了),所以就轉(zhuǎn)換敗了。對(duì)于情況②,pa 指向 D 類對(duì)象,根據(jù)該對(duì)象找到的就是 D 的類型信息,程序從這個(gè)節(jié)點(diǎn)向上遍歷的過程中,發(fā)現(xiàn)了 C 類型和 B 類型,所以就轉(zhuǎn)換成功了。

總起來說,dynamic_cast 會(huì)在程序運(yùn)行過程中遍歷繼承鏈,如果途中遇到了要轉(zhuǎn)換的目標(biāo)類型,那么就能夠轉(zhuǎn)換成功,如果直到繼承鏈的頂點(diǎn)(最頂層的基類)還沒有遇到要轉(zhuǎn)換的目標(biāo)類型,那么就轉(zhuǎn)換失敗。對(duì)于同一個(gè)指針(例如 pa),它指向的對(duì)象不同,會(huì)導(dǎo)致遍歷繼承鏈的起點(diǎn)不一樣,途中能夠匹配到的類型也不一樣,所以相同的類型轉(zhuǎn)換產(chǎn)生了不同的結(jié)果。

從表面上看起來 dynamic_cast 確實(shí)能夠向下轉(zhuǎn)型,本例也很好地證明了這一點(diǎn):B 和 C 都是 A 的派生類,我們成功地將 pa 從 A 類型指針轉(zhuǎn)換成了 B 和 C 類型指針。但是從本質(zhì)上講,dynamic_cast 還是只允許向上轉(zhuǎn)型,因?yàn)樗粫?huì)向上遍歷繼承鏈。造成這種假象的根本原因在于,派生類對(duì)象可以用任何一個(gè)基類的指針指向它,這樣做始終是安全的。本例中的情況②,pa 指向的對(duì)象是 D 類型的,pa、pb、pc 都是 D 的基類的指針,所以它們都可以指向 D 類型的對(duì)象,dynamic_cast 只是讓不同的基類指針指向同一個(gè)派生類對(duì)象罷了。

參考:http://c.biancheng.net/view/2343.html

到此這篇關(guān)于C++強(qiáng)制類型轉(zhuǎn)換的四種方式的文章就介紹到這了,更多相關(guān)C++強(qiáng)制類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vscode遠(yuǎn)程連接服務(wù)器(免密登錄+遠(yuǎn)程開發(fā))

    vscode遠(yuǎn)程連接服務(wù)器(免密登錄+遠(yuǎn)程開發(fā))

    vscode的遠(yuǎn)程連接功能十分方便,本文就來介紹一下vscode遠(yuǎn)程連接服務(wù)器,主要包括免密登錄和遠(yuǎn)程開發(fā),感興趣的可以了解一下
    2024-07-07
  • C語(yǔ)言手撕一個(gè)Hash表(HashTable)實(shí)例代碼

    C語(yǔ)言手撕一個(gè)Hash表(HashTable)實(shí)例代碼

    哈希表(HashTable)是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它可以在常量時(shí)間內(nèi)進(jìn)行插入、查找和刪除操作,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言手撕一個(gè)Hash表(HashTable)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • C/C++調(diào)用Fortran的DLL的操作過程

    C/C++調(diào)用Fortran的DLL的操作過程

    這篇文章主要介紹了C/C++調(diào)用Fortran的DLL,本文以一個(gè)簡(jiǎn)單的加法器為例,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • C++中大括號(hào)的用法合集

    C++中大括號(hào)的用法合集

    學(xué)習(xí)C++以來還沒有總結(jié)過C++的大括號(hào)的使用方式,所以這篇文章主要來和大家介紹一下C++中大括號(hào)的用法合集,需要的小伙伴可以參考一下
    2024-12-12
  • 詳解VSCode下C++環(huán)境配置過程

    詳解VSCode下C++環(huán)境配置過程

    這篇文章主要介紹了VSCode C++環(huán)境配置過程,在這大家需要在代碼的目錄下的.vscode文件夾下創(chuàng)建launch.json、tasks.json,具體實(shí)現(xiàn)過程跟隨小編一起看看吧
    2021-11-11
  • Matlab實(shí)現(xiàn)將圖像序列合并為視頻的方法詳解

    Matlab實(shí)現(xiàn)將圖像序列合并為視頻的方法詳解

    MATLAB是一種高性能語(yǔ)言,用于操縱矩陣、執(zhí)行技術(shù)計(jì)算、繪圖等。它代表矩陣實(shí)驗(yàn)室。借助這個(gè)軟件,我們可以從圖像中創(chuàng)建視頻。這篇文章主要介紹了Matlab實(shí)現(xiàn)將圖像序列合并為視頻的四個(gè)方法,希望對(duì)大家有所幫助
    2023-03-03
  • C語(yǔ)言fillpoly函數(shù)詳解

    C語(yǔ)言fillpoly函數(shù)詳解

    在C語(yǔ)言中,fillpoly函數(shù)的功能是畫一個(gè)多邊形,并且把多邊形填充。填充邊框所定義的多邊形的內(nèi)部。fillpoly 函數(shù)的用法:void far fillpoly(int numpoints, int far *polypoints);。
    2015-10-10
  • C++ 中try finally關(guān)鍵字詳解

    C++ 中try finally關(guān)鍵字詳解

    本文給大家介紹C++ 中try finally關(guān)鍵字的相關(guān)知識(shí),非常不錯(cuò),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • C++中的四種類型轉(zhuǎn)換

    C++中的四種類型轉(zhuǎn)換

    類型轉(zhuǎn)換有c風(fēng)格的,當(dāng)然還有c++風(fēng)格的。c風(fēng)格的轉(zhuǎn)換的格式很簡(jiǎn)單(TYPE)EXPRESSION,但是c風(fēng)格的類型轉(zhuǎn)換有不少的缺點(diǎn),有的時(shí)候用c風(fēng)格的轉(zhuǎn)換是不合適的,因?yàn)樗梢栽谌我忸愋椭g轉(zhuǎn)換,
    2015-08-08
  • C++ 函數(shù)模板和類模板詳情

    C++ 函數(shù)模板和類模板詳情

    這篇文章主要對(duì)C++ 函數(shù)模板和類模板的相關(guān)資料的詳細(xì)介紹,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09

最新評(píng)論