class A float x y public float m
构造函数的引入 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
例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; } 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
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; 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
举例 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
构造函数与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
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
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
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
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 Box: : volume (Box * this) { return (this->height * this->width * this->length)} 即在成员函数的形参列表中增加一个this指针。在调 用该成员函数时,实际上是用以下方式调用: a. volume (&a); 46
- Slides: 49