C++拷贝构造函数

合集下载

计算机二级C++考试备考练习题及答案

计算机二级C++考试备考练习题及答案

计算机二级C++考试备考练习题及答案选择题1、下列叙述中错误的是( )。

A.gets函数用于从终端读入字符串B.getchar函数用于从磁盘文件读入字符C.fputs函数用于把字符串输出到文件D.fwrite函数用于以二进制形式输出数据到文件正确答案:B答案解析:本题考查的是C语言中输入、输出函数的使用,gets和getchar 函数用于从标准输入设备键盘读入字符串和字符;fputs用于把字符串输出到文件;fwrite用于以二进制形式输出数据到文件。

2、拷贝构造函数的参数一般是( )A.某对象名B.某对象成员名C.某对象的引用名D.指向对象的指针名正确答案:C3、C++语言是以哪种语言为基础逐渐发展演变而成的一种程序设计语言( )A.ASPB.CC.VBD.Java正确答案:B4、软件设计中划分模块的一个准则是( ).A.低内聚低耦合B.高内聚低耦合C.低内聚高耦合D.高内聚高耦合正确答案:B答案解析:一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。

5、下述关于数据库系统的叙述中,正确的是( )。

A.数据库系统减少了数据冗余B.数据库系统避免了一切冗余C.数据库系统中数据的一致性是指数据类型一致D.数据库系统比文件系统能管理更多的数据正确答案:A答案解析:数据库系统会减少数据冗余,但不可能避免一切冗余。

6、关于纯虚函数,下列表述中正确的是( )。

A.纯虚函数是没有给出实现版本(即无函数体定义)的虚函数B.纯虚函数的声明总是以″=0″结束C.派生类必须实现基类的纯虚函数D.含有纯虚函数的类不可能是派生类正确答案:B答案解析:纯虚函数是在声明虚函数时被″初始化″为O的虚函数。

纯虚函数没有函数体,纯虚函数的作用是在基类中为其派生类保留一个函数名称。

7、下列描述中错误的是( )A.派生类可以作为基类派生其他的子类B.派生类继承基类的所有数据成员C.派生类可以有多个基类D.派生类不能继承一些函数成员正确答案:B8、已知int m= 10;在下列定义引用的语句中,正确的是( )。

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现C++中⼀般创建对象,拷贝或赋值的⽅式有构造函数,拷贝构造函数,赋值函数这三种⽅法。

下⾯就详细⽐较下三者之间的区别以及它们的具体实现1.构造函数构造函数是⼀种特殊的类成员函数,是当创建⼀个类的对象时,它被调⽤来对类的数据成员进⾏初始化和分配内存。

(构造函数的命名必须和类名完全相同)⾸先说⼀下⼀个C++的空类,编译器会加⼊哪些默认的成员函数默认构造函数和拷贝构造函数析构函数赋值函数(赋值运算符)取值函数**即使程序没定义任何成员,编译器也会插⼊以上的函数!注意:构造函数可以被重载,可以多个,可以带参数;析构函数只有⼀个,不能被重载,不带参数⽽默认构造函数没有参数,它什么也不做。

当没有重载⽆参构造函数时,A a就是通过默认构造函数来创建⼀个对象下⾯代码为构造函数重载的实现<span style="font-size:14px;">class A{int m_i;Public:A(){Cout<<”⽆参构造函数”<<endl;}A(int i):m_i(i) {} //初始化列表}</span>2.拷贝构造函数拷贝构造函数是C++独有的,它是⼀种特殊的构造函数,⽤基于同⼀类的⼀个对象构造和初始化另⼀个对象。

当没有重载拷贝构造函数时,通过默认拷贝构造函数来创建⼀个对象A a;A b(a);A b=a; 都是拷贝构造函数来创建对象b强调:这⾥b对象是不存在的,是⽤a 对象来构造和初始化b的!!先说下什么时候拷贝构造函数会被调⽤:在C++中,3种对象需要复制,此时拷贝构造函数会被调⽤1. 1)⼀个对象以值传递的⽅式传⼊函数体2. 2)⼀个对象以值传递的⽅式从函数返回3. 3)⼀个对象需要通过另⼀个对象进⾏初始化什么时候编译器会⽣成默认的拷贝构造函数:1. 1)如果⽤户没有⾃定义拷贝构造函数,并且在代码中使⽤到了拷贝构造函数,编译器就会⽣成默认的拷贝构造函数。

