面向对象程序设计C++练习题(1)

把学校课程网站上的C++作业做了个总结,方便以后的复习。

1-1.教材习题4_13:定义Circle类并计算面积
【问题描述】
定义一个Circle类,有数据成员radius(半径),成员函数getArea()计算圆的面积。构造一个Circle的对象进行测试(注:圆周率取值3.14)。

【输入形式】
程序参考的输入(提示“Input Radius:”):
Input Radius:10

【输出形式】
程序参考的输出:
Area:314

【样例输入】
Input Radius:10
【样例输出】
Area:314

#include<iostream>
#define Pi 3.14
using namespace std;
class Circle {
public:
	float getArea();
private:
	double radius;

};

float Circle::getArea() {
	cout << "Input Radius:";
	cin >> radius;
	return Pi * radius * radius;
}

int main()
{
	Circle radius;
	float area = radius.getArea();
	cout << "Area:" << area << endl;

}

1-2.教材习题4_8:定义Dog类,包含age和weight信息
【问题描述】
定义一个Dog类,包含age,weight等属性,以及对这些属性操作的方法。实现并测试这个类。

【输入形式】
程序参考的输入(提示“Input Age and Weight:”):
Input Age and Weight:3 20

【输出形式】
程序参考的输出:
Dog Age:3 years
Dog Weight:20kg

#include<iostream>
#define Pi 3.14
using namespace std;
class Dog
{
public:
    void setdog();
    void showdog();
private:
    int age;
    int weight;
};

void Dog::setdog()
{
    cout << "Input Age and Weight:";
    cin >> age >> weight;
}

void Dog::showdog()
{
    cout<<"Dog Age:"<<age<<" years"<<endl;
    cout<<"Dog Weight:"<<weight<<"kg"<<endl;
}

int main()
{
    Dog mimi;
    mimi.setdog();
    mimi.showdog();
}

2-1.教材习题4_9:通过屏幕两点确定矩形类Rectangle
【问题描述】
设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算矩形的面积。

【输入形式】
程序参考的输入(提示“Input Point A:”输入左下角的坐标;提示“Input Point B:”输入左下角的坐标):
Input Point A:0 0
Input Point B:8.2 4.5

【输出形式】
程序参考的输出:
Rectangle Area:36.9

【样例输入】
Input Point A:0 0
Input Point B:8.2 4.5

【样例输出】
Rectangle Area:36.9

#include <iostream>

using namespace std;

class Rectangle {
public:
	void getPoint();
	float getArea();
private:
	double x1;
	double x2;
	double y1;
	double y2;
	double Area;
};

void Rectangle::getPoint() {
	cout << "Input Point A:";
	cin >> x1 >> y1;
	cout << "Input Point B:";
	cin >> x2 >> y2;
}

float Rectangle::getArea(){
    Area=(x1-x2)*(y1-y2);
    if(Area<0){
        Area=-Area;
    }
    return Area;
}
int main()
{
    Rectangle a;
    a.getPoint();
    float area = a.getArea();
    cout << "Rectangle Area:" << area << endl;
    return 0;
}

2-2.教材习题4_20:定义满足要求的复数类Complex类
【问题描述】
定义一个复数类Complex,使得下面的代码能够工作。(注:下列代码需放在主函数中。)
Complex c1(3,5);    //用复数3+5i初始化c1
Complex c2=4.5;     //用实数4.5初始化c2
c1.add(c2);   //将c1与c2相加,结果保存在c1中
c1.show(); //将c1输出(这时的结果应该是7.5+5i)

【输入形式】

【输出形式】
7.5+5i

#include <iostream>
using namespace std;
class Complex
{
private:
double real;
double imag;
public:
    Complex(){real=0;imag=0;}
    Complex(double r){real=r;imag=0;};
    Complex(double r,double i){real=r;imag=i;};
    void add(Complex c1){real += c1.real;imag += c1.imag;};
    void show();
};
void Complex::show()
{
    cout<<real;
    if(imag>0)cout<<"+"<<imag<<"i"<<endl;
    else if(imag<0)cout<<imag<<"i"<<endl;
}
int main()
{
    Complex c1(3,5);
    Complex c2=4.5;
    c1.add(c2);
    c1.show();
    return 0;
}

3-1.使用Visual C++ 6.0或CodeBlocks集成环境来编辑编译并运行程序
【问题描述】
使用Visual C++ 6.0或CodeBlocks集成环境来编辑、编译并运行程序:

【输入形式】

【输出形式】
constructor.
3,4
x+y=7
constructor.
30,40
x+y=70
destructor.
30,40
destructor.
3,4

#include <iostream>
using namespace std;
class TAdd
{
public:
 TAdd(int a,int b)
 {
    x=a;y=b;
    cout<<"constructor."<<endl;
    cout<<x<<","<<y<<endl;
 }
 ~TAdd()
 {
    cout<<"destructor."<<endl;
    cout<<x<<","<<y<<endl;
  }
  int add(){return x+y;}
private:
  int x,y;
};

int main()
{
   TAdd p1(3,4);
   cout<<"x+y="<<p1.add()<<endl;
   TAdd p2(30,40);
   cout<<"x+y="<<p2.add()<<endl;
   return 0;
}

