类与对象的高级操作 主要内容 ●C++语言中对象的高级操作。包括:拷贝初始化构造函数、对象指针、对象引用和对 象数组 ●C十十语言中的类成员。包括:类数据成员指针和类成员函数指针 ●C++语言中的this指针 ●用cost关键字对类和对象进行进一步的操作,即C十+语言中的常类型。包括:对象 常量、常指针、常引用、常成员函数和常数据成员 ● C++语言中类之间的关系。包括:类聚集、包容类和内嵌类 ●C++语言中的堆对象 ●C十十语言实现常用数据结构的类定义及其实现 C十十语言中文件的组织形式。包括:C++中类定义文件(“h”)和类的实现文件 (“,cpp”)及其组织方式。 选择题 1假定MyClass为一个类,则执行MyClass a[3],*p[2]语句时,自动调用该类构造函数_次 A2 B3 C4 D5 答案:A 注释:指针数组不调用类的构造函数。因为指针数组本身不定义类对象,而是定义了数组元 素可以指向一个MyClass的对象。 2对于常数据成员,下面描述正确的是 A常数据成员可以不初始化,并且不能更新 B常数据成员必须被初始化,并且不能更新 C常数据成员可以不初始化,并且可以被更新 D常数据成员必须被初始化,并且可以被更新 答案:B 3对于常成员函数,下面描述正确的是 A类的成员函数可以操作常对象 B类的成员函数不能操作常对象 C只有常成员函数可以操作常对象 D在常成员函数中,常对象可以被更新 答案:C 注释:cost是函数类型的一个组成部分,因此常成员函数不能更新对象的数据成员,不能 调用该类中没有用cost修饰的成员函数,也只有常成员函数才可以操作常对象。 4类MyClass的定义如下: class MyClass public: Myclass(){value=0); SetVariable (int i )value=1; private: int value: : 则对下列语句序列正确的描述是一。 1
类与对象的高级操作 主要内容 z C++语言中对象的高级操作。包括:拷贝初始化构造函数、对象指针、对象引用和对 象数组 z C++语言中的类成员。包括:类数据成员指针和类成员函数指针 z C++语言中的 this 指针 z 用 const 关键字对类和对象进行进一步的操作,即 C++语言中的常类型。包括:对象 常量、常指针、常引用、常成员函数和常数据成员 z C++语言中类之间的关系。包括:类聚集、包容类和内嵌类 z C++语言中的堆对象 z C++语言实现常用数据结构的类定义及其实现 z C++语言中文件的组织形式。包括:C++中类定义文件(“,h”)和类的实现文件 (“,cpp”)及其组织方式。 选择题 1 假定 MyClass 为一个类,则执行 MyClass a[3],*p[2]语句时,自动调用该类构造函数 次 A 2 B 3 C 4 D 5 答案:A 注释:指针数组不调用类的构造函数。因为指针数组本身不定义类对象,而是定义了数组元 素可以指向一个 MyClass 的对象。 2 对于常数据成员,下面描述正确的是 。 A 常数据成员可以不初始化,并且不能更新 B 常数据成员必须被初始化,并且不能更新 C 常数据成员可以不初始化,并且可以被更新 D 常数据成员必须被初始化,并且可以被更新 答案: B 3 对于常成员函数,下面描述正确的是 。 A 类的成员函数可以操作常对象 B 类的成员函数不能操作常对象 C 只有常成员函数可以操作常对象 D 在常成员函数中,常对象可以被更新 答案:C 注释:const 是函数类型的一个组成部分,因此常成员函数不能更新对象的数据成员,不能 调用该类中没有用 const 修饰的成员函数,也只有常成员函数才可以操作常对象。 4 类 MyClass 的定义如下: class MyClass { public: Myclass(){value=0}; SetVariable (int i ){value=I;} private: int value; }; 则对下列语句序列正确的描述是 。 1
MyClass *p,my;p=&my; A语句p=&my;是把对象my赋值给指针变量p B语句MyClass*p,my,会调用两次类MyClass的构造函数 C对语句*p.Set Variablse(5)的调用是正确的 D语句p->Set Variable(5)与语句my.Set Variable(5)等价 答案:D 注释:A中语句p=&my;是把对象my的地址赋值给指针变量p。B中语句只调用一次类 MyClass的构造函数,指针定义不调用类的构造函数。C中语句的正确调用方式是 (*p).SetVariablse(5) 5有如下定义语句:inta0={1,2,3,4,5},则对语句int*p=a,正确的描述是 A语句int*p=a;定义不正确 B语句int*p=a,初始化变量p,使其指向数组对象a的第一个元素 C语句int*p-a;是把aO]的值赋给变量p D语句int*p=a;是把aI]的值赋给变量p 答案:C 填空 1定义在类中的类被称为内嵌类,定义了类的类被称为包容类。 2在C十十语言中,每个类都有一个隐含的指针叫做hs指针。该指针指向正在调用成员函 数的对象。 3如果一个类是聚集类,即该类定义了其他类的子对象,则该类的对象和子对象先被初始化 的是类的子对象。 4如果一个数组的每个元素都是同一个类的对象,则该数组被称为对象数组。定义语句 MyClass p[I0:则系统自动调用该类构造函数10次,当类对象数组p离开它的作用域时,系 统自动调用该类析构函数1Q次。定义语句MyClass*p[10小;则当类对象数组指针p离开它的作 用域时,系统自动调用该类析构函数Q次。 5下面的类定义了拷贝初始化构造函数,请完成该类的定义和实现。 class MyClass { public: MyClass(int xx=0,int yy=0){X=xx;Y=yy;) MyClass(MyClass&p) 拷贝初始化构造函数 Private: int XY: } MyClass:MyClass(MyClass&p) 拷贝初始化构造函数的实现 { X=p.X Y=p.Y } 写出下列程序的运行结果 1 include class MyClass 2
MyClass *p,my; p=&my; A 语句 p=&my;是把对象 my 赋值给指针变量 p B 语句 MyClass *p,my; 会调用两次类 MyClass 的构造函数 C 对语句*p.SetVariablse(5)的调用是正确的 D 语句 p->SetVariable(5) 与语句 my.SetVariable(5)等价 答案:D 注释:A 中语句 p=&my;是把对象 my 的地址赋值给指针变量 p。B 中语句只调用一次类 MyClass 的构造函数,指针定义不调用类的构造函数。C 中语句的正确调用方式是 (*p).SetVariablse(5) 5 有如下定义语句:int a[]={1,2,3,4,5};,则对语句 int *p=a;正确的描述是 。 A 语句 int *p=a;定义不正确 B 语句 int *p=a;初始化变量 p,使其指向数组对象 a 的第一个元素 C 语句 int *p=a; 是把 a[0]的值赋给变量 p D 语句 int *p=a; 是把 a[1]的值赋给变量 p 答案: C 填空 1 定义在类中的类被称为 内嵌类 ,定义了类的类被称为 包容类。 2 在C++语言中,每个类都有一个隐含的指针叫做this指针。该指针指向正在调用成员函 数的对象。 3 如果一个类是聚集类,即该类定义了其他类的子对象,则该类的对象和子对象先被初始化 的是类的子对象。 4 如果一个数组的每个元素都是同一个类的对象,则该数组被称为对象数组。定义语句 MyClass p[10]; 则系统自动调用该类构造函数10次,当类对象数组p离开它的作用域时,系 统自动调用该类析构函数10次。定义语句MyClass *p[10]; 则当类对象数组指针p离开它的作 用域时,系统自动调用该类析构函数0次。 5 下面的类定义了拷贝初始化构造函数,请完成该类的定义和实现。 class MyClass { public: MyClass(int xx=0,int yy=0){X=xx;Y=yy;} MyClass(MyClass&p) //拷贝初始化构造函数 Private: int X,Y; }; MyClass:: MyClass(MyClass&p) //拷贝初始化构造函数的实现 { X= p.X ; Y=p.Y ; } 写出下列程序的运行结果 1 # include class MyClass { 2
public: void SetValue(int val): MyClass(); ~MyClass(); private: int i; }: MyClass::MyClass() i=0: coutSetValue(k+1); p++; } } 答案: This is a constructor!i=0 This is a constructor!i=0 This is a constructor!i=0 i=1 i=2 =3 This is desstructor!i=3 This is desstructor!i=2 This is desstructor!i=1 注释:此题主要理解一下几点。 类对象数组的定义:对象数组构造函数的自动调用过程:对象数组析构函数的自动调用过程: 3
public: void SetValue(int val); MyClass(); ~MyClass(); private: int i; }; MyClass::MyClass() { i=0; coutSetValue(k+1); p++; } } 答案: This is a constructor!i=0 This is a constructor!i=0 This is a constructor!i=0 i=1 i=2 i=3 This is desstructor!i=3 This is desstructor!i=2 This is desstructor!i=1 注释:此题主要理解一下几点。 类对象数组的定义;对象数组构造函数的自动调用过程;对象数组析构函数的自动调用过程; 3
通过对象指针操作对象数组的方法。 include class MyClass { int ab; public: MyClass(int x=0,int y=0); ~MyClass(); MyClass::MyClass(int x,int y):a(x),b(y) { cout class MyClass { public: void SetValue(int val); MyClass(); ~MyClass(); private: int i; MyClass::MyClass() 4
通过对象指针操作对象数组的方法。 2 # include class MyClass { int a ,b; public: MyClass( int x=0,int y=0); ~MyClass(); }; MyClass::MyClass(int x,int y):a(x),b(y) { cout class MyClass { public: void SetValue(int val); MyClass(); ~MyClass(); private: int i; }; MyClass::MyClass() { 4
=0: cout class Array { public: int&GetData(int anint index): void Print)(int al,int size): int&Array::GetData(int a[],int index) int&data=afindex]; 5
i=0; cout class Array { public: int& GetData(int a[],int index); void Print()(int a[],int size); }; int& Array::GetData(int a[],int index) { int& data=a[index]; 5
return data: } void Array:Print(int a,int size) { int i; for(i=0:i<size;i++) cout<<GetData(a,i)<<endl; 2定义类Poit。要求定义类对象时,可以有这样的定义语句:Point pl(1,2),p2(pl) 参考答案: class Point { public: Point(int a,int b){X=a;Y=b;) Point(Point&p); Private: int X,Y; } Point:Point(Point&p) { X=p.X; Y-p.Y; } 注释:构造函数Point(inta,intb)定义了带参数的类对象的初始化方法,构造函数Point(Point& p),即拷贝构造函数,定义了可以用一个对象去初始化另一个对象的方法。 6
return data; } void Array::Print(int a[],int size) { int i; for(i=0;i<size;i++) cout<<GetData(a,i)<<endl; } 2 定义类 Point。要求定义类对象时,可以有这样的定义语句:Point p1(1,2),p2(p1). 参考答案: class Point { public: Point(int a,int b){X=a;Y=b;} Point(Point& p); Private: int X,Y; }; Point::Point(Point& p) { X=p.X; Y=p.Y; } 注释;构造函数 Point(int a,int b)定义了带参数的类对象的初始化方法,构造函数 Point(Point& p),即拷贝构造函数,定义了可以用一个对象去初始化另一个对象的方法。 6