c++语言程序设计课后答案

更新时间:2024-04-28 01:44:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2-20运行下面的程序,观察其输出,体会 i++与++i的差别。 #include int main() {

int myAge = 39; // initialize two integers int yourAge = 39;

cout << \ cout << \ myAge++; // postfix increment ++yourAge; // prefix increment cout << \

cout << \ cout << \ cout << \

cout << \ cout << \

cout << \ cout << \ return 0; } 解:

程序运行输出: I am 39 years old You are 39 years old One year passes I am 40 years old You are 40 years old Another year passes I am 40 years old You are 41 years old Let's print it again I am 41 years old You are 41 years old

3-4 什么叫内联函数 ?它有哪些特点? 解:

定义时使用关键字 inline的函数叫做内联函数;编译器在编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销;内联函数体内不能有循环语句和 switch语句;内联函数的定义必须出现在内联函数第一次被调用之前;对内联函数不能进行异常接口声明;

3-5 函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗? 解:

不必一致,所有的参数是根据位置和类型而不是名字来区分的。

1 / 9

3-6 调用被重载函数时,通过什么来区分被调用的是哪个函数? 解:

重载的函数的函数名是相同的,但它们的参数的个数和数据类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。

3-11什么叫作嵌套调用?什么叫作递归调用? 解:

函数允许嵌套调用。如果函数1调用了函数 2,函数 2再调用函数 3,便形成了函数的嵌套调用。函数可以直接或间接地调用自身,称为递归调用。

4-3 构造函数和析构函数有什么作用? 解:

构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态,使此对象具有区别于彼对象的特征,完成的就是是一个从一般到具体的过程,构造函数在对象创建的时候由系统自动调用。析构函数与构造函数的作用几乎正好相反,它是用来完成对象被删除前的一些清理工作,也就是专门作扫尾工作的。一般情况下,析构函数是在对象的生存期即将结束的时刻由系统自动调用的,它的调用完成之后,对象也就消失了,相应的内存空间也被释放。

4-4 数据成员可以为公有的吗?成员函数可以为私有的吗? 解:

可以,二者都是合法的。数据成员和成员函数都可以为公有或私有的。但数据成员最好定义为私有的。

4-6 什么叫做拷贝构造函数?拷贝构造函数何时被调用? 解:

拷贝构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用,其作用是使用一个已经存在的对象,去初始化一个新的同类的对象。在以下三种情况下会被调用:在当用类的一个对象去初始化该类的另一个对象时;如果函数的形参是类对象,调用函数进行形参和实参结合时;如果函数的返回值是类对象,函数调用完成返回时;

4-7 拷贝构造函数与赋值运算符 (=)有何不同? 解:

赋值运算符 (=)作用于一个已存在的对象;而拷贝构造函数会创造一个新的对象。

4-11定义一个矩形类,有长、宽两个属性,有成员函数计算矩形的面积 解:

#include class Rectangle { public:

Rectangle(float len, float width) {

Length = len; Width = width; }

~Rectangle(){};

float GetArea() { return Length * Width; } float GetLength() { return Length; }

2 / 9

float GetWidth() { return Width; } private: float Length; float Width; }; void main() {

float length, width;

cout << \请输入矩形的长度:\ cin >> length;

cout << \请输入矩形的宽度:\ cin >> width;

Rectangle r(length, width);

cout << \长为\宽为\的矩形的面积为:\ }

程序运行输出: 请输入矩形的长度:5 请输入矩形的宽度:4

长为 5、宽为 4的矩形的面积为: 20

5-1 什么叫做作用域?有哪几种类型的作用域? 解:

作用域讨论的是标识符的有效范围,作用域是一个标识符在程序正文中有效的区域。 C++的作用域分为函数原形作用域、块作用域(局部作用域)、类作用域和文件作用域.

5-2 什么叫做可见性?可见性的一般规则是什么? 解:

可见性是标识符是否可以引用的问题;可见性的一般规则是:标识符要声明在前,引用在后,在同一作用域中,不能声明同名的标识符。对于在不同的作用域声明的标识符,遵循的原则是:若有两个或多个具有包含关系的作用域,外层声明的标识符如果在内层没有声明同名标识符时仍可见,如果内层声明了同名标识符则外层标识符不可见。

5-3 下面的程序的运行结果是什么,实际运行一下,看看与你的设想有何不同。 #include void myFunction(); int x = 5; int y = 7; int main() {

cout << \ cout << \ myFunction();

cout << \ cout << \ cout << \ return 0;

3 / 9

}

void myFunction() {

int y = 10;

cout << \ cout << \ } 解:

程序运行输出: x from main: 5 y from main: 7 x from myFunction: 5 y from myFunction: 10 Back from myFunction! x from main: 5 y from main: 7

5-4 假设有两个无关系的类 Engine和 Fuel,使用时,怎样允许 Fuel成员访问 Engine中的私有和保护的成员? 解: 源程序: class fuel; class engine {

friend class fuel; private:

int powerLevel; public:

engine(){powerLevel = 0;} void engine_fn(fuel &f); }; class fuel {

friend class engine; private: int fuelLevel; public:

fuel(){ fuelLevel = 0;} void fuel_fn( engine &e); };

6-2 在数组 A[20]中第一个元素和最后一个元素是哪一个? 解:

第一个元素是 A[0],最后一个元素是 A[19]。

4 / 9

6-7 什么叫做指针?指针中储存的地址和这个地址中的值有何区别? 解:

指针是一种数据类型,具有指针类型的变量称为指针变量。指针变量存放的是另外一个对象的地址,这个地址中的值就是另一个对象的内容。

6-10定义一个有五个元素的int型数组,在程序中提示用户输入元素值,最后再在屏幕上显示出来。 解:

#include int main() {

int myArray[5]; int i;

for ( i=0; i<5; i++) {

cout << \ cin >> myArray[i]; }

for (i = 0; i<5; i++)

cout << i << \ return 0; }

程序运行输出: Value for myArray[0]: 2 Value for myArray[1]: 5 Value for myArray[2]: 7 Value for myArray[3]: 8 Value for myArray[4]: 3 0: 2 1: 5 2: 7 3: 8 4: 3

6-17 下列程序有什么问题,请仔细体会使用指针时应该如何避免出现这个问题。 解:

指针 p没有初始化,也就是没有指向某个确定的内存单元,它指向内存中的一个随机地址,给这个随机地址赋值是非常危险的。

6-18下列程序有何问题,请改正;仔细体会使用指针时应避免出现的这个问题。 #include int Fn1(); int main() {

5 / 9

int a = Fn1();

cout << \ return 0; } int Fn1() {

int * p = newint (5); return *p; } 解:

此程序中给*p分配的内存没有被释放掉。 改正:

#include using namespace std; int * fn1(){

int *p=new int(5); return p; } int main() {

int *a=fn1();

cout<<\ delete a; return 0; }

7-2 派生类构造函数执行的次序是怎样的? 解:

派生类构造函数执行的一般次序为:调用基类构造函数;调用成员对象的构造函数;派生类的构造函数体中的内容。

7-4 什么叫做虚基类?有何作用? 解:

当某类的部分或全部直接基类是从另一个基类派生而来,这些直接基类中,从上一级基类继承来的成员就拥有相同的名称,派生类的对象的这些同名成员在内存中同时拥有多个拷贝,我们可以使用作用域分辨符来唯一标识并分别访问它们。我们也可以将直接基类的共同基类设置为虚基类,这时从不同的路径继承过来的该类成员在内存中只拥有一个拷贝,这样就解决了同名成员的唯一标识问题。虚基类的声明是在派生类的定义过程,其语法格式为: class 派生类名: virtual继承方式基类名上述语句声明基类为派生类的虚基类,在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。声明了虚基类之后,虚基类的成员在进一步派生过程中,和派生类一起维护一个内存数据拷贝。

7-6 定义一个哺乳动物 Mammal类,再由此派生出狗 Dog类,定义一个 Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序。 解: 源程序:

#include

enum myColor{BLACK,WHITE};

6 / 9

class Mammal {

public: //构造函数 Mammal();

~Mammal(); //访问数据成员 int GetAge() const{return itsAge;} void SetAge(int age){itsAge=age;} int GetWeight() const {return itsWeight;}

void SetWeight(int weight){itsWeight=weight;} //其他函数 void Speak() const {cout<<\ protected: int itsAge; int itsWeight; };

class Dog:public Mammal { public: Dog(); ~Dog();

myColor GetColor() const{return itsColor;} void SetColor (myColor color){itsColor=color;} void WagTail(){cout<<\\\n\ private:

myColor itsColor; };

Mammal::Mammal():itsAge(1),itsWeight(5){ cout<<\\\n\ }

Mammal::~Mammal(){

cout<<\\\n\ }

Dog::Dog():itsColor(WHITE){ cout<<\\\n\ }

Dog::~Dog() {

cout<<\\\n\ } int main() {

Dog Jack; Jack.Speak(); Jack.WagTail();

cout<<\ return 0;

7 / 9

}

7-7 定义一个基类,构造其派生类,在构造函数中输出提示信息,观察构造函数的执行情况。 解:

#include class BaseClass { public: BaseClass(); };

BaseClass::BaseClass() {

cout << \构造基类对象!\ }

class DerivedClass : public BaseClass { public:

DerivedClass(); };

DerivedClass::DerivedClass() {

cout << \构造派生类对象!\ }

void main() {

DerivedClass d; }

程序运行输出: 构造基类对象!

8-1 什么叫做多态性 ?在 C++中是如何实现多态的? 解:

多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。 C++支持的多态有多种类型,重载 (包括函数重载和运算符重载 )和虚函数是其中主要的方式。

8-2 什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现? 解:

带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出。但抽象类的派生类并非一定要给出纯虚函数的实现,如果派生类没有给出纯虚函数的实现,这个派生类仍然是一个抽象类。

8-5 编写一个哺乳动物类Mammal,再由此派生出狗类Dog ,两者都声明Speak()成员函数,该函数在

基类中被声明成虚函数,声明一个Dog类的对象,通过此对象调用Speak函数,观察运行结果 解:

#include #include

8 / 9

class Mammal { protected: char name[10]; public: virtual void set() {

strcpy(name,\哈哈\ }

virtual void speak() {

cout<<\这是哺乳动物\} };

class Dog:public Mammal { public: void set() {

strcpy(name,\哈哈\}

void speak() {

cout<<\这是哺乳动物:狗\} };

void fun(Mammal &s) { s.speak(); }

void main() {

Mammal m1; Dog d2; fun(m1); fun(d2); }

运行结果: 这是哺乳动物 这是哺乳动物:狗

9 / 9

本文来源:https://www.bwwdw.com/article/0n9g.html

Top