2.1 类和对象 (第二章 C++面向对象程序设计)

  • 格式:doc
  • 大小:112.00 KB
  • 文档页数:16

1. 什么是类?类的定义格式?类的成员一般分为哪两部分?它们的区别如何?答:类是C++语言的数据抽象和封装机制,它描述了一组具有相同属性(数据成员)和行为特征(成员函数)的对象。

类的定义格式如下:Class 类名{private://私有数据成员和成员函数public://共有数据成员和成员函数protected://受保护的数据成员和成员函数};类的成员分为数据成员和成员函数两部分。

数据成员定义了该类对象的属性,不同对象的属性值可以不同;成员函数定义了该类对象的操作即行为。

2. 类与结构体有什么区别?答:c语言中的结构体只有数据成员,无函数成员。

C++语言中的结构可有数据成员和成员函数。

在默认情况下,结构体中的数据成员和成员函数都是共有的,而在类中可以是私有的。

从外部可以随意修改结构体变量中的数据,对数据的这种操作时很不安全的,程序员不能通过结构体对数据进行保护和控制;在结构体中,数据和其相应的操作是分离的,使得程序的复杂性难以控制,而且程序的可重用性不好,严重影响了软件的生产效率。

3. 什么是对象?如何定义一个对象?对象的成员如何表示?答:对象是类的实例,是属性和服务的封装体。

对象的定义有两种方法:方法一:在定义类的同时直接定义。

class 类名{private://public://}对象1,对象2;方法二:在使用时定义对象。

类名对象1,对象2;对象的成员的表示有:(1)通过对象调用成员。

格式:对象名.公有成员其中,“.“成为对象的选择符,简称点运算符。

(2)通过指向对象的指针调用成员。

格式:指向对象的指针->成员(3)通过对象的引用调用成员。

格式:对象的引用.成员4. 什么是构造函数?构造函数有哪些特点?答:构造函数就是与类名有相同名称的成员函数,它可自动进行对象的初始化。

特点:它没有返回值说明;它不能被继承;它可以有默认实参;它不可以是虚(virtual)的;不可以对它取地址;不能用常规调用方法调用构造函数;当定义对象时,编译程序自动调用构造函数。

5. 什么是析构函数?析构函数有哪些特点?答:析构函数的作用是当对象生命期结束后,收回对象占用的资源。

析构函数的特点是:1) 析构函数名是在类名前加以符号“~”。

2) 析构函数没有参数、返回类型和修饰符。

3) 一个类中至多有一个析构函数,如果程序员没有定义析构函数,那么系统会自动地加入一个析构函数。

4) 不能显式地调用析构函数,而是由系统自动调用。

6. 什么是默认构造函数和默认析构函数?答:若用户未显式定义一个类的构造函数,则C++语言提供一个默认的构造函数,也叫默认构造函数。

同样,如果一个类没有显式的定义类的析构函数,则编译器将合成一个,也就是默认的析构函数。

7. 什么是复制构造函数?它的功能和特点是什么?答:复制构造函数是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构件及初始化。

复制构造函数的功能是用一个已有的对象来初始化一个被创建的同类对象,是一种特殊的构造函数,具有一般构造函数的所有特性,它的特殊功能是将参数代表的对象逐域拷贝到新创建的对象中。

在C++中,下面三种对象需要拷贝的情况。

因此,复制构造函数将会被调用。

1) 一个对象以值传递的方式传入函数体2) 一个对象以值传递的方式从函数返回3) 一个对象需要通过另外一个对象进行初始化8. 什么是静态成员?静态成员的作用是什么?答:在c++类中声明成员时加上static关键字,这样声明的成员就叫做静态成员。

静态成员可以看成是全局函数,不管类创建了多少个对象,其静态成员只有一个副本,此副本被这个类的所有对象共享9. 如何对对象进行初始化?答:对象的初始化是指对象数据成员的初始化,可以使用构造函数对对象进行初始化。

10. 什么是友元?它的作用有哪些?什么是友元函数和友元关系?答:遵循一定的规则而使对象以外的软件系统能够不经过消息传递方式而直接访问对象内封装的数据成员的技术方法就是友元。

友元函数是一种说明在类定义体内的非成员函数。

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

11. 什么是this指针?它有何作用?答:当一个成员函数被调用时,c++语言自动向它传递一个隐含的参数,该参数是一个向接受该函数调用的对象的指针,称该指针为this指针。

作用:一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。

this 作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。

也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

12. 什么是类的作用域?对象的生存期有何不同?答:类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分。

全局对像的生存期是和程序一样的。

局部对象它的生存期是在它所在的代码块内(即用{ }括起来的空间内)。

13. 分析下列程序的运行结果。

程序1:#include<iostream.h>#include<math.h>class CCounter{public:void SetValue(double v) { m_value=v; } double GetValue(void);int GetNum(void);private:double m_value;};double CCounter::GetValue(void){ return sin(10.0*m_value): }int CCounter::GetNum(void){ return int(m_value); }void main(){CCounter sam;sam.SetValue(50.0);cout<<”The value is:”<<sam.GetValue()<<endl;cout<<”The num is:”<<sam.GetNum()<<e ndl;}运行结果:The value is:-0.467772The num is:50程序2:#include<iostream.h>#include<string.h>class person{int age;char name[10];public:void init(int i,char *str){ age=i; strcpy(name,str); }void display(){ cout<<name<<” is ”<<age<<” years old.\n”; } };void main(){person demo;demo.init(30,”LiMing”);demo.display();}运行结果:LiMing is 30 years odl.程序3:#include<iostream.h>#include<string.h>class person{ int age;char*name;public:void init(int i,char *str){ int j;j=strlen(str)+1;name=new char[j];strcpy(name,str);age=i;}~person(){ delete name;cout<<”destructor is called.\n”;}void display(){ cout<<name<<”is”<<age<<”years old.\n”; } };void main(){ person demo;demo.init(30,”LiMing”);demo.display();}运行结果:LiMing is 30 years old.destructor is called.程序4:#include<iostream.h>class CSam{public:static int m;CSam() {m++;}CSam(int n) {m=n;}static void testm() {m++;}};int CSam::m=0;void main(){CSam A;CSam B(3);A.testm();CSam::testm();cout<<”m=”<<B.m<<endl;}运行结果:m=514、定义一个描述学生基本情况的类,数据成员包括姓名、学号、C++、英语和数学成绩,成员函数包括输出数据、置姓名和学号、置3门课的成绩,求出总成绩和平均成绩。

#include <iostream>#include <string>using namespace std;class Student {public:Student(string nm="",string nmb="00"):cpp(0), english(0), math(0) { }void set_name_number(string na, string nmb){name = na;number = nmb;}void set_grade(int _cpp, int eng, int ma){cpp = _cpp;english = eng;math = ma;}void sum(){cout << "sum is " << cpp + english + math << "\n";}void average(){cout << "average is " << (cpp+english+math)/3 << "\n"; }void display(){cout << name << "\t"<< number << "\t"<< cpp << "\t"<< english << "\t"<< math << endl;}private:string name;string number;int cpp;int english;int math;};void main(){a.set_name_number("liMing","01");a.set_grade(53.4, 45.2, 34.6);a.sum();a.average();a.display();}15、设有一个描述坐标点的CPoint类,其私有变量x和y代表一个点的x、y坐标值。