第3章类和对象3.2 构造函数与析构函数例:点类 Pointclass Point{private:int x,y;public:Point() {};Point(int xx, int yy) { x=xx; y=yy; }Point(Point &p) { x=p.x; y=p.y; }int GetX() const { return x; }int GetY() const { return y; }void SetXY(int xx, int yy) { x=xx; y=yy; } void Show();};void Point::Show(){ cout<<"X: "<<x<<", Y: "<<y<<endl;}例:人类 Personclass Person{ protected:char *name;int age;char sex;public:Person(char *n, int a, char s);Person() { name = 0; age = 0; sex = ' '; } Person( Person &p );~Person() { delete[] name; }void SetName(char *n);void SetAge(int a){ age = a; }void SetSex(int s){ sex = s; }char *GetName() const { return name; }int GetAge() const { return age; }char GetSex() const { return sex; }void Show();};#include "person.h"#include <iostream>using namespace std;Person::Person(char *n, int a, char s){ name = new char[strlen(n)+1];strcpy(name,n);age = a;sex = s;}Person::Person(Person &p){ name = new char[strlen()+1];strcpy(name,);age = p.age;sex = p.sex;}void Person::SetName(char *n){ delete[] name;name = new char[strlen(n)+1];strcpy(name,n);}void Person::Show(){cout<<"Name: "<<name<<", Age: "<<age<<", Sex: "<<sex<<endl; }3.3 对象数组与对象指针1、对象数组所谓对象数组是指每一数组元素都是对象的数组。
2、对象指针声明对象指针的一般语法形式为:类名* 对象指针名。
当用指向对象的指针来访问对象成员时,要用“->”操作符。
3、this指针C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。
每当通过一个对象调用一个成员函数时,系统就自动把这个this指针指向该对象。
因此使用的数据成员就是该对象的数据成员。
3.4 向函数传递对象1、使用对象作为函数参数2、使用对象指针作为函数参数3、使用对象引用作为函数参数3.5 静态成员1、静态数据成员在一个类中,若将一个数据成员说明为static,这种成员称为静态数据成员。
与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据的拷贝。
从而实现了同一个类的不同对象之间的数据共享。
定义静态数据成员的格式如下:static 数据类型数据成员名;静态数据成员在该类定义之外被初始化。
访问静态数据成员可以通过对象或指针来访问,也可以通过类名::来访问。
2、静态成员函数定义静态成员函数的格式如下:static 返回类型静态成员函数名(参数表);与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:类名::静态成员函数名(实参表)对象. 静态成员函数名(实参表)对象指针->静态成员函数名(实参表)例:点类 Point(演示静态成员)class Point{private:int x,y;static int count;public:Point(int xx=0, int yy=0) { x=xx; y=yy; count++;}Point(Point &p) { x=p.x; y=p.y; count++;}int GetX() const { return x; }int GetY() const { return y; }void SetXY(int xx, int yy) { x=xx; y=yy; }static int GetCount() { return count; }};int Point::count=0;int main(){Point a(100,200), b;cout<<a.GetCount();cout<<Point::GetCount();}3.6 友元1、友元函数友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员、保护成员和公有成员。
2、友元成员一个类的成员函数也可以作为另一个类的友元,这种成员函数不仅可以访问自己所在类对象中的所有成员,还可以访问friend声明语句所在类对象中的所有成员。
3、友元类一个类也可以作为另一个类的友元。
友元关系是单向的,不具有交换性。
若类X是类Y的友元,类Y不一定是类X的友元。
友元关系也不具有传递性。
若类X是类Y的友元,Y是类Z的友元,类X不一定是类Z的友元。
例:点类 Point(演示友元)class Point{private:int x,y;static int count;public:Point(int xx=0, int yy=0) { x=xx; y=yy; }int GetX() const { return x; }int GetY() const { return y; }void SetXY(int xx, int yy) { x=xx; y=yy; }friend double Dist(Point p1, Point p2);};friend double Dist(Point p1, Point p2);{double x,y;x=p1.x-p2.x;y=p1.y-p2.y;return sqrt(x*x+y*y);}int main(){Point a(100,200), b(300,400);cout<<"两点间的距离为:"<<Dist(p1,p2)<<endl;}3.7 类对象作为成员例:圆类 Circle(包含Point类的写法)class Circle{private:double radius; //半径Point center; //圆心public:Circle() {}Circle(int x, int y, double r): center(x,y){ SetRadius(r); }Circle(Point p, double r): center(p){ SetRadius(r); }double GetRadius() const { return radius; }void SetRadius(double r) { radius = (r>=0 ? r : 0); } void SetValue(int x, int y, double r){ center.SetXY(x,y); SetRadius(r); }double Area();void Show();};const double PI=3.14159;inline double Circle::Area(){return PI * radius * radius;}void Circle::Show(){cout<<"圆心为: "center.Show();cout<<"半径为: "<<radius;}3.8 常类型1、const引用const引用的说明形式如下: const 类型说明符& 引用名2、const对象const对象的说明形式如下: const 类名对象名[(参数表)];如:const Data Mybirthday(1980,1,1);const对象的数据成员值不能被改变,const对象必须进行初始化。
通过const对象只能调用它的const成员函数,而不能调用普通成员函数。
3、const数据成员const数据成员只能通过构造函数的初始化列表来获得初始值。
4、const成员函数const成员函数的说明格式如下: 类型说明符函数名(参数表)const;如:int GetYear() const { return year; }const成员函数不能更新对象的数据成员,也不能调用对象的普通成员函数。
const是函数类型的一个组成部分,因此在函数的实现部分也要带关键字const。
5、引用类型的数据成员引用类型的数据成员也只能通过构造函数的初始化列表来进行初始化。
例class Test{ private:int a;const int b;//不能写成const int b=10,因类的定义还没分配空间int &c; //不能写成const int &c=a,因变量a还没分配空间public:Test(int i,int j,int &k):b(j),c(k){ a=i; }Test():b(10),c(a) { a=20; }}第4章派生类与继承4.2 派生类的构造函数与析构函数例:圆类 Circle(继承Point类的写法)class Circle: public Point{ private:double radius; //半径public:Circle() {}Circle(int x, int y, double r): Point(x,y){ SetRadius(r); }Circle(Point p, double r): Point(p){ SetRadius(r); }double GetRadius() const { return radius; }void SetRadius(double r) { radius = (r>=0 ? r : 0); } void SetValue(int x, int y, double r){ SetXY(x,y); SetRadius(r); }double Area();void Show();};const double PI=3.14159;inline double Circle::Area(){ return PI * radius * radius;}void Circle::Show(){ cout<<"圆心为: "Point::Show();cout<<"半径为: "<<radius;}关于基类和派生类的几点说明1、派生类继承了它的所有基类中除构造函数和析构函数之外的所有成员。