C++自测题之三

C++自测题之三

一选择题1、面向对象程序设计中的数据隐藏指的是( D )。

A. 输入数据必须输入口令B. 数据经过加密处理C. 对象部数据结构上建有防火墙D. 对象部数据结构的不可访问性2、以下关于类的访问权限的描述中,错误的选项是( D ).。

A. 说明为公有的成员可以被程序中的任何代码访问B. 说明为私有的成员只能被类的成员和说明为友元类的成员函数访问C.说明为保护的成员,除了能被本身的成员函数和说明为友元类的成员函数访问外,该类的派生类的成员也可以访问D. 类的所有成员都可以被程序中的任何代码访问3、 C 中对于类中定义的成员,其默认的访问权限为( C )。

A. PublicB. ProtectedC. PrivatD. Static4、C++ 对C语言作了很多改良,即从面向过程变成为面向对象的主要改良是( D )A. 增加了一些新的运算符B. 允许函数重载,并允许设置缺省参数C. 规定函数说明符必须用原型D. 引进了类和对象的概念5、类A中的一个成员函数的说明如下:void Set(A &a);那么该函数的参数“A &a〞的含义是( C )。

A. 指向A的指针为aB. 将变量a的地址赋给类AC. 类A对象引用a用作函数的形参D. 变量A与a按位与后作函数参数6、以下特性中,C与C++共有的是( D )。

A. 继承B. 封装C. 多态性D. 函数定义不能嵌套7、关于封装,以下说法中不正确的选项是〔 D 〕。

A. 通过封装,对象的全部属性和操作结合在一起,形成一个整体B. 通过封装,一个对象的实现细节被尽可能地隐藏起来〔不可见〕C. 通过封装,每个对象都成为相对独立的实体D. 通过封装,对象的属性都是不可见的8、在一个类的定义中,包含有〔 C 〕成员的定义。

A. 数据B. 函数C.数据和函数D. 数据或函数9、在类作用域中能够通过直接使用该类的〔 D 〕成员名进展访问。

A. 私有B. 公用C. 保护D. 任何10、在关键字public后面定义的成员为类的〔 B 〕成员。

聊城大学计算机学院面向对象的程序设计(c++)练习题(第三周)(构造函数和析构函数)

聊城大学计算机学院面向对象的程序设计(c++)练习题(第三周)(构造函数和析构函数)

聊城大学计算机学院面向对象的程序设计第三次作业一、单选题(本大题共17小题,每题3分,共51分):1、在下列函数原型中,可以作为类AA构造函数的是()。

A void AA(int);B int AA( );C AA(int) const;D AA(int);2、下列选项中,哪一项功能是对对象进行初始化()。

A 析构函数B 数据成员C 构造函数D 静态成员函数3、假定A为类名,执行A x;语句时将自动调用该类的()。

A 有参构造函数B 无参构造函数C 拷贝构造函数D 赋值构造函数4、下列关于构造函数的说法,错误的是()。

A 系统可以提供默认的构造函数B 构造函数可以有参数,所以可以有返回值C 构造函数可以重载D 构造函数可以设置默认参数5、有如下类定义:class Point{int x, y;public:Point__________:x_(0), y_(0){}Point(int x, int y = 0):x_(x), y_(y){}};若执行语句:Point a(2), b[3], *c[4];则Point类的构造函数被调用的次数是()。

A 2次B 3次C 4次D 5次6、在下面的类定义中class sample{public:sample(int val); //①~sample( ); //②private:int a=2.5; //③public:sample( ); //④};其中错误的语句是()。

A ①B ②C ③D ④7、假定一个类的构造函数为A(int i = 4, int j = 0) { a = i; b = j;}则执行A x(1)语句后,x.a和x.b的值分别为()。

A 1和0B 1和4C 4和0D 4和18、下列关于构造函数的描述中,错误的是()。

A 构造函数可以设置默认参数B 构造函数在定义类对象时自动执行C 构造函数可以是内联函数D 构造函数不可重载9、下列选项中,哪一项不是构造函数的特征()。

C++拷贝(复制)构造函数详解

C++拷贝(复制)构造函数详解

C++拷贝(复制)构造函数详解⼀. 什么是拷贝构造函数⾸先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp]1. int a = 100;2. int b = a;⽽类对象与普通对象不同,类对象内部结构⼀般较为复杂,存在各种成员变量。

下⾯看⼀个类对象拷贝的简单例⼦。

[c-sharp]1. #include <iostream>2. using namespace std;3.4. class CExample {5. private:6. int a;7. public:8. //构造函数9. CExample(int b)10. { a = b;}11.12. //⼀般函数13. void Show ()14. {15. cout<<a<<endl;16. }17. };18.19. int main()20. {21. CExample A(100);22. CExample B = A; //注意这⾥的对象初始化要调⽤拷贝构造函数,⽽⾮赋值23. B.Show ();24. return 0;25. }运⾏程序,屏幕输出100。

从以上代码的运⾏结果可以看出,系统为对象 B 分配了内存并完成了与对象 A 的复制过程。

就类对象⽽⾔,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。

下⾯举例说明拷贝构造函数的⼯作过程。

[c-sharp]1. #include <iostream>2. using namespace std;3.4. class CExample {5. private:6. int a;7. public:8. //构造函数9. CExample(int b)10. { a = b;}11.12. //拷贝构造函数13. CExample(const CExample& C)14. {15. a = C.a;16. }17.18. //⼀般函数19. void Show ()20. {21. cout<<a<<endl;22. }23. };24.25. int main()26. {27. CExample A(100);28. CExample B = A; // CExample B(A); 也是⼀样的29. B.Show ();30. return 0;31. }CExample(const CExample& C) 就是我们⾃定义的拷贝构造函数。

c++课后习题解答6-10

