class A float x y public float m
![](https://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-1.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-2.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-3.jpg)
![构造函数的引入 class A { 如何实现对象成员数 float x, y; 据的快速初始化? public: float m, n; void 构造函数的引入 class A { 如何实现对象成员数 float x, y; 据的快速初始化? public: float m, n; void](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-4.jpg)
构造函数的引入 class A { 如何实现对象成员数 float x, y; 据的快速初始化? public: float m, n; void Setxy( float a, float b ){ x=a; y=b; } void Print(void) { cout<<x<<‘t’<<y<<endl; } }; void main(void) 对a 1对象的公有 { A a 1; 成员数据赋初值 a 1. m=10; a 1. n=20; 对a 1对象的私有 a 1. Setxy(2. 0 , 5. 0); 成员数据赋初值 a 1. Print(); } 4
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-5.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-6.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-7.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-8.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-9.jpg)
![例1: class A { 构造函数, 初始化对象 float x, y; public: A(float a, float b){ 例1: class A { 构造函数, 初始化对象 float x, y; public: A(float a, float b){](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-10.jpg)
例1: class A { 构造函数, 初始化对象 float x, y; public: A(float a, float b){ x=a; y=b; }// float Sum(void) { return x+y; } Print(void) { cout<<"x="<<x<<'t'<<"y="<<y<<endl; } }; void main(void) { A a 1(2. 0, 3. 0); A a 2(1. 0, 2. 0); a 1. Print(); a 2. Print(); } 定义时调用构造 函数进行成员数 据的初始化 x=2 x=1 y=3 y=2 10
![class A{ float x, y; 带缺省参数的构造函数 public: A(float a, float b=10) { x=a; y=b; class A{ float x, y; 带缺省参数的构造函数 public: A(float a, float b=10) { x=a; y=b;](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-11.jpg)
class A{ float x, y; 带缺省参数的构造函数 public: A(float a, float b=10) { x=a; y=b; } A() { x=0; y=0; } 不带参数的构造函数 void Print(void) {cout<<x<<'t'<<y<<endl; } }; void main(void) 0 0 { A a 1, a 2(20. 0), a 3(3. 0, 7. 0); a 1. Print(); 20 10 每一个对象必 a 2. Print(); 3 7 须要有相应的 a 3. Print(); 构造函数 } 11
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-12.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-13.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-14.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-15.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-16.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-17.jpg)
![class A{ float x, y; public: A(){ }//缺省的构造函数,编译器自动产生, 可以不写 float Sum(void) { return x+y; class A{ float x, y; public: A(){ }//缺省的构造函数,编译器自动产生, 可以不写 float Sum(void) { return x+y;](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-18.jpg)
class A{ float x, y; public: A(){ }//缺省的构造函数,编译器自动产生, 可以不写 float Sum(void) { return x+y; } void Set(float a, float b) { x=a; y=b; } void Print(void) { cout<<"x="<<x<<'t'<<"y="<<y<<endl; } }; void main(void) { A a 1, a 2; //产生对象时,自动调用缺省的构造函数,不赋值 a 1. Set (2. 0, 4. 0); cout<<"a 1: "; a 1. Print (); cout<<"a 1. sum="<<a 1. Sum ()<<endl; a 2. Print(); //打印随机值 } 18
![class A{ float x, y; public: 显式定义了构造函数,不 产生缺省的构造函数 A(float a, float b) { x=a; class A{ float x, y; public: 显式定义了构造函数,不 产生缺省的构造函数 A(float a, float b) { x=a;](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-19.jpg)
class A{ float x, y; public: 显式定义了构造函数,不 产生缺省的构造函数 A(float a, float b) { x=a; y=b; } void Print(void){ cout<<x<<'t'<<y<<endl; } }; void main(void) { A a 1; error, 定义时,没有 构造函数可供调用 A a 2(3. 0, 30. 0); } 19
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-20.jpg)
![举例 class A{ float x, y; 两个函数均为缺 省的构造函数 public: A(float a=10, float b=20){ x=a; 举例 class A{ float x, y; 两个函数均为缺 省的构造函数 public: A(float a=10, float b=20){ x=a;](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-21.jpg)
举例 class A{ float x, y; 两个函数均为缺 省的构造函数 public: A(float a=10, float b=20){ x=a; y=b; } A(){ } void Print(void){ cout<<x<<'t'<<y<<endl; } }; void main(void) { A a 1; 两个构造函数均可供调用,构造函数不唯一 A a 2(3. 0, 30. 0); } 21
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-22.jpg)
![构造函数与new运算符程序举例 class A{ float x, y; 输出: 3 public: 0 A(float a, float b){ 构造函数与new运算符程序举例 class A{ float x, y; 输出: 3 public: 0 A(float a, float b){](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-23.jpg)
构造函数与new运算符程序举例 class A{ float x, y; 输出: 3 public: 0 A(float a, float b){ x=a; y=b; } A(){ x=0; y=0; } void Print(void){ cout<<x<<'t'<<y<<endl; } }; 用new动态开辟对 void main(void) 象空间,初始化 { A *pa 1, *pa 2; pa 1=new A(3. 0, 5. 0); pa 2=new A; 用new动态开辟空间, pa 1 ->Print(); 调用构造函数初始化 pa 2 ->Print(); delete pa 1; //用delete释放空间 delete pa 2; //用delete释放空间 } 5 0 23
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-24.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-25.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-26.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-27.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-28.jpg)
![class Str{ 在构造函数中将成员数据 char *Sp; int Length; 指针指向动态开辟的内存 public: Str(char *string) { if(string){ Length=strlen(string); class Str{ 在构造函数中将成员数据 char *Sp; int Length; 指针指向动态开辟的内存 public: Str(char *string) { if(string){ Length=strlen(string);](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-29.jpg)
class Str{ 在构造函数中将成员数据 char *Sp; int Length; 指针指向动态开辟的内存 public: Str(char *string) { if(string){ Length=strlen(string); Sp=new char[Length+1]; 用初值为开辟的 strcpy(Sp, string); 内存赋值 } else Sp=0; } void Show(void){ cout<<Sp<<endl; } ~Str(){ if(Sp) delete Sp; } }; 析构函数,当释放对象时 void main(void) 收回用new开辟的空间 { Str s 1("Study C++"); s 1. Show(); } 29
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-30.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-31.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-32.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-33.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-34.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-35.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-36.jpg)
![class A{ float x, y; public: A(float a=0, float b=0){x=a; y=b; } A(A &a) class A{ float x, y; public: A(float a=0, float b=0){x=a; y=b; } A(A &a)](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-37.jpg)
class A{ float x, y; public: A(float a=0, float b=0){x=a; y=b; } A(A &a) 形参必须是同类型对象的引用 { x=a. x; y=a. y; } }; void main(void) { A a 1(1. 0, 2. 0); A a 2(a 1); } 实参是同类型的对象 37
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-38.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-39.jpg)
![class A{ float x, y; public: A(float a=0, float b=0){x=a; y=b; cout<<"调用了构造函数 n"; } class A{ float x, y; public: A(float a=0, float b=0){x=a; y=b; cout<<"调用了构造函数 n"; }](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-40.jpg)
class A{ float x, y; public: A(float a=0, float b=0){x=a; y=b; cout<<"调用了构造函数 n"; } void Print(void){ cout<<x<<'t'<<y<<endl; } ~A() { cout<<"调用了析构函数n"; } }; 调用了构造函数 void main(void) 1 2 { A a 1(1. 0, 2. 0); 1 2 A a 2(a 1); 1 2 A a 3=a 1; 调用了析构函数 a 1. Print(); 调用了析构函数 a 2. Print(); 调用了析构函数 a 3. Print(); } 40
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-41.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-42.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-43.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-44.jpg)
![This 指针 #include<iostream. h> class Point { int x, y; public: Point(int a, int This 指针 #include<iostream. h> class Point { int x, y; public: Point(int a, int](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-45.jpg)
This 指针 #include<iostream. h> class Point { int x, y; public: Point(int a, int b) { x=a; y=b; } void Move. Point( int a, int b){ x+=a; y+=b; } void print(){ cout<<"x="<<x<<"y="<<y<<endl; } }; void main( ) { Point point 1( 10, 10); point 1. Move. Point(2, 2); point 1. print( ); 当对象point 1调用 Move. Point(2, 2)函数 时,即将point 1对象 的地址传递给了this 指针。 45
![This指针 int Box: : volume() { return(height * width * length); } C++把它处理成 int This指针 int Box: : volume() { return(height * width * length); } C++把它处理成 int](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-46.jpg)
This指针 int Box: : volume() { return(height * width * length); } C++把它处理成 int Box: : volume (Box * this) { return (this->height * this->width * this->length)} 即在成员函数的形参列表中增加一个this指针。在调 用该成员函数时,实际上是用以下方式调用: a. volume (&a); 46
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-47.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-48.jpg)
![](http://slidetodoc.com/presentation_image_h2/35dcb97ffad2bd99f7d0003769b6dc71/image-49.jpg)
- Slides: 49