第8章 类与对象

第8章            类与对象
第8章            类与对象

8.1 知识要点

1.1.掌握类与对象的概念和定义方法,掌握类成员的访问属性。

2.2.掌握构造函数的概念、定义方法和使用方法。

3.3.掌握析构函数的概念、定义方法和使用方法。

4.4.掌握拷贝构造函数的概念、定义方法和使用方法。

5.5.掌握包含对象成员的类构造函数的定义方法。

6.6.掌握静态成员的概念、定义方法、作用和特点。

7.7.掌握友元的概念、定义方法、作用和特点。

8.8.掌握类模板的定义格式与使用方法。

8.2典型例题分析与解答

例题1:下列有关类的说法不正确的是()。

A.A.对象是类的一个实例

B.B.任何一个对象只能属于一个具体的类

C.C.一个类只能有一个对象

D.D.类与对象的关系和数据类型与变量的关系相似

答案:C

分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。

例题2:下面()项是对构造函数和析构函数的正确定义。

A.void X::X(), void X::~X()

B.X::X(参数), X::~X()

C.X::X(参数), X::~X(参数)

D.void X::X(参数), void X::~X(参数)

答案:B

分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。

例题3:()的功能是对象进行初始化。

A.析构函数 B. 数据成员 C.构造函数 D.静态成员函数

答案:C

分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作;

例题4:下列表达方式正确的是()。