c++课后习题解答6-10
int elems[100],PC;
};
int S::IsMemberOf(int n)
{
for(int i=0;i<PC;i++)
if(elems[i]==n)
return 1;
return 0;
}
int S::Add(int n)
{
if(IsMemberOf(n))
return 1;
else if(PC==100)
√24.友元类中的所有成员函数都是友元函数。
√25.类型转换函数是一种特殊的成员函数,定义时不加类型说明,无函数参数。
√26.单参数的构造函数具有类型转换的作用。
6.2单选题
1.下列关于类的定义格式的描述中,错误的是(C)。
A.类中成员有3种访问权限
B.类的定义可分说明部分和实现部分
C.类中成员函数都是公有的,数据成员都是私有的
答:编程如下:
#include <iostream.h>
class ASMD
{
public:
ASMD(double a,double b)
{ x=a; y=b; }
void Addition()
{ cout<<x+y<<endl; }
void Subtration()
{ cout<<x-y<<endl; }
a.Print();
b.Print();
}
答:Default constructor called.
Constructor called.
a1=0,a2=0
a1=5,a2=8
Destructor called.

C++试题(一)附答案

C++试题(一)附答案

C++试题(一)附答案一、单项选择题(共20题,每题1分,共20分)1、下列关于C++标识符的命名不合法的是A. PadB. name_1C. A#bcD. _a122、若有以下类型标识符定义:()int x=2; char w='a'; float y=23.45f; double z=45.6712;则表达式w*x+y-z的结果类型是A. floatB. charC. intD. double3、若有int x=10,y=20,z=30; 则执行下面语句后,x的值是if(x>y)z=x;x=y;y=z;A. 10B. 20C. 30D. 04、循环语句whlie(int i=0 )i--;的循环次数是A. 0B. 1C. 5D. 无限5、一个函数无返回值时,应选择的说明符是A. staticB. externC. voidD. 无说明符6、对重载函数形参的描述中,错误的是A. 参数的个数可能不同B. 参数的类型可能不同C. 参数的顺序可能不同D. 参数的个数、类型、顺序都相同,只是函数的返回值类型不同7、以下能正确定义数组并正确赋初值的语句是A. int N=5,b[N][N];B. int a[2]={{1},{3},{4},{5}};C. int c[2][]={{1,2},{3,4}};D. int d[3][2]={{1,2},{3,4}};8、下列给字符数组进行的初始化中,不正确的是A. char s1[]="abcd";B. char s2[3]={'x','y','\0'};C. char s3[]={'a','x','y','\0'};D. char s4[6]={"xyz","mnp"};9、通常的拷贝构造函数的参数是A.某个对象名 B.某个对象成员名C.某个对象的引用 D.某个对象的指针名10、关于构造函数特点的描述中,错误的是A. 定义构造函数必须指出类型B. 构造函数的名字与该类的类名相同C. 一个类中可定义0至多个构造函数D. 构造函数是一种成员函数11、下面程序的运行结果为#includeint add(int a,int b);void main(){extern int x,y;cout<<add(x,y)<<endl;< p="">}int x=20,y=5;int add(int a,int b){int s=a+b;return s;}A.20 B.5 C.25 D.编译会提示出错信息12、关于常成员的描述中,错误的是A. 常成员包含常数据成员和常成员函数两种B. 常数据成员必须是公有的C. 常数据成员要使用构造函数成员初始化列表进行初始化D. 常对象只能调用它的常成员函数,不能调用其它的成员函数13、关于友元函数的描述中,错误的是A. 友元函数不是成员函数B. 友元函数只能访问类中私有成员C. 友元函数破坏隐藏性,尽量少用D. 友元函数说明在类体内,使用关键字friend14、如果有int x,*p; float y,*q;则下面操作正确的是A.p=x B.p=qC.p=&x D.p=&y15、若有函数说明void fA(int m, int n); 和指针变量的定义 void (*p)(int,int);并且有p= fA 则下列操作不正确的是A.(*p)(3,4); B.p(3,4);C.fA(3,4); D.*p++;16、若数组名作实参而指针变量作形参,函数调用时实参传给形A. 数组的长度B. 数组第一个元素的值C. 数组所有元素的值D. 数组第一个元素的地址17、对于动态分配内存空间描述正确的是A.使用new运算符分配的内存空间的长度必需是常量B.delete运算符可以释放动态的存储空间和静态的存储空间C.由new分配的内存空间是不连续的D.delete运算符只能释放由new分配的动态存储空间18、能够释放对象所占资源的是()A.析构函数 B.数据成员C.构造函数 D.静态成员函数19、虚函数的定义是在基类中进行的,定义时需要冠以关键字A.static B.frendC.virtual D.public20、在C++中串流类是在头文件strstrea.h中定义的,下列不属于串流类的是)A.strstream B.ostrstreamC.ofstream D.istrstream二、填空题(共9题16空,每空1分,共16分)1、函数重载时,编译系统会根据____ 或____ 来区分。

C选择题填空题

C选择题填空题

C选择题填空题一、填空题1、在类中必须声明成员函数的( ),成员函数的( )部分可以写在类外。

[答案]原型实现2、如果需要在被调函数运行期间,改变主调函数中实参变量的值,则函数的形参应该是( )类型或()类型。

[答案]引用指针3、()类只能作为基类使用,而不能声明它的对象。

[答案]抽象4、拷贝构造函数的形参必须是()[答案]本类对象的引用5、进行函数重载时,被重载的同名函数如果都没有用const修饰,则它们的形参()或()必须不同。

[答案]个数类型6、通过一个()对象只能调用它的常成员函数,不能调用其他成员函数。

[答案]常二、选择题1、编译时多态性使用什么获得?(A)A. 重载函数B. 继承C. 虚函数D. B和C2、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为(C)。

A.MyClass(MyClass x)B.MyClass&(MyClass x)C.MyClass(MyClass &x)D.MyClass(MyClass *x)3、列带缺省值参数的函数说明中,正确的说明是(C)1. A. int Fun(int x=1, int y, int z=3);B. int Fun(int x, int y=2, int z);C. int Fun(int x, int y, int z=3);D. int Fun(int x=1, int y, int z);4、下列有关函数重载的叙述中,错误的是(A)A.函数重载就是用相同的函数名定义多个函数B.重载函数的参数列表必须不同C.函数的返回值类型不能用于对重载函数的区分D.const关键字可以用于对重载函数的区分5、在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用(A)。

A. 内联函数B. 重载函数C. 递归调用D. 嵌套调用6、下列有关C++类的说法中,不正确的是(C)。

A. 类是一种用户自定义的数据类型B. 只有类中的成员函数或类的友元函数才能存取类中的私有成员C. 在类中,如果不做特别说明,所有成员的访问权限均为私有的D. 在类中,如果不做特别说明,所有成员的访问权限均为公用的7、Sample是一个类,执行下面语句后,执行Sample类的构造函数的次数是(D) Sample a[3], *p=new Sample;A.1B.2C.3D.48、关于常数据成员的说法,不正确的是(D)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题:1.以下函数哪个是拷贝构造函数,为什么?1.X::X(const X&);2.X::X(X);3.X::X(X&, int a=1);4.X::X(X&, int a=1, b=2);2.一个类中可以存在多于一个的拷贝构造函数吗?3.写出以下程序段的输出结果, 并说明为什么?如果你都能回答无误的话,那么你已经对拷贝构造函数有了相当的了解。

1.#include <iostream></iostream>2.#include <string></string>3.4.struct X {5. template<typename T>6. X( T& ) { std::cout << "This is ctor." << std::endl; }7.8. template<typename T>9. X& operator=( T& ) { std::cout << "This is ctor." << std::endl; }10.};11.12.void main() {13. X a(5);14. X b(10.5);15. X c = a;16. c = b;17.}解答如下:1. 对于一个类X,如果一个构造函数的第一个参数是下列之一:a) X&b) const X&c) volatile X&d) const volatile X&且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.1.X::X(const X&); //是拷贝构造函数2.X::X(X&, int=1); //是拷贝构造函数2.类中可以存在超过一个拷贝构造函数,1.class X {2.public:3. X(const X&);4. X(X&); // OK5.};注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化.1.class X {2.public:3. X();4. X(X&);5.};6.7.const X cx;8.X x = cx; // error如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.这个默认的参数可能为X::X(const X&)或X::X(X&),由编译器根据上下文决定选择哪一个.默认拷贝构造函数的行为如下:默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作.a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.b)如果数据成员是一个数组,对数组的每一个执行按位拷贝.c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.3. 拷贝构造函数不能由成员函数模版生成.1.struct X {2. template<typename T>3. X( const T& ); // NOT copy ctor, T can't be X4.5. template<typename T>6. operator=( const T& ); // NOT copy ass't, T can't be X7.};8.原因很简单, 成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没有声明它,那么编译器会为你自动生成一个. 所以成员函数模版并不会阻止编译器生成拷贝构造函数, 赋值运算符重载也遵循同样的规则.(参见Effective C++ 3edition, Item45)默认拷贝构造函数的行为如下:默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作.a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.b)如果数据成员是一个数组,对数组的每一个执行按位拷贝.c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.1.深拷与浅拷深拷贝和浅拷贝的定义可以简单理解成:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候(复制指针所指向的值),这个过程就可以叫做深拷贝,反之对象存在资源但复制过程并未复制资源(只复制了指针所指的地址)的情况视为浅拷贝。

浅拷贝资源后在释放资源的时候会产生资源归属不清的情况导致程序运行出错,这点尤其需要注意!原则上,应该为所有包含动态分配成员的类都提供拷贝构造函数。

浅:using namespace std;//shallow && deep copy//deep copy make pointer point to a new place! class Product...{public:int* pointer;Product(int i=0)...{pointer=new int(i);}//change class variablevoid change(int i)...{*pointer=i;}//deconstructor~Product()...{delete pointer;}};int main()...{Product p1(2);Product p2(p1);p1.change(3);cout<<*p2.pointer<<endl;getchar();return 0;}深:using namespace std;//shallow && deep copy//deep copy make pointer point to a new place! class Product...{public:int* pointer;Product(int i=0)...{pointer=new int(i);}//change class variablevoid change(int i)...{*pointer=i;}// copying constructorProduct(const Product &p)...{pointer=new int(*p.pointer); }//deconstructor~Product()...{delete pointer;}};int main()...{Product p1(2);Product p2(p1);p1.change(3);cout<<*p2.pointer<<endl;getchar();return 0;}2 拷贝构造函数的另一种调用当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调用拷贝构造函数。

例如:#include <iostream>using namespace std;class Date...{int n;public:Date(int i = 0)...{cout << "载入构造函数" << endl;n = i;}Date(const Date &d)...{cout << "载入拷贝构造函数" << endl;n = d.n;}int GetMember()...{return n;}};void Display(Date obj) //针对obj的操作实际上是针对复制后的临时拷贝进行的...{cout << obj.GetMember() << endl;}int main()...{Date a;Date b(99);Display(a); //对象直接作为参数Display(b); //对象直接作为参数getchar();return 0;}程序输出:载入构造函数:载入构造函数:载入拷贝构造函数0载入拷贝构造函数99还有一种情况,也是与临时对象有关的。

当函数中的局部对象被用作返回值,返回给函数调用时,也将建立此局部对象的一个临时拷贝,此时拷贝构造函数也将被调用。

——可是经测试发现情况有异。

代码如下:#include <iostream>using namespace std;class Date...{int n;public:Date(int i = 0)...{cout << "载入构造函数" << endl;n = i;Date(const Date &d)...{cout << "载入拷贝构造函数" << endl;n = d.n;}void Show()...{cout << "n = " << n << endl;}};Date GetClass(void) //函数中的局部对象被用作返回值,按理说应该引用拷贝构造函数...{Date temp(100);return temp;}int main()...{Date a;a.Show();a = GetClass();//这里GetClass()函数中的局部对象被用作返回值a.Show();Date b = GetClass();//这里GetClass()函数中的局部对象被用作返回值b.Show();getchar();return 0;}程序输出:载入构造函数:n = 0载入构造函数:n = 100载入构造函数:n = 100按理第2个和第3个应该输出'载入拷贝构造函数"才对,这个结果与预想的不一样,到底是哪里出问题了呢?注:后来有论坛上的朋友告诉我说这是因为编译器的不同而导致不同的输出。

有人得到这样的输出结果:载入构造函数n = 0载入构造函数载入拷贝构造函数n = 100载入构造函数载入拷贝构造函数n = 100还有人得到这样的输出结果:载入构造函数n = 0载入构造函数载入拷贝构造函数n = 100载入构造函数载入拷贝构造函数载入拷贝构造函数n = 100(用的是vc++)3.3 无名对象现在我们来说一下无名对象。

相关文档
最新文档