8章习题解答
. 选择题
1. 关于类和对象,不正确的说法是()
A. 类是一种数据类型,它封装了数据和函数
B. 类是对某一类对象的抽象
C. 可以基于类这种数据类型定义类的引用
D. 一个类的对象只有一个
答案D
【解析】类是一种数据类型,可以基于“类”这种数据类型定义多个称为“对象”的变量
2. 类定义的外部,可以被访问的类的成员有()
A. public 的类成员
B. publicprivate的类成员
C. privateprotected的类成员
D. publicprivate 的类成员
答案A
【解析】类的成员数据或成员函数的访问属性分为三种情况:private、public和protected,即私有访问属性、公有访问属性和保护访问属性,类定义的外部只能访问公有访问属性的成员。
3 关于 this 指针,说法错误的是()
A. this指针必须显式说明
B. 当创建一个对象后,this 指针就指向该对象
C. 成员函数拥有this指针
D. 静态成员函数拥有 this指针
答案D
【解析】this指针是一种特殊的指针,它指向成员函数当前操作的数据所属的对象。不同的对象调用相同的成员函数时,this指针将指向不同的对象,也就可以访问不同对象的成员数据。而静态成员函数是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。因此,可以在没有任何对象存在的情况下,可以使用静态成员函数,而使用this指针必须有明确的对象所指。
4. 调用形式参数为普通对象的函数时,系统会自动调用相应类的()
A. 名字不同于类名的一般成员函数
B. 构造函数
C. 析构函数
D. 拷贝构造函数
答案D
【解析】若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数实现拷贝赋值。
5. 定义某类的对象后,再删除该对象,系统会自动调用()
A. 名字不同于类名的一般成员函数
B. 拷贝构造函数
C. 构造函数
D. 析构函数
答案D
【解析】当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间。
6. 对于析构函数,不正确的描述是()
A. 系统可以提供默认的析构函数
B. 析构函数不能进行重载
C. 析构函数没有参数
D. 析构函数可以设置默认参数
答案D
【解析】析构函数是无参的,析构函数的名字又是唯一的。
7. 关于静态成员,不正确的描述为()
A. 静态成员函数可以访问一般成员数据
B. 静态成员函数可以访问静态成员数据
C. 静态成员函数不可访问一般成员函数
D. 静态成员函数可以访问静态成员函数
答案A
【解析】静态成员函数是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。因此,可以在没有任何对象存在的情况下使用静态成员函数。如果在静态成员函数中访问一般成员数据,会造成这些一般成员数据没有所属对象的错误。
8. 关于友元,错误的描述是()
A. 关键字 friend 用于声明友元
B. 一个类中的成员函数可以是另一个类的友元
C. 类与类之间的友元关系不具有传递性
D. 类与类之间的友元关系具有对称性
答案D
【解析】友元关系不具有对称性和传递性。
9. 下列有关类模板、类和对象的说法中,正确的是()
A. 对象可以由类模板直接定义或生成
B. 类可以定义或生成类模板
C. 对象是类的实例,为对象分配存储空间而不是为类分配存储空间
D. 类是对象的实例,为类分配存储空间而不是为对象分配存储空间
答案C
【解析】由类模板可以生成类,由类可以生成对象。定义类时无需分配存储空间,而定义对象时需要分配存储空间。
10. 下列关于类的可访问性,错误的描述是()
A. 类外的一般函数可以访问该类的公有成员数据
B. 类外的一般函数可以访问该类的公有成员函数
C. 同一个类的成员函数可以访问该类的公有成员数据
D. 同一个类的成员函数不可访问该类的私有成员数据
答案D
【解析】同一个类的成员函数可以访问该类的任何访问属性的成员数据
. 简答题
1.简要说明类与对象之间的关系。
答:类表示现实生活中的一类实体,类是具有相同属性的对象的抽象,类实际是一种用户自定义数据类型,基于该数据类型可以定义对象。
2.简要描述构造函数的作用,类的成员函数是构造函数需要满足什么条件。
答:构造函数完成对象的初始化工作,构造函数必须满足以下几个条件:构造函数的名字与类的名字相同,构造函数没有返回值。
析构函数的定义
3.简要描述析构函数的作用,类的成员函数是析构函数需要满足什么条件。
答:析构函数用于当对象生存期结束时释放对象所占的内存空间,析构函数必须满足以下几个条件:析构函数的名字是:”~”+类的名字,析构函数没有返回值,析构函数没有参数。
4.何种情况之下一定要手动编写析构函数代码。
答:构造函数中使用new运算符向堆空间申请了用于存储成员数据的存储空间,必须具体定义析构函数用来删除该空间资源。
5.什么是浅拷贝构造函数,什么是深拷贝构造函数。
答:当定义拷贝构造函数时,只是完成一一对应的成员值的简单复制,称其为浅拷贝构造函数。深拷贝构造函数是对浅拷贝构造函数的完善,对指针成员必须重新申请空间并返回空间地址给相应指针成员。
6.何种情况之下一定要手动编写深拷贝构造函数代码。
答:如果类的数据成员包含指针变量,类的构造函数必须使用new运算符为这个指针动态申
请堆空间。如果此时还只是简单的使用浅拷贝的方式进行对象复制。最后,在退出运行时,由于两个对象的指针指向同一个堆空间中的资源,当调用析构函数先后删除这两个指针指向的堆空间中的资源时,程序会报错。为了解决此问题,必须定义深拷贝构造函数。
7.简要描述调用拷贝构造函数的几种情况。
答:拷贝构造函数常应用于以下三种情况:(1)当用一个类的对象去初始化该类的另一个对象时,系统自动调用拷贝构造函数实现拷贝赋值。(2)若函数的形参为类的对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数实现拷贝赋值。(3)当函数的返回值是类的对象时,系统调用拷贝构造函数实现拷贝赋值。
8.简要描述静态成员和一般成员的区别。
答:静态成员是一个类的所有对象共享的成员,而不仅仅是某一对象的成员。一般成员是隶属于某个具体的对象的。
9.从类的内部和类的外部两个方面描述访问属性privatepublic的访问规则。
答:类的内部和类的外部两个方面描述访问属性privatepublic的访问规则,如下表所示。
公有成员数据
私有成员数据
公有成员函数
私有成员函数
内的内部的可访问性:同一个类的成员函数
可以访问
可以访问
可以访问
可以访问
内的外部的可访问性:另一个类的成员函数或一般函数
可以访问
不可访问
可以访问
不可访问
10.什么是组合关系,组合关系在C++中是如何实现的。
答:现实世界中对象与对象之间的整体-部分关系又称为组合关系。组合关系是通过成员对象的方式实现的。
三、阅读程序,并给出结果
1
#include <iostream>
using namespace std;
class Test
{
private:
    int a;
    int b;
public:
    Test(int x, int y)
    {
        a=x;
        b=y;
        cout<<"Constructor 1"<<endl;
        cout<<a<<","<<b<<endl;
    }
    Test(Test &t)
    {
        cout<<"Constructor 2"<<endl;
        cout<<t.a<<","<<t.b<<endl;
    }
};
int main()
{
    Test t1(9,7);
    Test t2(t1);
    return 0;
}
1.运行结果是:
Constructor 1
9,7
Constructor 2
9,7
【解析】main函数中首先调用普通构造函数Test(int x, int y)生成一个对象t1,然后调用拷贝构造函数Test(Test &t)生成另一个对象t2,这两个对象t1t2具有相同的成员数据值。
2
#include<iostream>
using namespace std;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。