3-2.完成函数实现日期类Date
【问题描述】
定义日期类Date。要求:
(1)可以设置日期;
(2)日期加一天操作;
(3)输出函数,输出格式为“XXXX-XX-XX”;
(4)编写主函数,定义对象,完成相应功能。

【输入形式】
程序的参考的输入(“Input Date:”为提示文字):
Input Date:2016 2 28

【输出形式】
程序的输出:
2016-2-28
2016-2-29

【样例输入】
Input Date:2016 2 28

【样例输出】
2016-2-28
2016-2-29

#include <iostream>
using namespace std;
class Date
{
public:
  Date()
  {
    cout<<"Input Date:";
    cin>>y>>m>>d;
  }
  int beLeapYear()
  {
    return ((y%4==0&&y%100!=0)||(y%400==0));
  }
  void addOneDay()
  {
      d++;
      		switch(m)
      		{
      			case 1:
      			case 3:
      			case 5:
      			case 7:
      			case 8:
      			case 10:
      			case 12:
      				{
      					if(d > 31)
      					{
      						d -= 31;
      						m=1;
      						y++;
      					}
      					break;
      				}
      			case 4:
      			case 6:
      			case 9:
      			case 11:
      				{
      					if(d > 30)
      					{
      						d-= 30;
      						m++;
      					}
      					break;
      				}
      			case 2:
      				{
      					if(beLeapYear())
      					{
      						if(d > 29)
      						{
      							d -= 29;
      							m++;
      						}
      					}
      					else
      					{
      						if(d > 28)
      						{
      							d -= 28;
      							m++;
      						}
      					}
      					break;
      				}
      			default:
      				{
      					break;
      				}
      		    
      		} 

  }
  void showDate()
  {
    cout<<y<<"-"<<m<<"-"<<d<<endl;
   }
private:
  int y,m,d;
  };
int main()
{
   Date d;
   d.showDate();
   d.addOneDay();
   d.showDate();
}

4-1.教材习题5_3:全局变量与局部变量
【问题描述】
下面程序的运行结果是什么?实际运行一下,看看与你的设想有何不同。
注:只需调试一下代码即可,原样输入。

#include <iostream>

using namespace std;
int x=5,y=7;
void myFunction(){
    int y=10;
    cout<<"x from myFunction:"<<x<<endl;
    cout<<"y from myFunction:"<<y<<endl;
}

int main()
{
    cout<<"x from main:"<<x<<endl;
    cout<<"y from main:"<<y<<endl;
    myFunction();
    cout<<"Back from myFunction!"<<endl;
    cout<<"x from main:"<<x<<endl;
    cout<<"y from main:"<<y<<endl;
    return 0;
}

4-2.教材习题5_7:利用静态变量统计小猫Cat的数量
【问题描述】
定义一个Cat类,拥有静态数据成员numOfCats,记录Cat的个体数目;静态成员函数getNumOfCats(),读取numOfCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。

主函数如下:

int main()
{
    Cat c;
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    Cat carr[4];
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    return 0;
}

参考的输出结果为:
Num:1
Num:5

【输入形式】

【输出形式】
Num:1
Num:5

#include <iostream>
using namespace std;
class Cat
{
public:
    Cat()
    {
        numOfCats++;
    }
    ~Cat()
    {
        numOfCats--;
    }
    static int getNumOfCats()
    {
        return numOfCats;
    }
private:
    static int numOfCats;
};

int Cat::numOfCats = 0;
int main()
{
    Cat c;
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    Cat carr[4];
    cout<<"Num:"<<Cat::getNumOfCats()<<endl;
    return 0;
}

5-1.教材习题5_14:定义Boat与Car两个类,友元计算总重量
【问题描述】
定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数getTotalWeight(),计算二者的重量和。

【输入形式】
参考的输入(数字前为提示文字):
Input boat weight:3
Input car weight:5

【输出形式】
参考的输出:
Total weight:8

【样例输入】
Input boat weight:3
Input car weight:5

【样例输出】
Total weight:8

#include <iostream>
using namespace std;
class car;
class boat{
private:
	int weight;
public:
	boat();
	friend int gettotalweight(boat &b,car &c);
};
boat::boat(){
    cout <<"Input boat weight:";
    cin>>weight;
}
class car{
private:
	int weight;
public:
	car();
	friend int gettotalweight(boat &b,car &c);
};
car::car(){
    cout <<"Input car weight:";
    cin>>weight;
}
int gettotalweight(boat &b,car &c){
	return b.weight+c.weight;
}
int main(){
	boat b;
	car c;
	cout<<"Total weight:"<<gettotalweight(b,c)<<endl;
	return 0;
}

5-2.教材习题5_13:定义类X,Y,Z,按要求实现友元
【问题描述】
定义类X,Y,Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5;函数h(X*)是X的友元函数,实现对X的成员i加10。主函数实现测试。主函数需要定义如下:

int main()
{
    int a;
    cin>>a;
    X x(a);
    Y y;
    Z z;
    y.g(x);
    z.f(x);
    h(x);
    x.print();
}

