类是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象时,类被用做样板,对象称为类的实例。
类定义的一般形式是什么?其成员有哪几种访问权限? 定义类一般形式为: class类名{ public:<公有数据和函数> protected:<保护数据和函数> private:<私有数据和函数> }; 12345访问权限共有3种:
公有(public)、保护(protected)和私有(private)。 1 类的实例化是指创建类的对象还是定义类?指创建类的对象。
什么是this指针?它的主要作用是什么?this指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。
什么叫做拷贝构造函数?拷贝构造函数何时被调用?拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。 在以下3种情况下,拷贝构造函数都会被自动调用: ◆当用类的一个对象去初始化该类的另一个对象时; ◆当函数的形参是类的对象,进行形参和实参结合时; ◆当函数的返回值是类的对象,函数执行完成返回调用者时。
(1)
#include<iostream> using namespace std; class Test { private: int num; public: Test(); Test(int n); }; Test::Test() { cout<<"Init defa"<<endl;\ num=0; } Test::Test(int n) { cout<<"Init"<<""<<n<<endl; num=n; } int main() { Test x[2]; Test y(15); return 0; } 12345678910111213141516171819202122232425262728输出结果: 结果分析:
1.程序声明了2个对象x和y,类中有2个构造函数。 2.程序首先执行语句Test x[2];,创建对象x,调用默认构造函数。由于对象x是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2行结果。程序接着执行语句Test y(15);,创建对象y,调用带一个参数的构造函数,输出第3行结果。
(2)
#include<iostream> using namespace std; class Xx { private: int num; public: Xx(int x){num=x;} ~Xx(){cout<<"dst"<<num<<endl;} }; int main() { Xx w(5); cout<<"Exit main"<<endl; return 0; } 1234567891011121314151617输出结果: 结果分析:
程序声明了一个对象w。 首先执行语句Xx w(5);,创建对象w,调用构造函数,num得到初值5。程序接着执行语句cout<<"Exit main"<<endl;> ,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2行结果。(3)将例3.10中的Whole类如下修改,其他部分不变,写出输出结果。
class whole { public: whole(int i); //whole的有参构造函数 whokle(){}; //whole的无参构造函数 ~whole(); //whole的析构函数 private: Part p1; //子对象1 Part p2; //子对象2 Part p3; //子对象3 }; whole::whole(int i):p1(i),p2() { cout<<"constructor of whole"<<endl; } whole::~whole() { cout<<"destructor of whole "<<endl; } 12345678910111213141516171819修改后代码:
#include<iostream> using namespace std; class Part { public: Part(); Part(int x); ~Part(); private: int val; }; Part::Part() { val=0; cout<<"default constructor of part"<<endl; } Part::Part(int x) { val=x; cout<<"constructorof part "<<","<<val<<endl; } Part::~Part() { cout<<"destructor of part"<<","<<val<<endl; } class whole { public: whole(int i); //whole的有参构造函数 whokle(){}; //whole的无参构造函数 ~whole(); //whole的析构函数 private: Part p1; //子对象1 Part p2; //子对象2 Part p3; //子对象3 }; whole::whole(int i):p1(i),p2() { cout<<"constructor of whole"<<endl; } whole::~whole() { cout<<"destructor of whole "<<endl; } int main() { whole w(3); return 0; } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051输出结果: 结果分析:
程序中的whole类中出现了类Part的三个对象p1 p2 p3,作为该类的数据成员,且被称为子对象。当建立whole类的对象w时,子对象p1p2p3被建立,相应的构造函数被执行,即类Part的默认构造函数。初始化p3的时候,由于whole 类构造函数的成员初始化列表中没有子对象p3进行初始化的对象,所以执行类Part的默认构造函数。当所有的子对象被构造完成之后,对象w的构造函数才被执行,即为第四行的结构,后面执行相应的析构函数。
(4)
#include<iostream> using namespace std; class book { public: book(int w); static int sumnum; private: int num; }; book::book(int w) { num =w; sumnum -=w; } int book::sumnum=120; //语句1 int main() { book b1(20); //语句2 book b2(70); //语句3 cout<<book::sumnum<<endl; return 0; } 123456789101112131415161718192021222324输出结果: 结果分析:
程序中语句1对静态成员sumnum进行初始化,sumnum得到初值120。执行语句2时,调用构造函数,sumnum变为100。接着语句3,再调用构造函数,sumnum变为30。
(1) 声明一个Circle类,有数据成员radius(半径)、成员函数area(),计算圆的面积,构造一个Circle的对象进行测试
程序设计:
#include<iostream> using namespace std; class Circle { public: Circle(float r){radius = r;} ~Circle(){} float area(){return 3.14*radius*radius;} private: float radius; }; int main() { float r; cout<<"请输入半径:"; cin>>r; Circle p(r); cout<<"半径为"<<r<<"的圆的面积为:"<<p.area()<<endl; return 0; } 1234567891011121314151617181920输出结果:
(2)重新编写程序分析题(4)的程序,设计一个静态成员函数,用来输出程序分析题(4)中静态数据成员的值。
#include<iostream> using namespace std; class book { public: book(int w); static int sumnum; static int getsum(){return sumnum;} private: int num; }; book::book(int w) { num=w; sumnum-=w; } int book::sumnum=120; int main() { book b1(20); book b2(70); cout<<book::getsum()<<endl; return 0; } 12345678910111213141516171819202122232425输出结果: