- 3
- 0
- 约2.06万字
- 约 93页
- 2019-11-06 发布于广东
- 举报
* * 面向对象的观点:认为自然界是由一组彼此相关并能相互通信的实体(对象)所组成。 面向对象的程序设计方法:使用面向对象的观点来描述现实问题,然后用计算机语言来模仿并处理该问题。 要求:描述或处理问题时应高度概括、分类、和抽象。 目的:实现软件设计的产业化。 * * * * 将函数体放在类的声明中。 * 在类外实现成员函数,使用inline关键字。(接下页) * * * * * * * * * 作用:使用一个对象(参数指定的对象),去初始化一个正在被建立的同类型对象 * * * * * * * * 全局对象不好,但复杂程序都是由许多程序员共同设计的,因此需要这种性质的对象。 使用类中的静态数据成员——解决访问权限控制问题。 使用静态成员函数——解决操作合法性控制问题。 * * 友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员 作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。类的主要特点是实现数据隐藏,即不允许非成员函数对它访问,但在某些场合下,非成员函数中需要通过对象名访问private成员,这可以通过友元函数来实现;有些函数需要放在类的外面,或者类设计完后补充的,不能成为成员函数,但又需要访问类中的私有成员。 举例:P57 * * 在友元函数Distanc的函数体中可以访问Point类对象 a,b 的私有成员 * 一个类可以被声明为另一个类的友元。 若声明B类为A类的友元,意味着B类的所有成员函数(包括构造函数和析构函数)将成为A类的友元。 声明语法:在A类中用friend修饰说明B类。 * B类声明为A类的友元,意味着B类的所有函数包括构造函数和析构函数)成为A类的友元。 * 在B类的set( )函数中,访问了A类对象a的私有成员x * * 北京科技大学计算机系 -*- 完成简单的一一对应的复制的拷贝构造函数称为浅拷贝。 如果类的数据成员包括指针变量,类的构造函数用new运算符为这个指针动态申请空间。如果通过浅拷贝进行了对象的复制。最后,在退出运行时,程序会报错。这时需要用“深拷贝”的方式恰当定义类的拷贝构造函数。 一般来讲,如果一个类需要析构函数来释放资源,则它也需要定义一个显式拷贝构造函数来实现深拷贝。 浅拷贝与深拷贝 * 北京科技大学计算机系 -*- 浅拷贝导致运行错误的例子: //对象包含指针成员。 #includeiostream Using namespace std; Class student {public: student(int char *,int float); ~student(); void printstu(); private: int id; char* name; int age; float score; } * 北京科技大学计算机系 -*- void student::printstu() {cout“学号:”id“姓名”name; cout“”age“”scoreendl; } void main() {student s1(10,”wang”,18,86); student s2=s1; s1.printstu(); s2.printstu(); }//出现运行错误 student::student(int,char* c,int a,float s) {cout“constructing…”endl; id=i; age=a; score=s; name=new char[strlen(c)+1]; if(name!=0) strcpy(name,c); } Student::~student() {cout“”destructing…”endl; name[0]=‘\0’; delete[]name; } * 北京科技大学计算机系 -*- 自定义拷贝构造函数时,先为新对象从堆中分配自己的指针空间,从老对象中将值复制,这种方式叫深拷贝。 上面的例子,改用深拷贝做: Class studen {… public: student(student);}; … student::student(student s) //拷贝构造函数 { cout“copy constructing…”endl; id=s.id; //一般成员简单复制 age=s.age; score=s.score; name=new char[strlen()+1]; //先申请堆空间 if (name!=0) strcopy(name,); //复制字符串 } … * 北京科技大学计算机系 -
原创力文档

文档评论(0)