【输入形式】
参考的输入:
3

【输出形式】
参考的输出:
19

【样例输入】
3
【样例输出】
19

#include <iostream>
using namespace std;
class X;

class Y
{
public:
    void g(X &x);
};

class Z
{
public:
    void f(X &x);
};

class X
{
public:
    X(int i):i(i) {}
    friend void Y::g(X &x);
    friend class Z;
    friend void h(X &x);
    void print()
    {
        cout<<i;
    }
private:
    int i;
};

void Y::g(X  &x)
{
    x.i++;
}
void Z::f(X  &x)
{
    x.i+=5;
}
void h(X  &x)
{
    x.i+=10;
}

int main()
{
    int a;
    cin>>a;
    X x(a);
    Y y;
    Z z;
    y.g(x);
    z.f(x);
    h(x);
    x.print();
}

6-1.利用对象数组,计算10个顶点组成折线的长度
【问题描述】
假设有一个点类point,具有两个实数坐标。希望主程序使用这个类完成下述功能:
(l)主程序为类point定义10个点的对象数组(也可以动态申请空间)。
(2)要求调用一个函数Set()从键盘输入10个对象的属性。
(3)要求调用一个函数Display()显示10个对象的值。
(4)要求调用一个函数Lenth(),计算将这些点连成一条折线时,这条折线的长度。

【输入形式】
参考的输入(每个点要求提示“Input x,y:”):
Input x,y:0 0
Input x,y:3 5
Input x,y:2 4
Input x,y:9 8
Input x,y:2 3
Input x,y:8 9
Input x,y:7 6
Input x,y:2 9
Input x,y:5 8
Input x,y:6 6

【输出形式】
参考的输出:
(0,0)
(3,5)
(2,4)
(9,8)
(2,3)
(8,9)
(7,6)
(2,9)
(5,8)
(6,6)
Length:46.7866

#include <iostream>
#include <math.h>
using namespace std;
#define MAX 10
#define col 0
class CPoint
{
private:
    int array[MAX][2];
    float DisAB;
    float sum;
public:
    void CSetPoint();
    void Display();
    void Lenth();
    float PowerX_X(int i);
    float PowerY_Y(int i);
    float Twodist();
};
void CPoint::CSetPoint()
{
    //cause this is a point,so the col is 2,and i made the default value is 0
    for(int i=0; i<MAX;i++)
    {
        cout<<"Input x,y:";
        cin >> array[i][col]
            >>array[i][col+1];  //Store the two values of input
    }
}
void CPoint::Display()  //display the point that your input
{
    for(int i=0; i<MAX;i++)
    {
        cout <<"("
             << array[i][col] <<","
             << array[i][col+1] <<")"
             <<endl;
    }
}
float CPoint::PowerX_X(int i) //compute (X1-X2)*(X1-X2)
{
   return (array[i][col] - array[i+1][col]) * (array[i][col] - array[i+1][col]);
}
float CPoint::PowerY_Y(int i)     //compute (Y1-Y2)*(Y1-Y2)
{
   return (array[i][col+1] - array[i+1][col+1]) * (array[i][col+1] - array[i+1][col+1]);
}
float CPoint::Twodist()   //compute the distance of two point
{
    sum=0;
    for(int point = 0; point < MAX-1; point++) //must be carful.ten point ,just compute nine times
    {
        int XX=PowerX_X(point);
        int YY=PowerY_Y(point);
        sum += fabs ( DisAB = sqrt ( XX + YY ) );   //compute sum of each point
    }
    return sum;
}
void CPoint::Lenth()    //obtain the return value and display
{
    float lenth ;
    lenth = Twodist();
    cout << "Length:"<< lenth <<endl;
}
int main()
{
    CPoint point;
    point.CSetPoint();
    point.Display();
    point.Lenth();
    return 0;
}

6-2.定义Employee类,输出编号和姓名
【问题描述】
定义一个Employee类,在Employee类中增加一个数据(静态数据成员)来设置本公司员工编号基数,新增加的员工编号将在创建对象的同时自动在基数上增加(程序输入2个人员)。

【输入形式】
参考的输入如下(提示“Input name:”):
Input name:zhangsan
Input name:lisi

【输出形式】
参考的输出如下:
ID:1001 Name:zhangsan
ID:1002 Name:lisi

#include <iostream>
#include <string>
using namespace std;
class Employee
{
public:
    Employee();
    void display();
private:
    static int base_id;
    int id;
    string name;
};
int  Employee::base_id=0;
Employee::Employee(){
    base_id++;
    id=1000+base_id;
    cout<<"Input name:";
    cin>>name;

}
void  Employee::display(){
    cout<<"ID:"<<id<<" Name:"<<name<<endl;
}

int main()
{
    Employee e1;
    Employee e2;
    e1.display();
    e2.display();
    return 0;
}

7-1.教材习题7_5:Shape类派生Rectangle和Circle类
【问题描述】
定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea()函数计算对象面积。使用Rectangle类创建一个派生类Square。
注:圆周率取3.14

【输入形式】
参考的输入(数字前面的文字为提示):
Input a,b:5 10
Input r:10

【输出形式】
参考的输出:
Rectangle Area:50,Circle Area:314

#include<iostream>
#include<string>
#define PAI 3.14
using namespace std;
class Shape{
public:
    int getarea();
};

class Rectangle:public Shape{
public:
    void setab();
    void getab(){
        cout<<"Input a,b:";
        cin>>a>>b;
    }
    int getarea(){
        return a*b;
    }
private:
    int a;
    int b;
};

class Circle:public Shape{
public:
    void setr();
    void getr(){
        cout<<"Input r:";
        cin>>r;
    }
    float getarea(){
        return r*r*PAI;
    }
private:
    int r;
};

class Square:public Rectangle{
public:
    void setside();
    void getside();
    int getarea();
private:
    int side;
};

int main(){
    Rectangle a;
    Circle b;
    a.getab();
    b.getr();
    cout<<"Rectangle Area:"<<a.getarea();
    cout<<",Circle Area:"<<b.getarea();
    return 0;
}

7-2.教材习题7_6:哺乳动物类Mammal派生出狗类Dog
【问题描述】
定义一个哺乳动物类Mammal,再由此派生出狗类Dog,定义一个Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。

【输入形式】
参考的输入为("Input Dog Name:"为提示文字):
Input Dog Name:wangcai

【输出形式】
参考的输出为:
Con.Mammal
Con.Dog:wangcai
Des.Dog:wangcai
Des.Mammal

#include <iostream>
#include <string>
using namespace std;
class Mammal
{
public:
    Mammal(string name):name(name)
    {
        cout<<"Con.Mammal"<<endl;
    }
    ~Mammal()
    {
        cout<<"Des.Mammal"<<endl;
    }
protected:
    string name;
};
class Dog:public Mammal{
public:
    Dog(string name):Mammal(name),n(name)
    {
        cout<<"Con.Dog:"<<n<<endl;
    }
    ~Dog()
    {
        cout<<"Des.Dog:"<<n<<endl;
    }
private:
    string n;
};

int main()
{
    string name;
    cout<<"Input Dog Name:";
    cin>>name;
    Dog d(name);
    return 0;
}

7-3.教材习题6_20:实现一个简单圆类
【问题描述】
实现一个名为SimpleCircle的简单圆类。其数据成员int *itsRadius为一个指向其半径值的指针,存放其半径值。设计对数据成员的各种操作并计算面积,给出这个类的完整实现并测试这个类。
注:简单计算半径为10的圆面积,不需要输入,圆周率取3.14。

【输入形式】

【输出形式】
Area:314

#include <iostream>
using namespace std;
const float pi=3.14;
class SimpleCircle
{
public:
SimpleCircle(float Radius = 0)
    {
        itsRadius = new float(Radius);
 
    }

    void setRadius(float r)
    {
        *itsRadius=r;
    }
    float getRadius()
    {
        return *itsRadius;
    }
    float getArea()
    {
        return (*itsRadius)*(*itsRadius)*pi;
    }
private:
    float *itsRadius;
};
int main()
{
    SimpleCircle c;
    c.setRadius(10);
    cout<<"Area:"<<c.getArea()<<endl;
}

8-1.教材习题7_8:定义一个Document类和Book类
【问题描述】
定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount。

【输入形式】
程序参考的输入(数据前面文字为提示):
Input Name and Page:Math 280

【输出形式】
程序参考的输出:
Name:Math
Page:280

#include <iostream>
#include <string.h>
using namespace std;
class Document{
public:
    Document(){};
    Document(const char *name);
    char *Name;
    void PrintNameOf();
};

Document::Document(const char *name){
    Name=new char[strlen(name)+1];
    strcpy(Name,name);
};

void Document::PrintNameOf(){
    cout<<Name<<endl;
}

class Book:public Document{
public:
    Book(const char *name,long pagecount);
    void getnamepage();
    void PrintNameOf();
    void PrintPage();
private:
    long PageCount;
};

Book::Book(const char *name,long pagecount):Document(name){
    PageCount=pagecount;
}

void Book::getnamepage(){
    cout<<"Input Name and Page:";
    cin>>Name>>PageCount;
}

void Book::PrintNameOf(){
    cout<<"Name:";
    Document::PrintNameOf();
}

void Book::PrintPage(){
    cout<<"Page:"<<PageCount<<endl;
}

int main()
{
    Document a("0");
    Book b("0",0);
    b.getnamepage();
    b.PrintNameOf();
    b.PrintPage();
    return 0;
}

8-2.教材习题7_10:定义一个Object类和Box类
【问题描述】
定义一个Object类,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数和析构函数的调用顺序。
【输入输出形式】
参考的输入及输出(其中Input开头的两段文字为输入提示和输入数据,其他均为输出):
Constructing Object!
Constructing Box!
Input weight:50
Input height and width:20 30
Weight:50
Height and width:20,30
Destructing Box!
Destructing Object!

