C++的默认函数与default和delete用法

合集下载

c 关键字大全

c 关键字大全

C++关键字大全1. asm(汇编),用法如下:asm (指令字符串); 允许在C++程序中嵌入汇编代码。

2. auto(自动,automatic)是存储类型标识符,表明变量“自动”具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。

3. bool(布尔)类型,C++中的基本数据结构,其值可选为true(真)或者false(假)。

C++中的bool类型可以和int混用,具体来说就是0代表false,非0代表true。

bool类型常用于条件判断和函数返回值。

4. break(中断、跳出),用在switch语句或者循环语句中。

程序遇到break后,即跳过该程序段,继续后面的语句执行。

5. case用于switch语句中,用于判断不同的条件类型。

6. catch catch和try语句一起用于异常处理。

7. char char(字符,character)类型,C++中的基本数据结构,其值一般为0~255的int。

这256个字符对应着256个ASCII码。

char类型的数据需要用单引号’’括起来。

8. class class(类)是C++面向对象设计的基础。

使用class关键字声明一个类。

9. const const(常量的,constant)所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。

在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。

在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量10. const_cast 用法:const_cast<type_id> (expression) 该运算符用来修改类型的const或volatile属性。

delete的用法

delete的用法

delete的用法在编程语言中,delete是一种释放内存的方法,在编程语言中,它是一个操作符。

它可以用来释放从程序中获取的内存,以避免内存泄漏。

delete是一种常见的编程语言语法,用于管理内存分配和释放,以防止内存泄漏。

C++中的delete用法在C++中,delete它是一个类内操作符,用于析构一个对象或释放一个指针所指向的内存。

它必须用于作用于new创建的对象,它可以用来释放该对象申请的内存。

程序员在使用delete之前必须使用new进行内存分配,否则将会出错。

使用delete的时候,程序员可以分配一个指针,然后释放它所指向的内存,以避免内存泄漏。

delete能够释放单个指针及其指向的内存,也能释放数组指针及其所指向的全部内存。

例如,在C++中声明数组,可以使用new数组来为其分配内存,然后用delete数组来释放该数组所占的内存。

在C++中,delete还可以用来释放智能指针的内存,而不必手动释放智能指针所指向的内存。

使用delete之前,程序员必须使用new 进行内存分配,否则将会出错。

Java中的delete用法在Java中,delete的用法与C++的用法基本类似,它也用于释放内存。

在Java中,delete用于析构对象或释放指针指向的内存。

不同的是,在Java中,程序员不需要使用new进行内存分配,因为Java拥有自动内存管理机制,也就是垃圾收集机制。

在Java中,delete只能用于释放指针指向的内存,不能用于释放智能指针的内存。

其他编程语言中的delete用法除了C++和Java,一些其他编程语言也有delete这种语法。

例如,在C#中,delete可以用于释放指针指向的内存,也可以用于释放数组指针及其所指向的全部内存。

但是,与C++、Java不同,在C#中delete可以用于释放智能指针,而不需要手动释放内存。

此外,在Python中,delete也是一种语法,它可以用于释放指针指向的内存,但不能用于释放智能指针的内存。

new和delete的用法

new和delete的用法

new和delete的用法
new和delete用法
1、new和delete是C++中标准库规定的关键字之一,即动态内存分配
管理的操作符。

2、new用于在运行时分配内存空间并返回对象的首地址指针,delete
用于释放指定对象占用的内存空间。

3、new语法格式:指针变量= new 数据类型;
4、delete语法格式:delete 指针变量;
5、new和delete结合使用时,应当注意遵守C++定义的动态内存的匹
配原则,即要严格地按照一对new语句和一对delete语句的比例来使用。

6、new运算符可以在括号中指定空间大小,从而控制动态内存的长度:指针变量= new 数据类型[长度];
7、new和delete运算符在一起使用时,还可以用于分配和释放多维数组:
指针变量= new 数据类型[i][j];(i,j表示数组的维度)
delete [] 指针变量;
8、new运算符和delete运算符可以和成员函数一起使用:new对象后
调用对象中的成员函数,delete对象前调用成员函数释放相关资源。

