1、2.1 类的定义和对象的创建2.2 构造函数与析构函数2.3 this,const和new,delete2.4 复制构造函数2.5 转换构造函数与类型转换2.6 对象数组、对象指针与对象引用2.7 静态成员与友元2.8 从面向过程到面向对象 面向对象编程的程序基本单位是类 类是数据和操作数据的函数的封装 类的对象使用自己的方法完成对数据的操作 类可以隐藏数据和操作细节,对象通过类接口与外部通信/排序函数原型void Sort(int ,int);/数组相加函数原型void Add(int,int,int);void main()int a 10,b 10;.Sort(a,10);Sort(b,
2、10);Add(a,b,10);.数组与数组类class Array/定义数组类 int*ap;int len;public:Array(int size)/建立数组 len=size;ap=new int size ;void Sort();/排序 /重载算符+函数 Array operaor+(const Array&other);void main()Array a(10),b(10);/声明对象 .a.Sort();b.Sort();/调用排序方法 a=a+b;/数组相加 ./排序函数原型void Sort(int ,int);/数组相加函数原型void Add(int,int,int
3、);void main()int a 10,b 10;.Sort(a,10);Sort(b,10);Add(a,b,10);.数组与数组类2.2 2.2 类与对象类与对象class Array/定义数组类 int*ap;int len;public:Array(int size)/建立数组 len=size;ap=new int size ;void Sort();/排序 /重载算符+函数 Array operaor+(const Array&other);void main()Array a(10),b(10);/声明对象 .a.Sort();b.Sort();/调用排序方法 a=a+b;/
4、数组相加 ./排序函数原型void Sort(int ,int);/数组相加函数原型void Add(int,int,int);void main()int a 10,b 10;.Sort(a,10);Sort(b,10);Add(a,b,10);.数组与数组类class Array/定义数组类 int*ap;int len;public:Array(int size)/建立数组 len=size;ap=new int size ;void Sort();/排序 /重载算符+函数 Array operaor+(const Array&other);类是数据和操作数据的函数的封装2.2 2.2
5、类与对象类与对象class Array/定义数组类 int*ap;int len;public:Array(int size)/建立数组 len=size;ap=new int size ;void Sort();/排序 /重载算符+函数 Array operaor+(const Array&other);void main()Array a(10),b(10);/声明对象 .a.Sort();b.Sort();/调用排序方法 a=a+b;/数组相加 ./排序函数原型void Sort(int ,int);/数组相加函数原型void Add(int,int,int);void main()in
6、t a 10,b 10;.Sort(a,10);Sort(b,10);Add(a,b,10);.数组与数组类对象使用自己的方法对数据操作a.Sort();b.Sort();/调用排序方法a=a+b;/数组相加2.2 2.2 类与对象类与对象2.2 2.2 类与对象类与对象class 钟 private:钟的构造;public:读取时间值;调整时间值;对象通过类接口与外部通信2.2 2.2 类与对象类与对象2.1 2.1 定义类和对象定义类和对象v在在C+中,类是一种数据类型。中,类是一种数据类型。v 客观事物是复杂的,要描述它必须从多客观事物是复杂的,要描述它必须从多方面进行,也就是方面进行,
7、也就是用不同的数据类型用不同的数据类型来描来描述述不同的方面不同的方面。v如每天可以这样描述:如每天可以这样描述:v 年份(用整型数描述)年份(用整型数描述)月份(用整型数描述)月份(用整型数描述)日期(用整型数描述)日期(用整型数描述)2.1 2.1 定义类和对象定义类和对象v结构体描述:结构体描述:vStructure Tdayvv int year;v int month;v int day;v vmybirthday类描述:class goods private:int year;int month;int day;.2.1 定义类和对象/例 一个类的例子#includeclass T
8、date public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();2.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m
9、,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();class Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()ret
10、urn(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;2.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day e
11、ndl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();class Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;关键字定义一个类标识符类名2
12、.1 定义类和对象/例例 一个类的例子一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate ;a.Set(10,16,2003);a.Print();Tdate 类型的一个对象(实例)2.1 定
13、义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();类由成员构成:数据成员描述对象的属性 成员函数描述对象的方法2
14、.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();int month;int day;int year;
15、数据成员2.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();void Set(int m,int d,i
16、nt y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;类中定义成员函数内联函数处理2.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print(
17、)cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,2003);a.Print();void Set(int m,int d,int y);int IsLeapYear();void Print();在类外定义成员函数 void Tdate:Set(int m,int d,int y)month=m;day=d;year=y;int Tdate:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);voi
18、d Tdate:Print()cout year.month.dayendl;2.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .month .day endl;private:int month;int day;int year;void main()Tdate a ;a.Set(10,16,200
19、3);a.Print();成员的性质由关键字public、protected、private 决定公有 公有段的成员是提供给外部的接口 保护 保护段成员在该类和它的派生类中可见 私有 私有段成员仅在类中可见各段中既可以包含数据成员,也可以包含成员函数2.1 定义类和对象/例 一个类的例子#includeclass Tdate public:void Set(int m,int d,int y)month=m;day=d;year=y;int IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Print()cout year .
20、month .day ”运算符访问对象成员 访问对象成员/访问对象的公有成员#includeclass Tclass public:int x,y;void print()cout x “,”运算符访问对象成员 访问对象成员/访问对象的公有成员#includeclass Tclass:int x,y;void print()cout x “,”运算符访问对象成员 访问对象成员/访问对象的公有成员#includeclass Tclass:int x,y;void print()cout x “,”运算符访问对象成员 访问对象成员/用指针访问对象成员#includeclass Tclass pub
21、lic:int x,y;void print()cout x ,y x+ptf-y);void main()Tclass test,*pt=new(Tclass);pt-x=100;pt-y=200;pt-print();test.x=120;test.y=420;test.print();cout x+y=”运算符访问对象成员 访问对象成员/用指针访问对象成员#includeclass Tclass public:int x,y;void print()cout x ,y x+ptf-y);void main()Tclass test,*pt=;pt-x=100;pt-y=200;pt-pr
22、int();test.x=120;test.y=420;test.print();cout x+y=”运算符访问对象成员 访问对象成员/用指针访问对象成员#includeclass Tclass public:int x,y;void print()cout x ,y x+ptf-y);void main()Tclass test,*pt=new(Tclass);=100;=200;test.x=120;test.y=420;test.print();cout x+y=”运算符访问对象成员 访问对象成员/用指针访问对象成员#includeclass Tclass public:int x,y;
23、void print()cout x ,y x+ptf-y);void main()Tclass test,*pt=new(Tclass);pt-x=100;pt-y=200;pt-print();test.x=120;test.y=420;test.print();cout x+y=”运算符访问对象成员 访问对象成员/用指针访问对象成员#includeclass Tclass public:int x,y;void print()cout x ,y x+ptf-y);void main()Tclass test,*pt=new(Tclass);pt-x=100;pt-y=200;pt-pri
24、nt();test.x=120;test.y=420;test.print();cout x+y=add();向函数传递对象地址 C+为对象的初始化提供了必要的机制,让用户可以自己编写初始化程序,这就是构造函数。构造函数是用于创建对象的特殊成员函数当创建对象时,系统自动调用构造函数 构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源 没有用户定义的构造函数时,系统提供缺省版本的构造函数 构造函数名与类名相同 构造函数一般被声明为公有函数,可以重载。构造函数可以有任意类型的参数,但没有返回类型,也不能标记为void类型。2.2 构造函数和析构函数 析构函数是用于取消对象的成员函数
25、当一个对象作用域结束时,系统自动调用析构函数来释放存储空间。析构函数名为:类名 没有用户定义析构函数时,系统提供缺省版本的析构函数 析构函数的作用是进行清除对象,释放内存等操作 析构函数没有参数,也没有返回类型2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;构造函数2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA
26、t1,t2;return;析构函数2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/声明变量时开辟两个整型存储空间2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/两次调用构造函数,创建对象2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/两次调用构造函数,创建对象2.3 构造函数和析构函数例:class AA AA()AA();vo
27、id test()int x,y;AA t1,t2;return;/两次调用析构函数,撤消对象2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/两次调用析构函数,撤消对象2.3 构造函数和析构函数例:class AA AA()AA();void test()int x,y;AA t1,t2;return;/两次调用析构函数,撤消对象/变量 x,y 生存期结束2.3 构造函数和析构函数简单构造函数和析构函数 构造函数原型类名:类名(参数表);析构函数原型 类名:类名();2.3.1 简单构造函数和析构函数#i
28、nclude/例2-11class Date public:Date();Date();void SetDate(int y,int m,int d);int IsLeapYear();void PrintDate();private:int year,month,day;Date:Date()cout Date object initialized.n;/无参构造函数Date:Date()cout Date object destroyed.n;/析构函数void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;int Date:IsL
29、eapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year /month /day endl;void main()Date d;d.SetDate(2001,10,1);d.PrintDate();2.3.1 简单构造函数和析构函数#include/例2-6class Date public:Date();Date();void SetDate(int y,int m,int d);int IsLeapYear();void PrintDate();private:int year,mon
30、th,day;Date:Date()cout Date object initialized.n;/无参构造函数Date:Date()cout Date object destroyed.n;/析构函数void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;int Date:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year /month /day endl;void main()Date d;d.SetDate(200
31、1,10,1);d.PrintDate();Date();Date:Date()cout Date object initialized.n;/无参构造函数Date d;创建对象时调用构造函数2.3.1 简单构造函数和析构函数#include/例2-6class Date public:Date();Date();void SetDate(int y,int m,int d);int IsLeapYear();void PrintDate();private:int year,month,day;Date:Date()cout Date object initialized.n;/无参构造函数
32、Date:Date()cout Date object destroyed.n;/析构函数void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;int Date:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year /month /day endl;void main()Date d;d.SetDate(2001,10,1);d.PrintDate();Date();Date:Date()cout Date object
33、 destroyed.n;/析构函数作用域结束时调用析构函数2.3.1 简单构造函数和析构函数#include/例2-6class Date public:Date();Date();void SetDate(int y,int m,int d);int IsLeapYear();void PrintDate();private:int year,month,day;Date:Date()cout Date object initialized.n;/无参构造函数Date:Date()cout Date object destroyed.n;/析构函数void Date:SetDate(int
34、 y,int m,int d)year=y;month=m;day=d;int Date:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year /month /day endl;void main()Date d;d.SetDate(2001,10,1);d.PrintDate();2.3.1 简单构造函数和析构函数#include/例2-6class Date public:Date();Date();void SetDate(int y,int m,int d);int Is
35、LeapYear();void PrintDate();private:int year,month,day;Date:Date()cout Date object initialized.n;/无参构造函数Date:Date()cout Date object destroyed.n;/析构函数void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;int Date:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year
36、/month /day SetDate(2001,10,1);pd-PrintDate();delete pd;2.3.1 简单构造函数和析构函数#include/例2-6class Date public:Date();Date();void SetDate(int y,int m,int d);int IsLeapYear();void PrintDate();private:int year,month,day;Date:Date()cout Date object initialized.n;/无参构造函数Date:Date()cout Date object destroyed.n;
37、/析构函数void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;int Date:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year /month /day SetDate(2001,10,1);pd-PrintDate();delete pd;Date*pd=new(Date);Date();Date:Date()cout Date object initialized.n;/无参构造函数创建动态对象时调用构造函数2
38、.3.1 简单构造函数和析构函数#include/例2-6class Date public:Date();Date();void SetDate(int y,int m,int d);int IsLeapYear();void PrintDate();private:int year,month,day;Date:Date()cout Date object initialized.n;/无参构造函数Date:Date()cout Date object destroyed.n;/析构函数void Date:SetDate(int y,int m,int d)year=y;month=m;d
39、ay=d;int Date:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);void Date:PrintDate()cout year /month /day SetDate(2001,10,1);pd-PrintDate();delete pd;delete pd;Date();Date:Date()cout Date object destroyed.n;/析构函数释放动态对象时调用析构函数2.3.1 简单构造函数和析构函数 带参数的构造函数在建立对象时,以特定的数据初始化 对象的数据成员带参数的构造函数 2.3.2 带参数的构
40、造函数#include/例2-7class Date public:Date(int,int,int);Date();void SetDate(int y,int m,int d);void IsLeapYear();void PrintDate();private:int year,month,day;Date:Date(int y,int m,int d)year=y;month=m;day=d;cout year /month /day :Date object initialized.n;Date:Date()cout year /month /day :Date object des
41、troyed.n;void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;void Date:IsLeapYear()if(year%4=0&year%100!=0|year%400=0)cout year Is leap year.n;else cout Is not leap year.n;void Date:PrintDate()cout year /month /day endl;void main()Date d1(2000,2,1);d1.PrintDate();d1.IsLeapYear();2.3.2 带参数的构造函数#
42、include/例2-7class Date public:Date(int,int,int);Date();void SetDate(int y,int m,int d);void IsLeapYear();void PrintDate();private:int year,month,day;Date:Date(int y,int m,int d)year=y;month=m;day=d;cout year /month /day :Date object initialized.n;Date:Date()cout year /month /day :Date object destroy
43、ed.n;void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;void Date:IsLeapYear()if(year%4=0&year%100!=0|year%400=0)cout year Is leap year.n;else cout Is not leap year.n;void Date:PrintDate()cout year /month /day endl;void main()Date d1(2000,2,1);d1.PrintDate();d1.IsLeapYear();Date(int,int,int);D
44、ate:Date(int y,int m,int d)/带参数构造函数 year=y;month=m;day=d;cout year/month/day:Date object initialized.n;2.3.2 带参数的构造函数#include/例2-7class Date public:Date(int,int,int);Date();void SetDate(int y,int m,int d);void IsLeapYear();void PrintDate();private:int year,month,day;Date:Date(int y,int m,int d)year=
45、y;month=m;day=d;cout year /month /day :Date object initialized.n;Date:Date()cout year /month /day :Date object destroyed.n;void Date:SetDate(int y,int m,int d)year=y;month=m;day=d;void Date:IsLeapYear()if(year%4=0&year%100!=0|year%400=0)cout year Is leap year.n;else cout Is not leap year.n;void Date
46、:PrintDate()cout year /month /day endl;void main()Date d1(2000,2,1);d1.PrintDate();d1.IsLeapYear();Date(int,int,int);Date:Date(int y,int m,int d)/带参数构造函数带参数构造函数 cout year/month/day:Date object initialized.n;Date:Date(int y,int m,int d)coutyear/month/day:Date object initialized.n;用初始式对数据成员置值2.3.2 带参数
47、的构造函数Date:Date(int y,int m,int d)coutyear/month/day:Date object initialized.n;使用“初始式”的构造函数形式为:构造函数名(变元表):数据成员1(变元表),数据成员n(变元表)/*/“初始式”可以调用类类型成员或基类构造函数2.3.2 带参数的构造函数/例2-13 对象成员初始化#includeclass A public:A(int x):a(x)int a;class B public:B(int x,int y):aa(x),b(y)void out()cout aa=aa.a endl b=b endl;pri
48、vate:int b;A aa;void main()B objB(3,2);objB.out();类类型数据成员类的复合类的复合/例2-13 对象成员初始化#includeclass A public:A(int x):a(x)int a;class B public:B(int x,int y):aa(x),b(y)void out()cout aa=aa.a endl b=b endl;private:int b;A aa;void main()B objB(3,2);objB.out();类的复合类的复合/例2-13 对象成员初始化#includeclass A public:A(in
49、t x):a(x)int a;class B public:B(int x,int y):aa(x),b(y)void out()cout aa=aa.a endl b=b endl;private:int b;A aa;void main()B objB(3,2);objB.out();首先调用成员类构造函数2.3.2 带参数的构造函数类的复合/例2-13 对象成员初始化#includeclass A public:A(int x):a(x)int a;class B public:B(int x,int y):aa(x),b(y)void out()cout aa=aa.a endl b=
50、b endl;private:int b;A aa;void main()B objB(3,2);objB.out();3objB.aa.a类的复合3objB.aa.a/例2-13 对象成员初始化#includeclass A public:A(int x):a(x)int a;class B public:B(int x,int y):aa(x),b(y)void out()cout aa=aa.a endl b=b endl;private:int b;A aa;void main()B objB(3,2);objB.out();2objB.b再初始化自身数据成员类的复合3objB.aa.