#include <iostream>
#include <string>
using namespace std;
class Object
{
public:
    Object()
    {
        cout<<"Constructing Object!"<<endl;
    }
    ~Object()
    {
        cout<<"Destructing Object!"<<endl;
    }
    void getInfo()
    {
        cout<<"Input weight:";
        cin>>weight;
    }
    void showInfo()
    {
        cout<<"Weight:"<<weight<<endl;
    }
private:
    int weight;
};
class Box:public Object
{
public:
    Box()
    {
        cout<<"Constructing Box!"<<endl;
    }
    ~Box()
    {
        cout<<"Destructing Box!"<<endl;
    }
    void  getInfo()
    {
        Object::getInfo();
        cout<<"Input height and width:";
        cin>>height>>width;
    }
    void  showInfo()
    {
        Object::showInfo();
        cout<<"Height and width:"<<height<<","<<width<<endl;
    }
private:
    int height;
    int width;
};

int main()
{
    Box box;
    box.getInfo();
    box.showInfo();
    return 0;
}

9-1.教材习题7_13:编写程序输出各个类各自的地址
【问题描述】
思考例7-6和例7-8中Derived类的各个数据成员在Derived对象中存放的位置,编写程序输出它们各自的地址来验证自己的判断。
录入下面的代码,自行分析输出结果。

//7_8.cpp

#include <iostream>

using namespace std;

class Base0 {    //定义基类Base0
public:
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};

class Base1: virtual public Base0 {    //定义派生类Base1
public:    //新增外部接口
    int var1;
};

class Base2: virtual public Base0 {    //定义派生类Base2
public:    //新增外部接口
    int var2;
};

class Derived: public Base1, public Base2 {    //定义派生类Derived
public:    //新增外部接口
    int var;
    void fun() { cout << "Member of Derived" << endl; }
};

int main() {    //程序主函数
    Derived d;    //定义Derived类对象d
    d.var0 = 2;    //直接访问虚基类的数据成员
    d.fun0();    //直接访问虚基类的函数成员
    if(&d.Base1::var0==&d.Base2::var0)
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;
    return 0;
}

9-2.教材习题7_15:下面的程序能得到预期的结果吗?
【问题描述】
下面的程序能得到预期的结果吗?如何避免类似问题的发生?
请修改程序,使它得到我们想要的结果。即希望两个输出的值相同。
提示:struct在C++中也可以用来定义类,它与class的不同在于struct定义的类成员的默认访问权限是public。

#include <iostream>
using namespace std;
struct Base1 {int x;};
struct Base2 {float y;};
struct Derived : Base1,Base2{};
int main()
{
    Derived *pd=new Derived;
    pd->x=1;pd->y=2.0f;
    void *pv = pd;
    Base2 *pb=static_cast<Base2*>(pv);
    cout<<pd->y<<" "<<pb->y<<endl;
    delete pd;
    return 0;
}

【输入形式】

【输出形式】
2 2

#include <iostream>
using namespace std;
struct Base1 {int x;};
struct Base2 {float y;}
struct Derived : Base1,Base2{};
int main()
{
    Derived *pd=new Derived;
    pd->x=1;pd->y=2.0f;
    Derived *pv = pd;
    Base2 *pb=static_cast<Base2*>(pv);
    cout<<pd->y<<" "<<pb->y<<endl;
    delete pd;
    return 0;
}

9-3.教材习题7_11:基类BaseClass派生出类DerivedClass
【问题描述】
定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fn1(),fn2(),观察运行结果。

主函数如下:
int main()
{
    DerivedClass dc;
    BaseClass *pb = &dc;
    DerivedClass *pd = &dc;
    dc.fn1();
    dc.fn2();
    pb->fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
}


【输入形式】

【输出形式】
程序的输出结果为:
DerivedClass:fn1()
DerivedClass:fn2()
BaseClass:fn1()
BaseClass:fn2()
DerivedClass:fn1()
DerivedClass:fn2()

#include <iostream>
using namespace std;
class BaseClass{
public:
void fn1(){
cout<<"BaseClass:fn1()"<<endl;
}
void fn2(){
cout<<"BaseClass:fn2()"<<endl;
}
};
class DerivedClass:public BaseClass{
public:
void fn1(){
cout<<"DerivedClass:fn1()"<<endl;
}
void fn2(){
cout<<"DerivedClass:fn2()"<<endl;
}
};

int main()
{
    DerivedClass dc;
    BaseClass *pb = &dc;
    DerivedClass *pd = &dc;
    dc.fn1();
    dc.fn2();
    pb->fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
}

10-1.录入程序分析结果
【问题描述】
输入以下程序,分析运行结果

#include <iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<<b1<<endl; }
    void print() { cout<<b1<<endl; }
private:
    int b1;
};

class B2
{
public:
    B2(int i)
    {
        b2 = i;
        cout<<"Constructing B2."<<b2<<endl; }
    void print() { cout<<b2<<endl;}
private:
    int b2;
};

class B3
{
public:
    B3(int i)
    {
        b3 = i;
        cout<<"Constructing B3."<<b3<<endl; }
    int getb3() { return b3; }
private:
    int b3;
};

class A : public B2, public B1
{
public:
    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
    {
        a = l;
        cout<<"Constructing A."<<a<<endl; }
    void print()
    {
        B1::print();
        B2::print();
        cout<<a<<endl;}
private:
    int a;
    B3 bb;
};

