类与对象的高级操作 主要内容 ●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 <iostream.h> 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 <iostream.h> class MyClass { 2
public: void SetValue(int val): MyClass(); ~MyClass(); private: int i; }: MyClass::MyClass() i=0: cout<<"This is a constructor!i="<<i<<endl: } void MyClass:Set Value(int val) i=val: cout<<"i="<<endl; } MyClass::~MyClass() cout<<"This is a destructor!i="<<endl: void main() int k; MyClass my[3],*p; p=my; for(k=0:k<3,k++) p->SetValue(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; cout<<”This is a constructor!i=”<<i<<endl; } void MyClass::SetValue(int val) { i=val; cout<<”i=”<<endl; } MyClass::~MyClass() { cout<<”This is a destructor!i=”<<endl; } void main() { int k; MyClass my[3],*p; p=my; for(k=0;k<3;k++) { p->SetValue(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 <iostream.h> class MyClass { int ab; public: MyClass(int x=0,int y=0); ~MyClass(); MyClass::MyClass(int x,int y):a(x),b(y) { cout<<This is a constructor!a+b"<<a+b<<endl: } MyClass::~MyClass() { cout<<"This is a destructor!"<<endl: } void main() MyClassx,y(10,20),z(y); } 答案: This is a constructor!a+b=0 This is a constructor!a+b=30 This is a desstructor! This is a desstructor! This is a desstructor! 注释:此题主要理解以下几点:类变量成员的初始化定义方式:构造函数的调用过程;拷贝 初始化构造函数的自动调用,语句zy)将调用拷贝初始化构造函数;析构函数的自动调用。 3 include <iostream.h> class MyClass { public: void SetValue(int val); MyClass(); ~MyClass(); private: int i; MyClass::MyClass() 4
通过对象指针操作对象数组的方法。 2 # include <iostream.h> 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<<”This is a constructor!a+b”<<a+b<<endl; } MyClass::~MyClass() { cout<<”This is a destructor!”<<endl; } void main() { MyClassx,y(10,20),z(y); } 答案: This is a constructor! a+b=0 This is a constructor! a+b=30 This is a desstructor! This is a desstructor! This is a desstructor! 注释:此题主要理解以下几点:类变量成员的初始化定义方式;构造函数的调用过程;拷贝 初始化构造函数的自动调用,语句 z(y)将调用拷贝初始化构造函数;析构函数的自动调用。 3 # include <iostream.h> class MyClass { public: void SetValue(int val); MyClass(); ~MyClass(); private: int i; }; MyClass::MyClass() { 4
=0: cout<<This is a constructor!i=<<i<<endl: void MyClass:SetValue(int val) i=val; cout<"i=”<end; MyClass::~MyClass() { cout<<This is a destructor!i=<<endl: } void main() MyClass *my1[3]; int k; for(k=0:k<3,k++) my1[k]=new MyClass; for(k=0:k<3:k++) delete my1[k]; } 答案: This is a constructor!i=0 This is a constructor!i=0 This is a constructor!i=0 This is desstructor!i=0 This is desstructor!i=0 This is desstructor!i=0 注释:此题主要理解以下几点:类对象指针数组的定义:指针对象的自动生成:指针对象构 造函数的自动调用过程;指针数组的动态释放:指针对象析构函数的自动调用过程。 程序设计 1定义和实现类Array。该类的成员函数GetData返回对一个数组元素的引用,成员函数Print 调用成员函数GetData实现对该数组的打印 答案: #include <iostream.h> 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<<”This is a constructor!i=”<<i<<endl; } void MyClass::SetValue(int val) { i=val; cout<<”i=”<<endl; } MyClass::~MyClass() { cout<<”This is a destructor!i=”<<endl; } void main() { MyClass *my1[3]; int k; for(k=0;k<3;k++) my1[k]=new MyClass; for(k=0;k<3;k++) delete my1[k]; } 答案: This is a constructor!i=0 This is a constructor!i=0 This is a constructor!i=0 This is desstructor!i=0 This is desstructor!i=0 This is desstructor!i=0 注释:此题主要理解以下几点:类对象指针数组的定义;指针对象的自动生成;指针对象构 造函数的自动调用过程;指针数组的动态释放;指针对象析构函数的自动调用过程。 程序设计 1 定义和实现类 Array。该类的成员函数 GetData 返回对一个数组元素的引用,成员函数 Print 调用成员函数 GetData 实现对该数组的打印 答案: #include <iostream.h> 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