9、new和delete运算符还可以用来实现复杂的内存申请和释放操作,
如关联内存的释放等。

10、在大量的程序中使用new和delete操作符,还需要注意异常处理,以保证程序的安全性。

c语言默认参数的函数

c语言默认参数的函数

C语言默认参数的函数1. 什么是默认参数在C语言中,函数的参数可以设置默认值,也就是说在调用函数时,如果没有提供某个参数的值,则会自动使用默认值。

这样的函数被称为带有默认参数的函数。

默认参数的主要作用是简化函数的调用,如果某个函数的某个参数的值在大部分情况下都是相同的,那么可以将该参数设置为默认参数,从而减少函数调用时需要提供的参数个数。

2. 默认参数的函数定义默认参数的函数定义有一定的规则:•默认参数只能从右至左连续出现,即在函数参数列表中,所有默认参数必须在非默认参数右侧。

•一旦某个参数被指定为默认参数,它右侧的所有参数都必须指定默认值,不能省略。

函数定义的一般形式如下:返回值类型函数名(参数1类型参数1, 参数2类型参数2 = 默认值, ...){函数体}其中,参数1和参数2是函数的形式参数,可以在函数体中使用。

参数2可以设置默认值,默认值可以是一个常量或表达式。

3. 默认参数的函数用途默认参数的函数主要用于简化函数的调用。

它们可以提供一个默认值,避免在大部分情况下都传递相同的实参。

默认参数的函数广泛应用于实际编程中,以下是一些常见的用途:1.函数重载:默认参数可以用于实现函数重载,即定义多个同名函数,但参数个数或类型不同。

2.提供默认配置:默认参数可以用于设置函数的默认配置,用户可以根据需要选择性地覆盖部分或全部默认参数值。

3.创建API接口:默认参数可以用于创建API接口,对外提供简洁、易用的函数调用方式。

4.函数回调:默认参数可以用于函数回调中的回调函数参数,简化回调函数的定义和调用。

4. 默认参数的工作方式默认参数的工作方式是在函数定义中指定默认值,并在函数调用时省略相应的实参。

在函数被调用时,如果实参没有提供对应的值,则使用默认值。

如果实参提供了对应的值,则使用实参的值。

下面通过一个例子来详细说明默认参数的工作方式:#include <stdio.h>int sum(int a, int b = 0, int c = 0) {return a + b + c;}int main() {printf("%d\n", sum(1)); // 输出:1printf("%d\n", sum(1, 2)); // 输出:3printf("%d\n", sum(1, 2, 3)); // 输出:6return 0;}在上面的例子中,sum函数定义了三个参数,其中参数b和c都设置了默认值为0。

c语言中default的用法

c语言中default的用法

c语言中default的用法C语言是一门实践性和动手能力要求很高的大学主干课程,但是C 语言实验课的教学一直不受重视,教学效果也不太理想。

下面小编就跟你们详细介绍下c语言中default的用法,希望对你们有用。

C语言中的switch和default的意思1.用于多分支选择的switch语句,其一般形式为:switch(表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; … case 常量表达式n: 语句n; default: 语句n+1;}2.switch 是分支语句,就是比较强大的if集;default为不满足所有的switch条件则后面的句子被执行。

一般将default写在switch中的最后3.是否要使用deafult不!但是为了进行错误检查或逻辑检查,还是应该在switch语句中加入default分支。

例如,下述switch语句完全合法:switch (char_code){ case tyt: case 'y': printf ( " You answered YES ! \n" ) break case 'N': case 'n': printf ("You answered NO!\n"); break}但是,如果一个未知字符被传递给这条switch语句,会出现什么情况呢?这时,程序将没有任何输出。

因此,最好还是加入一个default分支,以处理这种情况:......default: printf ("Unknown response : %d\n", char_code); break......此外,default分支能给逻辑检查带来很多方便。

例如,如果用switch语句来处理数目固定的条件,而且认为这些条件之外的值都属于逻辑错误,那么可以加入一个default分支来辨识逻辑错误。