int main()
{
    A aa(1, 2, 3, 4);
    aa.print();
    return 0;
}

【输入形式】

【输出形式】
Constructing B2.2
Constructing B1.1
Constructing B3.3
Constructing A.4
1
2
4

10-2.修改下面的4个类,添加析构函数
【问题描述】
修改下面的4个类,添加析构函数,在析构函数中输出各私有数据成员的值。并分析结果。
修改后程序的输出结果为:
Constructing B2.2
Constructing B1.1
Constructing B3.3
Constructing A.4
1
2
4
Destructing A.4
Destructing B3.3
Destructing B1.1
Destructing B2.2


待修改的程序源代码如下:

#include <iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<<b1<<endl; }
    void print() { cout<<b1<<endl; }
private:
    int b1;
};

class B2
{
public:
    B2(int i)
    {
        b2 = i;
        cout<<"Constructing B2."<<b2<<endl; }
    void print() { cout<<b2<<endl;}
private:
    int b2;
};

class B3
{
public:
    B3(int i)
    {
        b3 = i;
        cout<<"Constructing B3."<<b3<<endl; }
    int getb3() { return b3; }
private:
    int b3;
};

class A : public B2, public B1
{
public:
    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
    {
        a = l;
        cout<<"Constructing A."<<a<<endl; }
    void print()
    {
        B1::print();
        B2::print();
        cout<<a<<endl;}
private:
    int a;
    B3 bb;
};

int main()
{
    A aa(1, 2, 3, 4);
    aa.print();
    return 0;
}
#include <iostream>
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<<b1<<endl;
    }
    void print()
    {
        cout<<b1<<endl;
    }
    ~B1()
    {
        cout<<"Destructing B1."<<b1<<endl;
    }
private:
    int b1;
};

class B2
{
public:
    B2(int i)
    {
        b2 = i;
        cout<<"Constructing B2."<<b2<<endl;
    }
    void print()
    {
        cout<<b2<<endl;
    }
    ~B2()
    {
        cout<<"Destructing B2."<<b2<<endl;
    }
private:
    int b2;
};


class B3
{
public:
    B3(int i)
    {
        b3 = i;
        cout<<"Constructing B3."<<b3<<endl;
    }
    int getb3()
    {
        return b3;
    }
    ~B3()
    {
        cout<<"Destructing B3."<<b3<<endl;
    }
private:
    int b3;
};

class A : public B2, public B1
{
public:
    A(int i, int j, int k, int l):B1(i), B2(j), bb(k)
    {
        a = l;
        cout<<"Constructing A."<<a<<endl;
    }
    void print()
    {
        B1::print();
        B2::print();
        cout<<a<<endl;
    }
    ~A()
    {
        cout<<"Destructing A."<<a<<endl;
    }
private:
    int a;
    B3 bb;
};

int main()
{
    A aa(1, 2, 3, 4);
    aa.print();
    return 0;
}

10-3.定义一个员工类、经理类、销售员类和销售经理类
【问题描述】
定义一个员工类Employee,有数据成员姓名,编号。定义一个销售员继承自员工类Sales,工资为销售额的提成10%,定义一个经理类Manager,固定工资8000,定义一个销售经理类,继承自销售员类和经理类,工资为固定工资5000加销售额的提成5%。每个类均有display()函数输出信息,编写主函数测试。主函数中定义一个销售经理对象,销售额为100000,输出信息。

【输入形式】
程序参考的输入(第一行为提示文字):
Input id name and sale:
M001 zhangsan 100000

【输出形式】
程序参考的输出结果如下:
ID:M001
Name:zhangsan
Salary:10000

#include <iostream>
using namespace std;
class Employee
{
public:
    Employee(string id,string name):id(id),name(name)
    {}
    void display()
    {
        cout<<"ID:"<<id<<endl;
        cout<<"Name:"<<name<<endl;
    }
protected:
    string id,name;
};

class SalesManager
{
public:
    SalesManager(string  id,string  name,float sale):id(id),name(name),sale(sale)
    {}
    void display()
    {
        cout<<"ID:"<<id<<endl;
        cout<<"Name:"<<name<<endl;
        salary=5000+sale/20;
        cout<<"Salary:"<<salary<<endl;
    }
private:
    string  id,name;
    float sale,salary;
};

