【C++习题笔记】谭浩强C++程序设计(第三版)第九章
本⽂是谭浩强⽼师C++程序设计第三版第九章的习题笔记,主要设计类和对象的应⽤。
1. 构造函数和析构函数的作⽤是什么?什么时候需要⾃⼰定义构造函数和析构函数?
(1)构造函数:是⼀种特殊的成员函数,它来实现对象的初始化,它不光可以对数据成员进⾏赋值,还可以包含其他语句,如cout语句等。构造函数可以⾃⼰定义也可以由系统默认给出,当⽤户未定义构造函数时,系统会提供构造函数,只是该函数是空的,不起初始化作⽤;如果⽤户希望在建⽴对象时就能使⽤成员初值,就必须⾃⼰定义构造函数。
(2)析构函数:是与构造函数作⽤相反的函数,其作⽤并不是删除对象,⼆是在撤销对象占⽤存储空间之前完成⼀些清理⼯作,如释放资源,同时还可以⽤来执⾏“⽤户希望在最后⼀次使⽤对象之后所执⾏的任何操作”,如输出相关信息等。⼀般情况下,类的设计者应该在声明类的同时定义析构函数,以指定如何完成清理⼯作,若⽤户没有定义析构函数,系统也会⾃动⽣成,但是它只是徒有析构函数的名称和形式,其实什么操作都不执⾏,要想让析构函数完成任何⼯作,都需要在定义的析构函数中指定。
2. 分析下⾯的程序 写出其运⾏时的输出结果
#include <iostream>
using namespace std;
class Date
{public:
Date(int,int,int);
Date(int,int);
Date(int);
Date();
void display();
private:
int month;
int day;
int year;
};
Date::Date(int m,int d,int y):month(m),day(d),year(y)
{ }
Date::Date(int m,int d):month(m),day(d)
{year=2005;}
Date::Date(int m):month(m)
{day=1;
year=2005;
}
Date::Date()
{month=1;
day=1;
year=2005;
}
void Date::display()
{cout<<month<<"/"<<day<<"/"<<year<<endl;}
int main()
{
Date d1(10,13,2005);
Date d2(12,30);
Date d3(10);
Date d4;
d1.display();
d2.display();
d3.display();
d4.display();
return 0;
}
分析⽅法:这是构造函数的重载问题,原则是,同名的构造函数具有不同的参数,系统按调⽤时的参数形式来判断调⽤的是哪个构造函数,因此,上述程序按照构造函数的形式相同的来赋初值,可以得到下述结果:
10/13/2005
12/30/2005
10/1/2005
1/1/2005
3. 如果将第2题中程序的第5⾏改为⽤默认参数,即Date(int=1,int=1,int=2005); 分析程序有⽆问题。上机编译,分析出错信息,修改程序使之能通过编译。要求保留上⾯⼀⾏给出的构造函数,同时能输出与第2题的程序相同的输出结果。
编译出错,原因是构造函数使⽤默认参数后就不能再使⽤重载的构造函数,否则就会出现歧义,函数不知道调⽤的是谁。
修改⽅法:删去所有重载部分即可。
#include <iostream>
using namespace std;
class Date
{public:
Date(int=1,int=1,int=2005);
//Date(int,int);
//Date(int);
//Date();
void display();
private:
int month;
int day;
int year;
};
Date::Date(int m,int d,int y):month(m),day(d),year(y)
{ }
//Date::Date(int m,int d):month(m),day(d)
// {year=2005;}
//
//Date::Date(int m):month(m)
// {day=1;
//  year=2005;
// }
//
//Date::Date()
// {month=1;
/
/  day=1;
//  year=2005;
// }
void Date::display()
{cout<<month<<"/"<<day<<"/"<<year<<endl;}
int main()
{
Date d1(10,13,2005);
Date d2(12,30);
Date d3(10);
Date d4;
d1.display();
d2.display();
d3.display();
d4.display();
return 0;
}
4. 建⽴⼀个对象数组,内放5个学⽣的数据(学号、成绩),⽤指针指向数组⾸元素,输出第1,3,5个学⽣的数据。
//建⽴⼀个对象数组,内放5个学⽣的数据(学号、成绩),⽤指针指向数组⾸元素,输出第1,3,5个学⽣的数据。
#include <iostream>
using namespace std;
class Student
{
public:
Student(int n,float s):num(n),score(s){};
void display();
private:
int num;
float score;
};
void Student::display()
{cout<<num<<" "<<score<<endl;}
int main()
{
Student stu[5] = {Student(101,78.5),Student(102,85.5),Student(103,98.5),Student(104,100.0),Student(105,95.5)};
Student *p=stu;
for(int i = 0; i<=2;p=p+2,i++)
p->display();
return 0;
}
5. 建⽴⼀个对象数组,内放5个学⽣的数据(学号、成绩),设⽴⼀个函数max,⽤指向对象的指针作函数参数,在max函数中出5个学⽣
中成绩最⾼者,并输出其学号。
//建⽴⼀个对象数组,内放5个学⽣的数据(学号、成绩),设⽴⼀个函数max,⽤指向对象的指针作函数参数,在max函数中出5个学⽣中成绩最⾼者,并输出其学号。#include <iostream>
using namespace std;
class Student
{
public:
Student(int n, float s):num(n),score(s){};
int max(Student *arr);
int num;
float score;
};
int Student::max(Student *arr)
{
float max_score=arr[0].score;
int k=0;
for(int i=1;i<5;i++)
if(arr[i].score>max_score) {max_score=arr[i].score;k=i;}
return(k);
}
int main()
{
Student stu[5] ={Student(101,78.5),Student(102,85.5),Student(103,98.5),Student(104,100.0),Student(105,95.5)};
int k;
k = stu[5].max(stu);
cout<<stu[k].num<<" "<<endl;
return 0;
}
6. 阅读下⾯程序,分析其执⾏过程,写出输出结果。
#include <iostream>
using namespace std;
class Student
{public:
Student(int n,float s):num(n),score(s){}
void change(int n,float s) {num=n;score=s;}
void display(){cout<<num<<" "<<score<<endl;}
private:
int num;
float score;
};
int main()
{Student stud(101,78.5);
stud.display();
stud.change(101,80.5);
stud.display();
return 0;
}
程序分析:第⼀次dispay执⾏的是stud的初始值,即101,78.5,然后经过change函数,将第⼆次的101,80.5传⼊了change,因此第⼆次展⽰的结构是101,80.5
因此输出结果是:
101 78.5
c程序设计谭浩强pdf百度网盘101 80.5
7. 将第6题的程序分别作以下修改,分析所修改部分的含义以及编译和运⾏的情况。
(1) 将main函数第2⾏改为const Student stud(101,78.5);
(2) 在(1)的基础上修改程序,使之能正常运⾏,⽤change函数修改数据成员num和score的值。
(3) 将main函数改为
int main( )
{Student stud(101,78.5);
Student *p=&stud;
p->display( );
p->change(101,80.5);
p->display( );
return 0;
其他部分仍同第6题的程序。
(4) 在(3)的基础上将main函数第3⾏改为const Student *p=&stud;
(5) 再把main函数第3⾏改为Student *const p=&stud;
程序分析:
(1)改变是Student变为了常对象,由常对象的性质,它只能调⽤对象中的常函数⽽不能调⽤普通函数,因此display()函数需改为常函数;同时由于在其⽣命周期内,对象中所有的数据成员不能被修改,因此change函数没有意义,可以去掉。
因此程序修改如下:

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