c语言default用法

c语言default用法

c语言default用法C语言中,default用法通常是指在程序设计中,当某些条件未满足或未匹配时,使用默认值或默认行为的一种方式。

在C语言中,default用法主要体现在函数参数、结构体成员和数组元素等方面。

一、函数参数的default用法在C语言中,函数的参数可以通过default用法提供默认值。

当函数调用时,如果没有提供参数值,则会使用默认值。

例如,以下函数定义中,如果调用该函数时没有提供第一个参数值,则会使用默认值5:```cvoidmy_function(intnum1,intnum2){//函数体代码}```可以通过以下方式调用该函数:```cintmain(){my_function(7,8);//使用传入的参数值my_function(2,3);//使用第二个参数的值作为第一个参数的值return0;}```二、结构体成员的default用法在C语言中,结构体是一种自定义数据类型,可以包含多个不同类型的数据成员。

结构体成员也可以使用default用法提供默认值。

例如,以下结构体定义中,如果结构体实例化时没有提供某个数据成员的值,则会使用默认值0:```cstructmy_struct{intnum1;//数据成员之一charch;//数据成员之二};```可以通过以下方式创建结构体实例并初始化:```cstructmy_structmy_object={5,'a'};//使用传入的初始值创建结构体实例```三、数组元素的default用法在C语言中,数组是一种存储相同类型元素的数据结构。

数组元素也可以使用default用法提供默认值。

例如,以下数组定义中,如果数组元素未被赋值,则会使用默认值0:```cintmy_array[5];//定义一个包含5个整数的数组```可以通过以下方式访问数组元素并为其赋值:```cinti;//假设i为数组元素的索引位置my_array[i]=10;//为数组元素赋值10(如果i小于数组长度)```需要注意的是,在使用default用法时,需要根据具体情况选择合适的默认值和行为。

c语言中不同类型的默认值

c语言中不同类型的默认值C语言中不同类型的默认值在C语言中,每个数据类型都有一个默认值,即在声明变量时如果没有给变量赋初值,那么变量将会被赋予默认值。

这些默认值对于我们理解和使用变量非常重要,因此本文将介绍C语言中不同数据类型的默认值。

1. 整型(Integer)类型的默认值- char类型:默认值为0。

- short类型:默认值为0。

- int类型:默认值为0。

- long类型:默认值为0L。

- long long类型:默认值为0LL。

2. 浮点型(Floating Point)类型的默认值- float类型:默认值为0.0f。

- double类型:默认值为0.0。

- long double类型:默认值为0.0L。

3. 字符型(Character)类型的默认值- char类型:默认值为'\0',即空字符。

4. 指针(Pointer)类型的默认值- 指针类型的默认值为NULL,表示指针不指向任何有效的内存地址。

5. 枚举(Enumeration)类型的默认值- 枚举类型的默认值为第一个枚举常量的值。

6. 结构体(Structure)类型的默认值- 结构体类型的默认值为各成员变量的默认值。

7. 联合体(Union)类型的默认值- 联合体类型的默认值为最后一个成员的默认值。

8. 数组(Array)类型的默认值- 数组类型的默认值为各元素类型的默认值。

需要注意的是,C语言中的默认值只在声明变量时才会被赋予,如果在声明后没有给变量赋初值,那么变量将会保持默认值。

C语言还提供了一些特殊的默认值表示方式:- NULL:表示空指针。

- EOF:表示文件结束。

对于用户自定义的数据类型,其默认值取决于其成员变量的类型和默认值。

总结一下,C语言中不同数据类型的默认值如下:- 整型类型的默认值为0。

- 浮点型类型的默认值为0.0。

- 字符型类型的默认值为'\0'。

- 指针类型的默认值为NULL。

深入理解C语言的new[]和delete[]

深⼊理解C语⾔的new[]和delete[]⽬录1、重载操作符2、new和delete的原理3、new[]和delete[]的原理总结c++的动态内存管理⽅式和c语⾔不⼀样,在c++中使⽤new和delete来替换c语⾔中的malloc和free。