int main()
{
    string id,name;
    float sale;
    cout<<"Input id name and sale:"<<endl;
    cin>>id>>name>>sale;
    if(sale<0)
    {
        cout<<"Input Error!"<<endl;
        return 0;
    }
    SalesManager sm(id,name,sale);
    sm.display();
    return 0;
}
  • 26
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象程序设计》试题 一、单选题(每空2分,共40分) 1、关于C++与C语言关系的描述中,( )是错误的。 A.C语言是C++语言的一个子集 B.C语言与C++语言是兼容的 C.C++语言对C语言进行了一些改进 D.C++语言和C语言都是面向对象的 2、已知:int m=10; 下列表示引用的方法中,( )是正确的。 A.int& x=m; B.int& y=10; C.int& z; D.float& t=&m; 3、考虑下面的函数原型声明: void DefPar(int a, int b=7, char z = '*'); 下面函数调用中,不合法的是( )。 A.DefPar(5); B.DefPar(5,8); C.DefPar(5,'#'); D.DefPar(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( )。 A.函数的返回值类型 B.参数的类型 C.函数名称 D.参数个数 5、下列有关C++类的说法中,不正确的是( )。 A.类是一种用户自定义的数据类型 B.只有类中的成员函数或类的友元函数才能存取类中的私有成员 C.在类中,如果不做特别说明,所有成员的访问权限均为私有的 D.在类中,如果不做特别说明,所有成员的访问权限均为公用的 6、已知X类,则当程序执行到语句X array[3];时,调用了( )次构造函数。 A.0 B.1 C.2 D.3 7、有关析构函数的说法,不正确的是( )。 A.析构函数有且仅有一个 B.析构函数和构造函数一样可以有形参 C.析构函数的功能是在系统释放对象之前作一些内存清理工作 D.析构函数无任何函数类型 8、类定义的内容允许被其对象无限制地存取的是( )。 A.private 部分 B. protected 部分 C.public 部分 D.以上都不对 9、关于常数据成员的说法,不正确的是( )。 A.常数据成员的定义形式与一般常变量的,只不过常数据成员的定义必须出现在类体中 B.常数据成员必须进行初始化,并且不能被更新 C.常数据成员通过构造函数的成员初始化列表进行初始化 D.常数据成员可以在定义时直接初始化 10、运用运算符delete删除一个动态对象时( )。 A.系统首先为该动态对象调用构造函数,再释放其占用的内存 B.系统首先释放该动态对象占用的内存,再为其调用构造函数 C.系统首先为该动态对象调用析构函数,再释放其占用的内存 D.系统首先释放动态对象占用的内存,再为其调用析构函数 11、可在类外用p.a的形式访问派生类对象 p的基类成员a,其中a是( )。 A.私有继承的公用成员 B.公用继承的私有成员 C.公用继承的保护成员 D.公用继承的公用成员 12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是(  )。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 13、设置虚基类的目的是( )。 A.简化程序 B.消除二义性 C.提高运行效率 D.减少目标代码 14、在C++中,用于实现动态多态性的是( )。 A.内联函数 B.重载函数 C.模板函数 D.虚函数 15、不能说明为虚函数的是( )。 A.析构函数 B.构造函数 C.类的成员函数 D.以上都不对 16、如果一个类至少有一个纯虚函数,那么就称该类为( )。 A.抽象类 B.派生类 C.纯基类 D.以上都不对 17、下面关于友元的描述中,错误的是( )。 A.友元函数可以访问该类的私有数据成员 B.一个类的友元类中的成员函数都是这个类的友元函数 C.友元可以提高程序的运行效率 D.类与类之间的友元关系可以继承 18、下列运算符中,( )运算符在C++中不能被重载。 A.&& B.[ ] C.:: D.new 19、模板的使用实际上是将类模板实例化成一个( )。 A.函数 B.对象 C.类 D.抽象类 20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为( )。 A.MyClass(MyClass x) B.MyClass&(MyClass x) C.MyClass(MyClass &x) D.MyClass(MyClass *x) 二、填空题(前16个空,每空1分,后2个空,每空2分,共20分) 1、类和对象的关系可表述为:类是对象的 ,而对象则是类的 。 2、在C++中,三种继承方式的说明符号为 、 和 ,如果不加说明,则默认的继承方式为 。 3、如果只想保留公共基类的一个复制,就必须使用关键字 把这个公共基类声明为虚基类。 4、若要把void fun( )定义为类A的友元函数,则应在类A的定义中加入语句 。 5、类的静态成员分为 和 。 6、运算符重载要求保持其原来的操作数个数、 、 和语法结构。 7、通过关键字 可以声明模板,通过关键字 指定函数模板的类型参数,有几个类型参数就有几个类型关键字。 8、列出C++中两种用户自定义的数据类型: 、 。 9、构造函数的作用是 。 10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为 。 三、阅读下面3个程序,写出程序运行时输出的结果:(共13分) 1、#include <iostream> using namespace std; void fun(int &a,int &b) { int p; p=a; a=b; b=p; } void exchange(int &a,int &b,int &c) { if(a<b) fun(a,b); if(a<c) fun(a,c); if(b<c) fun(b,c); } void main() { int a=12,b=89,c=56; exchange(a,b,c); cout<<"a="<<a<<",b="<<b<< ",c="<<c<<endl; } 2、#include <iostream> using namespace std; class Date { public: Date(int,int,int); Date(int,int); Date(int); Date(); void display(); private: int month, day, 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=2009; } Date::Date(int m) : month(m) { day=1; year=2010; } Date::Date() { month=1; day=1; year=2010; } void Date::display() { cout <<month<<"/"<<day<<"/"<<year<<endl; } void main() { Date d1(12,31,2009); Date d2(12,31); Date d3(1); Date d4; d1.display(); d2.display(); d3.display(); d4.display(); } 3、#include <iostream> using namespace std; class A { public: A() { cout<<"constructing A "<<endl; } ~A() { cout<<"destructing A "<<endl; } }; class B: public A { public: B() { cout<<"constructing B "<<endl; } ~B() { cout<<"destructing B "<<endl; } }; class C : public B { public: C() { cout<<"constructing C "<<endl; } ~C() { cout<<"destructing C "<<endl; } }; void main() { C c1; } 四、编程题(共27分) 1、(10分)已知复数类Complex的声明如下: class Complex { public: Complex(); Complex(double); Complex(double, double); friend Complex operator + (Complex&, Complex&); friend ostream & operator << (ostream&, Complex&); friend istream& operator >> (istream&, Complex&); private: double real, imag; }; 要求: (1)写出该类的所有构造函数的类外定义代码。 (2)写出对运算符“+”、“<<”、“>>”进行重载的运算符重载函数的定义。 2、(17分)下列Base类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。 class Base { public: virtual double area()=0; }; double total(Base *s[ ], int n) { double sum=0.0; for(int i=0; i<n; i++) sum+=s[i]->area( ); return sum; } 要求: (1)从Base类派生圆类(Circle)、正方形类(Square),圆类新增数据成员半径(radius),正方形类新增数据成员边长(a),圆类和正方形类都有构造函数,修改、显示数据成员值的函数,求面积函数。 (2)写出main( )函数,计算半径为5.5的圆和边长为9.9的正方形的面积和(必须通过调用total函数计算)。
### 回答1: 面向对象程序设计习题库是一个用于学习和练习面向对象程序设计的资源库。它通常包含一系列习题,每个习题都涉及到了面向对象程序设计的相关概念和技术。通过完成这些习题,学习者可以加深对面向对象程序设计的理解,并提升自己的编程能力。 在习题库中,习题通常会包括问题描述、要求和示例代码。学习者需要根据问题描述,设计和实现符合要求的面向对象程序。在解决问题的过程中,学习者需要运用面向对象程序设计的原则和方法,如封装、继承、多态等。完成习题后,学习者可以通过对比自己的解答和示例代码,进行自我评估和反思,进一步提高自己的编程水平。 面向对象程序设计习题库的好处是多方面的。首先,它提供了一个系统的学习资源,帮助学习者从理论到实践,逐步掌握面向对象程序设计的基本概念和技巧。其次,习题库的多样性和复杂性有助于学习者在实际问题中培养设计和解决问题的能力。此外,通过独立思考和解决问题的过程,学习者可以提高自己的自学和解决问题的能力,培养创造力和逻辑思维。 总之,面向对象程序设计习题库是一个有助于学习和练习面向对象程序设计的资源库。通过完成习题,学习者可以提升自己的编程水平和解决问题的能力,为未来的面向对象程序设计工作做好准备。 ### 回答2: C 面向对象程序设计习题库是一个专门用于训练和提高C语言面向对象程序设计能力的资源库。该习题库提供了大量的编程题目,旨在帮助学习者通过实践来巩固对C语言面向对象编程的理解和应用。习题库中的题目分布在不同的难度级别,从基础的面向对象概念练习到复杂的项目实践,逐渐提高学习者的编程技能。通过解答这些习题,学习者可以逐步掌握面向对象程序设计中的类、对象、继承、多态等基本概念和技巧,并能将其运用到实际项目中。 C语言是一种面向过程的编程语言,而面向对象程序设计则是一种更高级、更抽象的编程范式,可以更加灵活地设计和组织程序结构。通过习题库的训练,学习者可以在C语言中实现面向对象程序设计思想,提高代码的可读性、可维护性和可复用性。 习题库提供了丰富的案例和示例代码,学习者可以参考其中的实现方法和思路,帮助他们更好地理解和应用面向对象程序设计的思想。此外,习题库还提供了测试用例和答案解析,供学习者自测和对照,及时发现和纠正自己的错误。 总之,C面向对象程序设计习题库是一个有助于学习者提高C语言面向对象编程能力的资源库,通过解答其中的题目,学习者可以巩固对面向对象编程的理解和应用,并能够更好地运用到实际项目中。 ### 回答3: C++面向对象程序设计习题库是一种提供给学习者用于实践和巩固面向对象编程概念的资源。这种习题库包含了一系列与C++编程相关的问题和练习,旨在帮助学习者通过实践来深入了解和掌握面向对象的思想和技术。 习题库中的问题通常涉及到类、对象、继承、多态、封装等方面的概念和技术。通过完成这些问题,学习者可以巩固自己对于这些概念的理解,并且能够通过编写和调试代码来加深对于它们的应用。 C++面向对象程序设计习题库的设计通常会从简单到复杂逐渐升级,以满足不同层次学习者的需求。学习者可以根据自身的水平选择适合自己的习题,并按照要求完成相应的实验或编码练习。 通过使用这种习题库,学习者可以更加深入地理解和应用面向对象编程的思想和技术,提高自己的编程能力和解决问题的能力。同时,习题库的实践性和综合性也能够帮助学习者将抽象的理论知识转化为具体的代码实现,加深对于编程语言的理解和熟练度。 总之,C++面向对象程序设计习题库是一种非常有益的资源,它通过实践和练习帮助学习者巩固和提升自己的面向对象编程能力,是学习C++的重要辅助工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值