A.class P{ B. class P{

public: public:

int x=15; int x;

void show(){cout<

}; }

C. class P{ D. class P{

int f; public:

}; int a;

f=25; void Seta (int x) {a=x;}

答案:D

分析:在类体内不可对数据成员进行初始化;类定义结束时需用分号;只有类中的成员函数才能存取类中的私有数据。

例题5:拷贝构造函数具有的下列特点中,()是错误的。

A.A.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的

B.B.拷贝构造函数只有一个参数,并且是该类对象的引用

C.C.拷贝构造函数是一种成员函数

D.D.拷贝构造函数的名字不能用类名

答案:D

分析:如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。

例题6:关于静态成员的描述中,()是错误的。

A.A.静态成员可分为静态数据成员和静态成员函数

B.B.静态数据成员定义后必须在类体内进行初始化

C.C.静态数据成员初始化不使用其构造函数

D.D.静态数据成员函数中不能直接引用非静态成员

答案:B

分析:静态成员可分为静态数据成员和静态成员函数;静态数据成员被定义后,必须对它进行初始化,初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,例如,放在主函数前面等;静态数据成员初始化与该类的构造函数和析构函数无关;在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员。

例题7:关于友元的描述中,()是错误的。

A.A.友元函数是成员函数,它被说明在类体内

B.B.友元函数可直接访问类中的私有成员

C.C.友元函数破坏封装性,使用时尽量少用

D.D.友元类中的所有成员函数都是友元函数

答案:A

分析:友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用。

例题8:设有如下程序结构:

class Box

{ … };

void main()

{Box A,B,C; }

该程序运行时调用(1) 次构造函数;调用(2) 次析构函数。

答案:(1)3 (2)3

分析:每创建一个对象自动调用一次构造函数,在这里创建了A、B、C三个对象,所以共调用了三次构造函数;每释放一个对象,系统自动调用一次析构函数,A、B、C对象释放时,分别调用析构函数,所以析构函数共调用了三次。

例题9:设A为test类的对象且赋有初值,则语句test B(A); 表示。

答案:将对象A复制给对象B。

分析:执行test B(A);语句相当于调用了默认复制构造函数,将A对象的属性复制给B对象。

例题10:利用“对象名.成员变量”形式访问的对象成员仅限于被声明为(1) 的成员;若要访问其他成员变量,需要通过(2) 函数或(3) 函数。

答案:(1) public (2) 成员函数(3)友元函数

分析:类体内的数据成员可声明为公有的、私有的和保护的,公有的数据成员可利用“对象名.成员变量”形式来进行访问;私有的数据成员能被类中的其他成员函数或友元函数所调用;保护的数据成员可以在类体中使用,也可以在派生类中使用,但不能在其他类外通过对象使用。

例题11:分析找出以下程序中的错误,说明错误原因,给出修改方案使之能正确运行。

#include

class one

{ int a1,a2;

public:

one(int x1=0, x2=0);

};

void main()

{one data(2,3);

cout<

cout<

}

分析:出错原因:构造函数参数表语法错;构造函数没有函数体;类的对象不能直接访问类的私有成员变量。

改正后的程序如下:

#include

class one

{ int a1, a2;

public:

one(int x1=0, int x2=0) {a1=x1;a2=x2;}

int geta1() { return a1; }

int geta2() { return a2; }

};

void main()

{one data(2,3);

cout<

cout<

}

例题12:分析以下程序的错误原因,给出修改方案使之能正确运行。

#include

class Amplifier{

float invol,outvol;

public:

Amplifier(float vin,float vout)

{invol=vin;outvol=vout;}

float gain();

};

Amplifier::float gain() { return outvol/invol; }

void main()

{ Amplifier amp(5.0,10.0);

cout<<"\n\nThe gain is =>"<

}

分析:成员函数在类体外定义格式是:函数返回类型类名::成员函数名(参数表);成员函数调用格式是:对象名.成员函数名(参数表)。

改正后的程序如下:

#include

class Amplifier

{ float invol,outvol;

public:

Amplifier(float vin,float vout) {invol=vin;outvol=vout;}

float gain();

};

float Amplifier::gain() { return outvol/invol; }

void main()

{ Amplifier amp(5.0,10.0);

cout<<"\n\nThe gain is =>"<

}

例题13:下列程序的运行结果是。

#include

class point

{ int x,y;

public:

point(int a,int b)

{x=a;y=b;

cout<<"calling the constructor function."<

}

point(point &p);

friend point move(point q);

~point(){cout<<"calling the destructor function.\n";}

int getx() {return x;}

int gety() {return y;}

};

point::point(point &p)

{x=p.x; y=p.y;

cout<<"calling the copy_initialization constructor function.\n";

}

point move(point q)

{cout<<"OK!\n";

int i,j;

i=q.x+10;

j=q.y+20;

point r(i,j);

return r;

}

void main()

{ point m(15,40),p(0,0);

point n(m);

p=move(n);

cout<<"p="<

}

分析:根据构造函数、拷贝构造函数和友元函数的特点,执行该程序后,输出结果是:calling the constructor function.

calling the constructor function.

calling the copy_initialization constructor function.

calling the copy_initialization constructor function.

OK!

calling the constructor function.

calling the copy_initialization constructor function.

calling the destructor function.

calling the destructor function.

calling the destructor function.

P=25,60

calling the destructor function.

calling the destructor function.

calling the destructor function.

说明:

(1)构造函数执行三次,分别初始化主函数中的对象m,p和move函数中的对象r。(2)拷贝构造函数共执行了三次。第一次,初始化对象n;第二次在调用函数move()时,实参n给形参q进行初始化;第三次是执行函数move的return r;语句时,系统用r初始化一个匿名对象时使用了拷贝构造函数。

(3)析构函数执行了六次。在退出函数move时释放对象r和q共调用二次;返回主函数后,匿名对象赋值给对象p后,释放匿名对象又调用一次析构函数;最后退出整个程序时释放对象m,n和p调用三次。

例题14:定义一个学生类,其中有3个数据成员:学号、姓名、年龄,以及若干成员函数。同时编写main函数使用这个类,实现对学生数据的赋值和输出。

程序代码如下:

#include

#include

class student

{ int no;

char name[10];

int age;

public:

student(int i, char *str, int g)

{no=i;

strcpy(name,str);

age=g;

}

student( )

{no=0;

strcpy(name,”none”);

age=-1;

}

void display()

{if (no>0) cout<<”no” <

else cout<<”no”<

}

};

void main()

{ student d1(1001,”Tom”,18);

d1.display();

student d2;

d2.display();

}

例题15:计算两点之间的距离。

方法一:可以定义点类(Point),再定义一个类(Distance)描述两点之间的距离,其数据成员为两个点类对象,两点之间距离的计算可设计由构造函数来实现。

#include

#include

class Point

{ public:

Point(int a=0, int b=0) {x=a; y=b; }

int xcord() { return x;}

int ycord (){ return y;}

private:

int x,y;

};

class Distance

{ public:

Distance(Point q1,Point q2);

double getdist() {return dist; }

private:

Point p1,p2;

double dist;

};

Distance::Distance(Point q1,Point q2):p1(q1),p2(q2)

{ double x=double(p1.xcord()-p2.xcord());

double y=double(p1.ycord()-p2.ycord());

dist=sqrt(x*x+y*y);

}

void main()

{ Point p(0,0),q(1,1);

Distance dis(p,q);

cout<<”The distance is: ”<

}

方法2:将两点之间距离函数声明为Point类的友元函数。

#include

#include

class Point

{public:

Point(int a=0, int b=0) {x=a; y=b; }

int xcord() { return x;}

int ycord (){ return y;}

private:

int x,y;

friend double Distance(Point p1,Point p2);

};

double Distance(Point p1,Point p2)

{ double dx=double(p1.x-p2.x);

double dy=double(p1.y-p2.y);

return sqrt(dx*dx+dy*dy);

}

void main()

{ Point q1(0,0),q2(1,1);

cout<<”The distance is: ”<

}

8.3教材习题分析与解答

1.选择题

(1)对类的构造函数和析构函数描述正确的是()。

A. A.构造函数可以重载,析构函数不能重载

B. B.构造函数不能重载,析构函数可以重载

C. C.构造函数可以重载,析构函数也可以重载

D. D.构造函数不能重载,析构函数也不能重载

答案:A

(2)类的析构函数的作用是( D )。

A.一般成员函数

B.类的初始化

C.对象初始化

D.删除对象

答案:D

(3)假设OneClass为一个类,则该类的拷贝初始化构造函数的声明语句为()。

A.OneClass(OneClass p);

B. OneClass& (OneClass p);

C. OneClass(OneClass & p);

D. OneClass (OneClass *p);

答案:C

(4)下面对于友元函数描述正确的是()。

A.友元函数的实现必须在类的内部定义

B.友元函数是类的成员

C.友元函数破坏了类的封装性和隐藏性

D.友元函数不能访问类的私有成员

答案:C

(5)对于结构中定义的成员,其默认的访问权限为()。

A.public

B. protected

C.private

D. static

答案:C

(6)为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为()。

A.public

B. protected

C.private

D. static

答案:A

(7)下面对静态数据成员的描述中,正确的是()。

A.静态数据成员可以在类体内进行初始化

B.静态数据成员不可以在类体内进行初始化

C.静态数据成员不能受private控制符的作用

D.静态数据成员可以直接用类名调用

答案:C

(8)下面对静态数据成员的描述中,正确的是()。

A.静态数据成员是类的所有对象共享的数据

B.类的每一个对象都有自己的静态数据成员

C.类的不同对象有不同的静态数据成员值

D.静态数据成员不能通过类的对象调用

答案:A

2.2.写出下列程序的运行结果。

(1)#include

class Point{

int x,y;

public:

Point(){x=1;y=1;}

~Point(){cout<<"Point "<

};

void main()

{Point a;}

运行结果为:

Point 1,1 is deleted.

(2) #include

#include

int count=0;

class Point

{ int x,y;

public:

Point()

{ x=1;y=1;

count++;

}

~Point() {count--;}

friend void display();

};

void display() { cout <<"There are "<

void main()

{ Point a;

display();

{ Point b[5];

display();

}

display();

}

运行结果为:

There are 1 points,

There are 6 points,

There are 1 points,

(3)#include

class Csample

{ int i;

public:

Csample( );

void Display( );

~Csample();

};

Csample::Csample( )

{ cout<<”Constructor”<<”,”;

i=0;

}

void Csample::Display() {cout<<”i=”<

{ cout<<”Destructor”<

void main( )

{ Csample a;

a.Display( );

}

运行结果为:

Constructor,i=0,Destructor

(4) #include

#include

class Csample

{ int i;

public:

Csample() {cout <<"constructor1" <

Csample(int val) {cout <<"Constructor2"<

{cout<<"i="<

~Csample()

{cout<<"Destructor"<

};

void main()

{Csample a,b(10);

a.Display();

b.Display();

}

运行结果为:

Constructor1

Constructor2

i=-858993460

i=10

Destructor

Destructor

(5)#include

class Csample

{private:

int i;

static int k;

public:

Csample( );

void Display( );

};

int Csample::k=0;

Csample::Csample( ) { i=0; k++; }

void Csample::Display( ) { cout<<”i=”<

void main( )

{ Csample a,b;

a.Display( );

b.Display( );

}

运行结果为:

i=0,k=2

i=0,k=2

3.按要求编写程序。

(1)编写一个程序,设计一个产品类Product,其定义如下:

class Product

{ char *name; //产品名称

int price; //产品单价

int quantity; //剩余产品数量

public:

product(char *n,int p int q); //构造函数

~product( ); //析构函数

void buy(int money); //购买产品

void get() const; //显示剩余产品数量

};

并用数据进行测试。

(2)计算两点之间的距离。

提示:可以定义点类(Point),再定义一个类(Distance)描述两点之间的距离,其数据成员为两个点类对象,两点之间距离的计算可设计由构造函数来实现。

参照本章例15

(3)定义盒子Box类,要求具有以下成员:可设置盒子形状;可计算盒子体积;可计算盒子的表面积。

#include

class Box

{ int x,y,z; int v,s;

public:

void init(int x1=0,int y1=0,int z1=0) {x=x1;y=y1;z=z1;}

void volue() {v=x*y*z;}

void area() {s=2*(x*y+x*z+y*z);}

void show()

{cout<<"x= "<

rectangle b(100,200);

cout<<"长方形的周长和面积为:"<

}

(6)编写一个程序,采用一个类求n!,并输出10!的值。

#include

class fac

{ int p;

public:

fac() { p=1;}

fac( int j)

{p=1;

if(j>=0)

for(int i=1 ;i<=j;i++) p=p*i;

else cout<<"数据错误\n";

}

void show() { cout<<" 阶乘为:"<

};

void main()

{ int n;

cout<<"请输入一个整数:";

cin>>n;

fac a(n);

cout<

}

(7)编写一个程序,设计一个Cdate类,它应该满足下面的条件:

1)用这样的格式输出日期:日-月-年;

2)输出在当前日期上加两天后的日期;

3)设置日期。

#include

class Cdate

{ int year,month,day;

int y1,m1,d1;

public:

void setdate(int y,int m,int d) {year=y;month=m;day=d;}

void show()

{cout<<"当前日期: "<

cout<<"两天后日期:"<

}

void datetwo() //加一天后的年月日

{ d1=day;y1=year;m1=month;

for(int i=0;i<2;i++)

{ d1++;

switch(d1)

{case 29:if(!(month==2 &&(year%400==0||year%4==0&&year%100!=0))) {m1=3;d1=1;};break;

case 30:if(month==2 &&(year%400==0||year%4==0&&year%100!=0)) {m1=3;d1=1;};break;

case 31:if(month==4||month==6||month==9||month==11)

{m1=m1+1;d1=1;};break;

case 32: m1=m1+1;d1=1;if(month==12){y1=y1+1;m1=1;};break;

}

}

}

};

void main()

{ Cdate d;

int y,m,d1;

cout<<"请输入年月日: ";

cin>>y>>m>>d1;

d.setdate(y,m,d1);//加一天

d.setdate(y,m,d1);//再加一天

d.datetwo();

d.show();

}

8.4 补充习题

1.选择题

(1) 下列有关类的说法不正确的是。

A.类是一种用户自定义的数据类型

B.只有类中的成员函数或类的友元函数才能存取类中的私有数据

C.在类中(用class定义),如果不作特别说明,所有的数据均为私有数据

D.在类中(用class定义),如果不作特别说明,所有的成员函数均为公有数据

(2) 以下有关析构函数的叙述不正确的是( )

A. 在一个类只能定义一个析构函数

B. 析构函数和构造函数一样可以有形参

C. 析构函数不允许用返回值

D. 析构函数名前必须冠有符号“~”

(3) 以下有关类与结构体的叙述不正确的是( )

A. 结构体中只包含数据;类中封装了数据和操作

B. 结构体的成员对外界通常是开放的;类的成员可以被隐藏

C. 用struct不能声明一个类型名;而class可以声明一个类名

D. 结构体成员默认为public;类成员默认为private

(4) 以下叙述中不正确的是( )

A. 一个类的所有对象都有各自的数据成员,它们共享函数成员

B. 一个类中可以有多个同名的成员函数

C. 一个类中可以有多个构造函数、多个析构函数

D. 在一个类中可以声明另一个类的对象作为它的数据成员

(5) 以下不属于构造函数特征的是( )

A. 构造函数名与类名相同

B. 构造函数可以重载

C. 构造函数可以设置默认参数

D. 构造函数必须指定函数类型

(6) 以下有关类和对象的叙述不正确的是( )

A. 任何一个对象都归属于一个具体的类

B. 类与对象的关系和数据类型与变量的关系相似

C. 类的数据成员不允许是另一个类的对象

D. 一个类可以被实例化成多个对象

(7) 设有定义:

class person

{ int num;

char name[10];

public:

void init(int n, char *m);

...

};

person std[30];

则以下叙述不正确的是( )

A. std是一个含有30个元素的对象数组

B. std数组中的每一个元素都是person类的对象

C. std数组中的每一个元素都有自己的私有变量num和name

D. std数组中的每一个元素都有各自的成员函数init

(8) 设有以下类的定义:

class Ex

{ int x;

public:

void setx(int t=0);

};

若在类外定义成员函数setx(),以下定义形式中正确的是( )

A. void setx(int t) { ... }

B. void Ex::setx(int t) { ... }

C. Ex::void setx(int t) { ... }

D. void Ex::setx(){ ... }

(9) 以下关于静态成员变量的叙述不正确的是()

A.静态成员变量为类的所有对象所公有

B.静态成员变量可以在类内任何位置上声明

C.静态成员变量的赋初值必须放在类外

D.定义静态成员变量时必须赋初值

(10) 定义静态成员函数的主要目的是()

A.方便调用B.有利于数据隐藏

C.处理类的静态成员变量D.便于继承

(11) 以下叙述不正确的是()

使用静态数据成员:

A.可以节省内存空间B.是为了解决数据共享问题

C.可以直接用类名来引用 D.可以提高序运算速度

2.填空题

(1) OOP技术由、、方法、消息和继承五个基本的概念所组成。

(2)(2)类的成员函数可以在定义,也可以在定义。

(3)(3)类test的析构函数名是。

(4)(4)类是用户定义的类型,具有类类型的变量称作_______________。

(5)(5)一个类的析构函数不允许有。

(6)(6)建立对象时,为节省内存,系统只给_______分配内存。

(7)(7)用于定义C++的类的关键字有____________、___________和union。

(8)(8)类test的构造函数是和_______同名的函数,析构函数是__________。

(9)(9)类中的数据和成员函数默认访问类型为。

(10)(10)当建立一个新对象时,程序自动调用_______________。

3. 改错题

(1) 下面的程序定义了一个Point类,找出程序中的错误语句并改正。

#include

class Point{

int x;

public:

void Point(int a)

{x=a;}

int Getx(){return x;}

void Show()

{cout<

} ;

void main()

{Point A(76);

cout<

}

(2) 根据静态成员的特点,指出下列程序的错误。

#include

#include

class part

{ public:

Part(char *pname=”no name”)

{ strncpy(name,pname);

noofpart++;

no=noofpart;

cout<<”create the no: ”<

}

~Part()

{ noofpart--;

cout<<”destroy the no: ”<

}

static int number() { return no; }

protected:

static int noofpart=0;

int no;

char name[40];

};

void main()

{ Part p1;

Part p2;

}

(3) 以下程序的功能是:利用友员函数为类的成员变量进行初始化,然后利用成员函数输出。请改正程序中的错误,使之能正确运行。

#include

class A

{ int a,b;

public:

friend void setval(int i,int j);

void showA()

{cout<

};

void setval(int i,int j)

{a=i; b=j;}

void main()

{A obj1;

setval(2,3);

obj1.showA();

}

4. 看程序写结果

(1) #include

class test

{ public:

test();

test(int);

~test();

void display();

protected:

int n;

};

test::test() {cout<<”Constructing normally\n”;}

test::test(int num)

{n=num;

cout<<”Constructing with a number: ”<

}

void test::display() {cout<<”Display a number: ”<

test::~test(){cout<<”Destructing”<

void main()

{ test obj1;

test obj2(59);

obj1.display();

obj2.display();

}

(2) #include

class Count

{ public:

Count() { count++;}

static int getn() {return count;}

~Count() { count--; }

private:

static int count;

};

int Count::count=100;

void main()

{ Count c1,c2,c3,c4;

cout<

}

(3) #include

class myclass

{ int a,b;

public:

void init(int i, int j)

{a=i; b=j;}

friend int sum(myclass x);

};

int sum( myclass x)

{return x.a+x.b; }

void main()

{myclass y;

y.init(15,20);

cout<

}

5. 编程题

(1)(1)某商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记下目前库存货物的总量,要求把商店货物购进和卖出的情况模拟出来。

(2)(2)定义一个Car类和Truck类,用友元实现两类对象行使速度的快慢比较。

c++面向对象课后答案第8章

1.1在C++中,三种派生方式的说明符号为public、private、protected不加说明,则默认的派生方式为private。 1.2当公有派生时,基类的公有成员成为派生类的公有成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。当保护派生时,基类的公有成员成为派生类的保护成员;保护成员成为派生类的保护成员;私有成员成为派生类的不能直接访问成员。 1.3 派生类的构造函数一般有3项工作要完成:首先基类初始化,其次成员对象初始化,最后执行派生类构造函数体。 1.4多继承时,多个基类中的同名的成员在派生类中由于标识符不唯一而出现二义性。在派生类中采用虚基类或作用域分辨符来消除该问题。 2.简答题 2.1 派生类如何实现对基类私有成员的访问? 2.2什么是类型兼容规则? 2.3派生类的构造函数是怎样的执行顺序,析构函数的执行顺序是如何实现的? 2.4继承与组合之间的区别与联系是什么? 2.5什么是虚基类?它有什么作用?含有虚基类的派生类的构造函数有什么要求,什么是最远派生类,建立一个含有虚基类的派生类的对象时,为什么由最远派生类的构造函数负责虚基类的初始化? 3.选择题 3.1下面对派生类的描述中,错误的是(D )。 A.一个派生类可以作为另外一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员外,还包含了它的基类的成员 D.派生类中继承的基类成员的访问权限到派生类中保持不变 3.2下列对友元关系叙述正确的是(A)。 A.不能继承 B.是类与类的关系 C.是一个类的成员函数与另一个类的关系 D.提高程序的运行效率 3.3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。 A.任何成员B.公有成员和保护成员 C.公有成员和私有成员D.私有成员 3.4设置虚基类的目的是(B)。 A.简化程序B.消除二义性 C.提高运行效率D.减少目标代码 3.5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( C )。 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 3.6有如下类定义:

第八章 类与对象

第八章类与对象 【学习目标】 本章主要介绍类类型的定义、构造函数与析构函数的定义与作用、友元函数与友元类的声明与作用、派生类的定义与作用、虚函数和多态性的概念、静态数据成员的声明与定义、模板类的定义与实例化等内容。通过本章的学习,要求同学们: 掌握类的概念,类类型的定义格式,类与结构的关系,类与操作符重载,类的成员属性,类的封装性,类的继承性,构造函数和析构函数的作用,this指针的含义,类对象的定义,友元函数与友元类的作用;了解inline成员函数,静态数据成员,类的多态性与虚函数,类模板等内容。 类:是对具有共同属性和行为的一类事物的抽象描述,共同属性被描述为类中的数据成员,共同行为被描述为成员函数。类所描述的事物具有共同的属性和行为(操作),但每一个具体事物(又称为个体,实例或对象)都具有属于自己的属性值和行为特征。 人的共同属性有姓名,性别,出生日期等等。人的共同行为有爱好,工作,学习等等。 同结构与联合一样,类是一种自定义类型,它包括定义数据成员和定义函数成员(又称成员函数),用数据成员来描述同类事物的属性,用成员函数来描述它们的行为。 类定义变量以及访问数据成员与函数成员与结构类型相同。 一、类的定义 1.类的定义格式: clsaa类名{成员表}; 其中: 类名:为自定义的类的名称,可用来定义变量,函数的数据类型。 成员表:为类包含的数据成员和函数成员。 每一个成员都具有一定的存取权限,或者称存取属性,访问权限,访问属性。C++有三个指明符: public:公用(公有,公共)访问属性,成员可以任意函数所访问。 private:私有访问属性,成员只能为该类的成员函数所访问。 protected:保护访问属性,成员只能为该类成员函数以及该类的派生类中的成员函数访问。 类中的数据成员一般定义为私有,这样只允许该类的成员函数访问,不允许该类以外的任何函数访问,从而使类对象中的数据得到隐藏和保护。 类与结构在定义时的区别: 结构类型定义时在第一个存取指明符前定义的成员具有默认的public访问属性,类在定义时为private访问属性。 2.定义格式举例:

第八章和第九章练习题

一、填空题 1. 税收的“三性”是指税收的 、 和 。 2. 在现代社会,国家的征税收对象主要包括 、 和 三大类,国家的税制也是以对应于这三类课税对象的 、 和 为主体。 3. 累进税率因计算方法的不同,又分为 和 两种。 4. 起征点和免征额的不同点在于,当课税对象大于起征点和免征额时,采用 制度的要对课税对象的全部数额征税,采用 制度的仅对课税对象超过免征额部分征税。 5. 我国税种一般分为所得课税、商品课税、 、 和财产课税五大类。 6. 现代社会,直接税和间接税的划分方法随着税收理论的发展而进一步完善,最终以 为标准。 7. 一般来说,增值税的计税依据是 商商品品和和劳劳务务价价款款中中的的增增值值额额 。 8. 所得课税是对所有以 对象的税种的总称。 9. 我国1994年税制改革时确定的个人所得税法采取 分分项项定定率率 分分项项扣扣除除 分分项项征征收收 、 、 的模式。 答答案案:: 11.. 强强制制性性 无无偿偿性性 固固定定性性 22.. 所所得得 商商品品 财财产产 所所得得税税 商商品品税税 财财产产税税 33.. 全全额额累累进进税税率率 超超额额累累进进税税率率 44.. 起起征征点点 免免征征额额 55.. 资资源源课课税税 行行为为课课税税 66.. 税税负负能能否否转转嫁嫁 77商商品品和和劳劳务务价价款款中中的的增增值值额额 88所所得得额额为为课课税税 99分分项项定定率率 分分项项扣扣除除 分分项项征征收收 二、判断题 1. 税收的强制性、无偿性和固定性是税收区别于其他财政收入的形式特征。 2. 税收的强制性体现了政治权力凌驾于所有权之上,即私有财产并非神圣不可侵犯。 3. 从2003年9月1日起,北京市的个人所得税起征点由1000元提高到现在的1200元。 4. 我国1994年税制改革后的增值税是一项完全的价外税。 5. 税负转嫁的前转方式是指向生产的前一环节转嫁,即通过压低进价等方式转嫁给上游厂家。 6.计税依据中不准许抵扣任何购进固定资产价款,就国民经济整体而言,计税依据相当于国民生产总值的增值税,称为生产型增值税。 7.只准许抵扣当期应计入产品成本的折旧部分,就国民经济整体而言,计税依据相当于国民收入的增值税,称为消费型增值税。 8.消费税实行价外征收的办法。 9.从价定率的办法是指根据商品销售价格和税法规定的税率计算征税。

第八章 类和对象 复习题知识讲解

第八章类和对象 复习题

第八章类和对象复习题 1.系统为每个类提供一个this指针,在类的成员函数内,通过this指针可以 间接访问这个类的( ) 所有成员 C.友元类的public成员 D.所有派生类中的public成员 2.如果在class类的定义中既不指定private,也不指定public,则系统就默认为( ) A. private B. public C. protected D. 不确定 3. 对静态数据成员的描述, 正确的是( ) A. 静态数据成员可以在类体内进行初始化 B. 静态数据成员不可以被类的对象调用 C. 静态数据成员不能受private控制符的作用 D. 静态数据成员可以直接用类名调用 4. 下面叙述错误的是( ) A. 基类的protected成员在派生类中仍然是protected的 B. 基类的protected成员在public派生类中仍然是protected的 C. 基类的protected成员在private派生类中是private的 D. 基类的protected成员不能被派生类的对象访问 5.对于友元函数的描述,正确的是( ) A. 友元函数的实现必须在类的内部定义

B. 友元函数是类的成员函数 C. 友元函数破坏了类的封装性和隐藏性 D. 友元函数不能访问类的私有成员 6.关于内联函数的描述,正确的是( ) A.使用内联函数可以缩短程序代码,减少占用的内存空间 B.使用内联函数可以减少函数调用时入栈和出栈的时间和空间开销,但是会使程序的代码量增加 C.内联函数只能在类的内部进行声明和定义,不能作为全局函数 D.内联函数可以做虚函数 7. 类是对象的( ) A. 具体 B. 抽象 C. 封装 D. 多态 8. struct声明类时,若不作private或public声明,系统默认为( ) A. private B. public C. protected D. 不能确定 9.引入内联函数的主要目的是( ) A.缩短程序代码,少占用内存空间 B.既可以保证程序的可读性,又能提高程序的运行效率 C.占用内存空间少,执行速度快 D.使程序的结构比较清晰 10. 类的具体表现是通过定义来操作的。对象 11.说法错误的是() A.一个类是由一批数据以及对其操作的函数组成

第八章第二节调查研究的类型和方法

第二节调查研究的类型和方法 教学目标: 知识目标:了解调查研究中常见的调查方式与国外流行的几种方式。 能力目标:熟练掌握调查研究中常用的调查方法。 德育目标:培养实事求是、严谨务实工作态度和坚忍不拔的毅力。 教学重点:几种常用的调查方法。 教学难点:几种常见的调查方式。 教学方法:列举法、示范教学法。 教具安排:调查表格。 课时安排:2课时 教学过程: 第一课时 【导入新课】 上一节我们介绍了调查研究对秘书人员的重要性,但是仅有正确的认识和工作热情还 是不够的,还必须掌握一些调查研究的类型和方法,才能提高调查研究的效率。 (板书:第二节调查研究的类型和方法) 【讲授新课】 (板书:一、调查研究的方法) 秘书人员根据调查任务和对象的实际情况,采用科学的调查方式和方法,才能保证调 查研究的客观性和科学性。那么,调查研究中有哪几种类型呢? [明确]一般说来,调查研究的类型大体可分为两类,一类是普遍调查,一类是非普遍调查。普遍调查主要用于对调查对象进行全面调查,,用人多,时间长,费用大,如人口普查等。秘书部门一般不采用这种方法,而多采用在一定范围内,选取部分调查对象进行的非全面调查方法。具体可分为: 1.典型调查法 即在被调查对象总体范围内选择具有代表性的特定对象进行调查。优点是调查范围小, 耗时少,调研较有深度;不足是缺乏量的积累,典型的选择容易受调查者主观意志左右,难免带有一定的主观随意性,因此,结论的普遍性意义还有待进一步的完善。要做好典型

调查,就必须正确选择典型,保证典型具有真实性和客观性;对复杂的事物,必须多层次、多类型地选择典型,使被选择事物具有更大的代表性。 2.重点调查法 即从调查对象中就某一专门项目,选取起主要或决定作用的对象进行调查。优点是调 查的对象集中,人力、物力花费不大,材料却能反映对全局有决定性影响的情况,因而秘书部门的调研常用这种方法。 重点调查与典型调查都属小范围的调查,但两者又有所区别: (1)选择调查对象的标准不同。典型调查的对象是具有代表性的特定对象;重点调查 的对象则是同类中具有集中性的对象。 (2)调查的主要目的不同。典型调查主要是为定性决策服务的,是要找出事物本质及 其发展规律;重点调查则是为定量分析服务的,即对对象的总体数量状况做基本的估计。 3.抽样调查法 即从调查对象的总体范围内,随机抽取一部分样本,通过对样本的调查和统计,推断 对象总体的性质与状态。抽样调查是一种普遍调查与典型调查相结合的形式,随机抽样时,总体中的每一单个对象都有同等可能被抽中的机会。因此,它的优点是:调查的结果比较公正客观;通过数学方法计算,便于对调查总体作定量分析。不足之处是不宜于作定性性调查;调查对象的范围不太明确时,抽样调查的意义也就不大了。 4.综合调查法 即对调查对象运用多学科知识进行的多角度的调查。其目的是在于掌握事物全局和各 个部分的联系。宏观的调查,如领导机关要制定发展规划,常采用这种方法。 二、调查研究中常见的调查方式 1.个别调查 即通过对被调查者个别交谈来了解情况。这种调查方式简便易行,并可能发现一些用 其他公开的方式难以获取的材料。采用这种方式要注意: (1)选好调查对象。通过事前了解,选择能提供所需材料的知情人。 (2)注意方式方法。要做好谈话对象的思想工作,使其消除各种思想顾虑,提供真实 材料。要尊重对方,防止审讯式的讯问。 个别调查常用于提供线索、探讨问题,所得的材料通常只作参考,数据性资料必须核 实后才可使用。 2.开调查会 即召集多个访谈对象、深入地探讨要调查的问题。采用这种方式,访谈对象相对集中, 访谈的内容因相互启发而得到补充和深入。访谈者需要注意的是: (1)开调查会前,要确定好参加的人数,参加者应是真正了解情况并敢于讲真话的人。(2)要事先通知,让与会者明确调查的内容和目的,以便有所准备。 (3)调查者要做好各项准备工作,熟练地掌握和运用各种访问技巧,并有效地控制整 个访谈过程。 第二课时 (继续讲授新课)

第8章 类与对象

8.1 知识要点 1.1.掌握类与对象的概念和定义方法,掌握类成员的访问属性。 2.2.掌握构造函数的概念、定义方法和使用方法。 3.3.掌握析构函数的概念、定义方法和使用方法。 4.4.掌握拷贝构造函数的概念、定义方法和使用方法。 5.5.掌握包含对象成员的类构造函数的定义方法。 6.6.掌握静态成员的概念、定义方法、作用和特点。 7.7.掌握友元的概念、定义方法、作用和特点。 8.8.掌握类模板的定义格式与使用方法。 8.2典型例题分析与解答 例题1:下列有关类的说法不正确的是()。 A.A.对象是类的一个实例 B.B.任何一个对象只能属于一个具体的类 C.C.一个类只能有一个对象 D.D.类与对象的关系和数据类型与变量的关系相似 答案:C 分析:对象是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。 例题2:下面()项是对构造函数和析构函数的正确定义。 A.void X::X(), void X::~X() B.X::X(参数), X::~X() C.X::X(参数), X::~X(参数) D.void X::X(参数), void X::~X(参数) 答案:B 分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。 例题3:()的功能是对象进行初始化。 A.析构函数 B. 数据成员 C.构造函数 D.静态成员函数 答案:C 分析:当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作; 例题4:下列表达方式正确的是()。 A.class P{ B. class P{ public: public: int x=15; int x; void show(){cout<

第八章类和对象复习题.doc

第八章类和对象复习题 1 ?系统为每个类提供一个this 指针,在类的成员函数内,通过this 指针可以间 接 访问这个类的( ) C ?友元类的public 成员 D.所有派生类中的public 成员 2. 如果在class 类的定义中既不指定private,也不指定public,则系统就默认 为( ) A. private B. public C. protected D.不确定 3. 对静态数据成员的描述,正确的是( ) A. 静态数据成员可以在类体内进行初始化 B. 静态数据成员不可以被类的对象调用 C. 静态数据成员不能受private 控制符的作用 D. 静态数据成员可以直接用类名调用 4. 下面叙述错误的是( ) A. 基类的protected 成员在派生类中仍然是protected 的 B. 基类的protected 成员在public 派生类中仍然是protected 的 C. 基类的protected 成员在private 派生类中是private 的 D. 基类的protected 成员不能被派生类的对象访问 5?对于友元函数的描述,正确的是( ) A. 友元函数的实现必须在类的内部定义 B. 友元函数是类的成员函数 C. 友元函数破坏了类的封装性和隐藏性 D. 友元函数不能访问类的私有成员 6?关于内联函数的描述,正确的是( ) A ?使用内联函数可以缩短程序代码,减少占用的内存空间 B ?使用内联函数可以减少函数调用时入栈和出栈的时间和空间开销,但是会使 程序的代码量增加 C ?内联函数只能在类的内部进行声明和定义,不能作为全局函数 D ?内联函数可以做虚函数 7.类是对象的( ) B.所有成员

第八章 类和对象 复习题

第八章类和对象复习题 1.系统为每个类提供一个this指针,在类的成员函数内,通过this指针可以间 接访问这个类的( ) A.在public段中声明的友元 B.所有成员 C.友元类的public成员 D.所有派生类中的public成员2.如果在class类的定义中既不指定private,也不指定public,则系统就默认为( ) A. private B. public C. protected D. 不确定 3. 对静态数据成员的描述, 正确的是( ) A. 静态数据成员可以在类体内进行初始化 B. 静态数据成员不可以被类的对象调用 C. 静态数据成员不能受private控制符的作用 D. 静态数据成员可以直接用类名调用 4. 下面叙述错误的是( ) A. 基类的protected成员在派生类中仍然是protected的 B. 基类的protected成员在public派生类中仍然是protected的 C. 基类的protected成员在private派生类中是private的 D. 基类的protected成员不能被派生类的对象访问 5.对于友元函数的描述,正确的是( ) A. 友元函数的实现必须在类的内部定义 B. 友元函数是类的成员函数 C. 友元函数破坏了类的封装性和隐藏性 D. 友元函数不能访问类的私有成员 6.关于内联函数的描述,正确的是( ) A.使用内联函数可以缩短程序代码,减少占用的内存空间 B.使用内联函数可以减少函数调用时入栈和出栈的时间和空间开销,但是会使程序的代码量增加 C.内联函数只能在类的内部进行声明和定义,不能作为全局函数 D.内联函数可以做虚函数 7. 类是对象的( ) A. 具体 B. 抽象

基于对象的程序设计——第八章基于类和对象的特性

基于对象的程序设计——第八章基于类和对象的特性 2015年4月28日星期二 13:45 8.1 面向对象程序设计方法概述 面向对象的程序设计方法的一个重要特点就是“封装性”(Encapsulation),所谓“封装”,指两方面的含义:一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相互独立,互不干扰。而是将对象中某些部分对外隐藏,即隐藏其内部细节,只留下少量节后,以便与外界进行联系,接受外界的消息。这种对外隐藏的方法称为信息隐蔽(information hiding).信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。 8.2类的声明和对象的定义 类是抽象的,不占用内存,而对象时具体的,占用存储空间。 如果在类的定义中既不指定private,也不指定public ,则系统默认为是私有的。 8.3类的成员函数 8.3.2 在类外定义成员函数 “::”是作用域限定符(field qualifier)或称为作用域运算符。例如:void Student :: display(){} 如果在作用域运算符::的前面没有类名,或者作用域前面既无类名又无作用域运算符::,如 :: display() 或display(),则表示display不属于任何类,这个函数不是成员函数,而是全局函数。 类函数必须先在类体中做原型声明,然后再类外定义,也就是说类体的位置应该在函数之前,否则编译时会报错。 8.3.3内置成员函数 C++要求对一般的内置函数用关键字inline声明,但对类内定义的成员函数可以省略inline,因为这些成员函数已被隐含地指定为内置函数。 如果成员不在类体内定义,而在类体外定义,系统并不把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想把这些成员函数指定为内置函数,应当用inline作显式声明。 类内声明时或函数类外实现时作inline 声明均可(二者有其一即可)。但是如果类体外定义inline函数,则必须将类定义和成员函数的定义放在同一个头文件中,否则无法进行置换。 8.3.4 成员函数的存储方式 同一个类的不同对象的数据成员的值一般是不相同的,而不同对象的函数代码是相同的,不论调用哪一个对象的函数的代码,其实调用的都是同样的内容的代码。因此,每个对象所占用的存储空间的只是该对象那个数据成员所占用的存储空间,而不包括函数代码所占用的存储空间。 需要说明: (1)不论成员函数在类内定义还是在类外定义,成员函数的代码段的存储方式是相对的,都不占用对象的存储空间。 (2)不论是否用inline声明,成员函数的代码段都不占用对象的存储空间。Inline 只影响程序的执行效率,而与成员函数是否占用对象的存储空间无关。 (3)银行保险箱的例子,虽然成员函数并没有放在对象的存储空间中,但从逻辑的角度,成员函数和数据一起封装在一个对象中的,只允许本对象成员的函数访问同一对象中的数据、 8.4 对象成员的引用 8.4.1 通过对象名和成员运算符访问对象中的成员 ①对象名.成员名

第八章 面向对象程序设计

第八章面向对象程序设计 一、选择题 1、面向对象程序设计采用了以为中心的软件构造方法。 A)数据结构B)数据流C)功能分析D)算法 2、下面关于属性、方法和事件的叙述中,错误的是______。 A)属性用于描述对象的状态,方法用于表示对象的行为 B)基于同一个类产生的两个对象可以分别设置自己的属性值 C)事件代码也可以像方法一样被显示调用 D)在新建一个表单时,可以添加新的属性、方法和事件 3、在下面关于面向对象数据库的叙述中,错误的是______。 A)每个对象在系统中都有唯一的对象标识 B)事件作用于对象,对象识别事件并作出相应反应 C)一个子类能够继承其所有父类的属性和方法 D)一个父类包括其所有子类的属性和方法 4、每个对象都可以对一个被称为事件的动作进行识别和响应。下面对于事件的 描述中,_____是错误的。 A)事件是一种预先定义好的特定的动作,由用户或系统激活 B)VFP基类的事件集合是由系统预先定义好的,是唯一的 C)VFP基类的事件也可以由用户创建 D)可以激活事件的用户动作有按键、单击鼠标、移动鼠标等 5、_____是面向对象程序设计中程序运行的最基本实体。 A)对象B)类C)方法D)函数

6、创建类时首先要定义类的。 A)名称B)属性C)事件D)方法 7、有关窗口的操作,是正确的。 A) deactivate window命令挂起的窗口将从内存中清除 B) show window命令显示的窗口不一定是活动窗口,但活动窗口一定是显示 窗口 C) hide window命令将活动窗口在屏幕上隐藏起来,输出仍然面向该窗口 D)用release window删除的窗口还可以再重新显示或激活 8、有关窗口的叙述,是正确的。 A) ACTIV A TE WINDOW 命令激活窗口后,@…SA Y的 坐标是相对屏幕的物理坐标 B)当多次使用激活窗口命令时,则最后一个被激活的窗口是当前窗口 C)当前窗口是无法改变的 D)窗口休眠后第一个激活的窗口变为当前窗口 9、以下属于窗口类控件的是。 A)Text B) Form C) Lable D) CommandButton 10、以下属于非容器类控件的是。 A) Form B) Lable C) Page D) Container 11、以下属于容器类控件的是______。 A) Text B) Form C) Label D) CommandButton 12、面向对象的程序设计是近年来程序设计方法的主流方式,简称OOP。下面 这些对于OOP的描述错误的是。

相关主题
相关文档
最新文档