这⾥有⼏个点不⼀样,1、new和delete是操作符,malloc和free是函数(我的理解是c++将new和delete约定为操作符⽽已,new和delete操作符重载函数本质上还是函数)2、c++有了类的概念,类对象的初始化除了要分配内存,还需要对内存进⾏初始化!所以,c++必须引⼊⼀种新的内存分配⽅式,既可以像malloc⼀样开辟内存,还要能够调⽤类对象的构造函数(delete的引⼊同理)。

3、new[]和delete[]是c++完全新增的内存操作符,他们和new和delete也是有不⼀样的地⽅。

下⾯,咱们来⼀⼀讲解⬇1、重载操作符既然new和delete都是操作符,咱们可以对new和delete进⾏重载;当你再使⽤new和delete操作内存时,编译器就会调⽤到咱们⾃⼰重载的new/delete全局函数了。

(如对操作符重载不了解的,请⾃⾏补充知识)void* operator new(size_t size){if(size == 0) size = 1;void* ptr = malloc(size);if(ptr == nullptr){std::cout << "ERROR NEW!" << std::endl;}std::cout << "NEW Memory Size = " << size << " address = " << ptr << std::endl;return ptr;}void* operator new[](size_t size){if(size == 0) size = 1;void* ptr = malloc(size);if(ptr == nullptr){std::cout << "ERROR NEW[]!" << std::endl;}std::cout << "NEW[] Memory Size = " << size << " address = " << ptr << std::endl;return ptr;}void operator delete(void* ptr){std::cout << "DELETE " << ptr << std::endl;if(ptr) free(ptr);}void operator delete[](void* ptr){std::cout << "DELETE[] " << ptr << std::endl;if(ptr) free(ptr);}此时,再使⽤ int* p = new int {1}; 开辟内存,那么,c++编译器会⾃动链接到我们刚才的操作符重载函数 void*operator new(size_t size) ,⾄于编译器是怎么将 int* p = new int {1}; 解析成 void* operator new(size_t size) 函数的,咱们不关⼼,咱们只要知道编译器做了这样⼀层代码解析转换即可。

C语言编程规范标准

编码规1. 头文件编码规12. 函数编写规13. 标识符命名与定义23.1通用命名规那么23.2 变量命名规那么33.3函数命名规那么33.4 宏的命名规那么34. 变量35. 宏、常量36. 质量保证47. 程序效率58. 注释59. 排版与格式510. 表达式611. 代码编辑、编译612. 平安性713. 可读性714. 可测性715. 单元测试716. 可移植性81.头文件编码规1. 禁止头文件循环依赖。

2. .c/.h文件不要包含用不到的头文件。

3. 禁止在头文件中定义变量。

4. 同一产品统一包含头文件排列方式。

〔如功能块排序、文件名升序、稳定度排序。

〕5. 只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c过extern的方式使用外部函数接口、变量。

2.函数编写规1. 一个函数仅完成一件功能。

2. 重复代码应该尽可能提炼成函数。

3.为简单功能编写函数4.函数的返回值要清楚、明了,让使用者不容易无视错误情况。

5. 防止函数过长,新增函数不超过100行〔非空非注释行〕。

6. 防止函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。

7. 可重入函数应防止使用全局变量和禁止使用static变量。

8. 设计高扇入,合理扇出〔小于7〕的函数。

9. 废弃代码〔没有被调用的函数和变量)要及时注释〔有助于更好理解程序〕。

10. 对所调用函数的错误返回码要仔细、全面地处理。

11. 函数不变参数使用const。

12. 函数应防止使用全局变量、静态局部变量和I/O操作,不可防止的地方应集中使用。

13. 函数的参数个数不超过5个。

14. 减少或禁止函数本身或函数间的递归调用3.标识符命名与定义3.1通用命名规那么1. 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家根本可以理解的缩写,防止使人产生误解。

2. 除了常见的通用缩写以外,不使用单词缩写,不得使用汉语拼音。

示例:argument 可缩写为 arg buffer 可缩写为 buff clock 可缩写为 clk command 可缩写为 cmd compare 可缩写为 cmp configuration 可缩写为cfgdevice 可缩写为 dev error 可缩写为 err hexadecimal 可缩写为hexincrement 可缩写为 inc initialize 可缩写为 init maximum 可缩写为maxmessage 可缩写为 msg minimum 可缩写为 min parameter 可缩写为 para previous 可缩写为 prev register 可缩写为 reg semaphore 可缩写为semstatistic 可缩写为 stat synchronize 可缩写为 sync temp 可缩写为 tmp3. 产品/项目组部应保持统一的命名风格。

c 函数默认值

c 函数默认值
摘要:
1.C 语言中的函数默认值
2.函数默认值的使用
3.函数默认值的优点和局限性
正文:
C 语言中的函数默认值是指在函数定义时,为函数的参数指定的默认值。

当调用这个函数时,如果没有为参数赋值,那么函数会使用默认值。

这种机制可以提高代码的可读性和简洁性,使得函数的调用更加方便。

函数默认值的使用非常简单。

在函数定义时,可以在参数后面跟上一个等号和默认值。

例如,定义一个计算平方的函数,可以写成`int square(int x = 0);`。

在这个函数中,参数`x`的默认值为0。

当调用这个函数时,可以只传递一个参数,也可以传递两个参数。

如果只传递一个参数,那么`x`的值就是0;如果传递两个参数,那么`x`的值就是传递的第二个参数。

函数默认值的优点在于可以简化函数的调用,减少参数的传递。

在编写代码时,我们经常需要调用一些函数,而这些函数的参数可能很多。

如果每个函数的参数都有默认值,那么我们可以在调用这些函数时,只传递必需的参数,而不必传递所有的参数。

这样做不仅可以减少代码的篇幅,还可以提高代码的可读性。

然而,函数默认值也有其局限性。

首先,函数默认值只能用于参数,不能用于局部变量或者全局变量。

其次,函数默认值只能用于函数定义时,不能在
函数调用时指定。

最后,函数默认值可能会导致代码的逻辑错误。

如果默认值与实际需求不符,那么函数的行为就可能出现错误。

总的来说,函数默认值是C 语言中一种非常有用的特性,可以提高代码的可读性和简洁性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public: MyClass()=default; MyClass(const MyClass& )=delete;
......
}
当然,一旦函数被 delete 过了,那么重载该函数也是非法的,该函数我们习惯上称为删除 函数。
二、default 和 delete 的其他用途 上面我们已经看到在类中我们可用 default 和 delete 修饰成员函数,使之成为缺省函数或者 删除函数,在类的外面,default 可以在类定义之外修饰成员函数,比如: class MyClass {
将构造函数 explicit 后,构造函数一样的还是不能发生 char 的构造,因为 char 构造版本被删 除了,但在 Func 的调用中,编译器会尝试将 c 转换为 int,即 Func(\\a')会调用一次 MyClass(int ) 构造,顺利通过编译。于是我们不提倡 explicit 和 delete 混用。对与普通函数 delete 也有类 型的效果。
关于 delete 的显式删除,并非局限于成员函数,比如: void Func(int i){}; void Func(char c)=delete; //显式删除 char 版本 int main() {
Func(3); Func('c’); //无法编译通过
return 0; } 这里因为 Func 的 char 版本已经被删除,故 Func('c')会编译失败。由此我们也知 default 是只 局限作用于类的部分成员函数的。于是我们还可用 delete 来避免不必要的隐式数据类型转 换。比如: class MyClass {
public: MyClass()=default; //同时提供默认版本和带参版本,类型是 POD 的 MyClass(int i):data(i){}
private: int data;
};
有些时候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将 拷贝构造函数声明为 private 的并不提供实现,这样当拷贝构造对象时编译不能通过,C++11 则使用 delete 关键字显式指示编译器不生成函数的默认版本。比如: class MyClass {
同时 C++规定,一旦程序员实现了这些函数的自定义版本,则编译器不会再自动生产默认版 本。注意只是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了 待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译 是不会再自动提供默认的无参版本了。我们可以通过使用关键字 default 来控制默认构造函 数的生成,显式地指示编译器生成该函数的默认版本。比如: class MyClass {
一般情况下,析构函数不能定义为删除的,因为如果析构函数被删除,就无法删除此类型 的对象了。对于一个删除了析构函数的类型,编译器将不允许定义该类型的变量或创建该类 型的临时对象,而且如果一个类有某个成员的类型删除了析构函数,也不能定义该类的变量 或临时对象,因为一个成员的析构函数是删除的,则该成员无法销毁,包含它的类也就没法 销毁。虽然对于删除了析构函数的类型,我们不能定义这种类型的变量或成员但可以动态分 配这种类型的对象,比如: Struct NoDtor{ NoDtor()=default; ~NoDtor()=default; }; NoDtor *P=new NoDtor();//正确,但是我能 delete P 但是有时析构函数也是可以 delete 的,这样做的目的是我们在指定内存位置进行内存分配 时并不需要析构函数来完成对象级别的清理,这时我们可显示删除析构函数来限制自定义类 型在栈上或者静态的构造。
但是如果这样:Biblioteka class MyClass {public: MyClass(int i){}; explicit MyClsss(char c)=delete; //删除 explicit 的 char 版本的构造函数
}; void Fun(MyClass m){} int main() {
Func(3); Func('a'); //编译可通过 MyClass m1(3); MyClass m2('a'); //编译不能通过 }
public: MyClass()=default; MyClass() &operator=(const MyClass& );
); //在类的定义外用 default 来指明缺省函数版本 inline MyClass& MyClass::operator=(const MyClass& )=default; 还可以 MyClass& MyClass::operator=(const MyClass& )=default;但是这种类外定义合成的成员 就不是内联函数。 与=default 不同,=delete 必须出现在函数的第一次声明中。因为一个默认的成员只影响为 这个成员生成的代码,因此=default 直到编译生成代码时才需要,而编译器必须早早知道一 个函数是否是删除的,以便禁止试图使用它的操作。
C++中的默认函数与 default 和 delete 用法
一、类中的默认函数 a.类中默认的成员函数 1.默认构造函数 2.默认析构函数 3.拷贝构造函数 4.拷贝赋值函数 5.移动构造函数 6.移动拷贝函数
b.类中自定义的操作符函数 1.operator 2.operator& 3.operator&& 4.operator* 5.operator-> 6.operator->* 7.operator new 8.operator delete
delete 的用法还包括删除 operator new 操作符,编码在堆上分配该类的对象 如:void* operator new(std::size_t)=delete;
合成的拷贝控制成员可能是删除的,如果一个类有数据成员不能默认构造、拷贝、复制或 销毁,则对应的成员函数将被定义为删除的。因此: 如果类的某个成员的析构函数是删除的或不可访问的,那么类的合成析构函数被定义为删除 的。 如果类的某个成员的拷贝构造函数是删除的或不可访问的,则类的合成拷贝构造函数也被定 义为删除的。 如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或是类有一个 const 的或引用 成员,则类的合成拷贝赋值运算符被定义为删除的。 如果类的某个成员的析构函数是删除的或不可访问的,或是类有一个引用成员,它没有类内 初始化器,或是类有一个 const 成员,它没有类内初始化器且其类型未显示定义默认构造函 数,则该类的默认构造函数被定义为删除的
public: MyClass(int i){}; MyClsss(char c)=delete; //删除 char 版本的构造函数
}; void Fun(MyClass m){} int main() {
Func(3); Func('a'); //编译不能通过 MyClass m1(3); MyClass m2('a'); //编译不能通过 } 这是因为 char 版本的构造函数被删除后,试图从 char 构造 MyClass 对象的方式是不允许的 了。但去掉这句的函数删除后,编译器会隐式的将 a 转换为整型使得编译通过,调用的是 整型构造函数,这可能并不是你所想要的。
相关文档
最新文档