12

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 12 章
12.1
构造函数
构造函数和析构函数
12.2
12.3
带参数的构造函数
重载构造函数
12.4
12.5
类的初始化
复杂的对象表示
2
12.1
构造函数与析构函数
1. 构造函数
构造函数 是一种用于创建对象特殊的成员函数
当创建对象时,系统自动调用构造函数,不能在程序中直接调用
构造函数的作用是: 为对象分配空间;对数据成员赋初值;请求其他资源
1 1
// ex12_2 简单例子 #include<iostream.h> class Location { public: Location(int xx, int yy); // 构造函数 ~Location(); // 析构函数 int GetX(); int GetY(); private: int X, Y; }; Location::Location(int xx, int yy) { X=xx; Y=yy; cout<<"Constructor called."<<endl; } Location::~Location() 输出 { cout<<"Destructor called."<<endl; } int Location::GetX() Constructor called { return X; } 10, 20 int Location::GetY() { return Y; } Destructor called void main() { Location A(10,20); // 构造函数被调用 cout<<A.GetX()<<","<<A.GetY()<<endl; // 析构函数被调用 }
1 0
// ex12_2 简单例子 #include<iostream.h> class Location { public: Location(int xx, int yy); // 构造函数 ~Location(); // 析构函数 int GetX(); 注意: int GetY(); 构造函数的参数个数和类型规定了声明一个对象时,为 private: int X, Y; 对这个对象进行初始化所需要的初始值的个数和类型。 }; 例如: Location A (100, 200) ; Location::Location(int xx, int yy) // OK { X=xx; Y=yy; cout<<"Constructor called."<<endl; } Location B // error Location::~Location() (10) ; { cout<<"DestructorA ; Location called."<<endl; }error // int Location::GetX() { return若有多个重载构造函数,系统自动寻找匹配 X; } int Location::GetY() { return Y; } void main() { Location A(10,20); // 构造函数被调用 cout<<A.GetX()<<","<<A.GetY()<<endl; // 析构函数被调用 }
带参数的构造函数可以在创建对象时, 用具体数值初始化数据成员和各种数据元素
// ex12_2 简单例子 #include<iostream.h> class Location { public: Location(int xx, int yy); // 带参数的构造函数 ~Location(); // 析构函数 int GetX(); int GetY(); private: int X, Y; }; Location::Location(int xx, int yy) // 初始化数据成员 { X=xx; Y=yy; cout<<"Constructor called."<<endl; } Location::~Location() { cout<<"Destructor called."<<endl; } int Location::GetX() { return X; } int Location::GetY() { return Y; } void main() { Location A(10,20); // 构造函数被调用 cout<<A.GetX()<<","<<A.GetY()<<endl; // 析构函数被调用 }
9
12.2
带参数的构造函数
class Location { public: Location(); ~Location(); int GetX(); int GetY(); private: int X= 0, Y= 0 ; };
比较普通变量的初始化: …… float pi = 3.1415; int a[3] = {1, 2, 3 } ; //错误,不能在声明数据成员时初始化 ……
8
源自文库
输出 3. 简单例子 int string :: set_contents (int in_length , char *in_contents ) String object initialized { length = in_length ; contents = in_contents ; return 1 ; } String object initialized 重载成员函数 int string :: set_contents ( char *in_contents ) // { contents = in_contents ; x_length=12 x_contents= Hello world int i = 0 ; y_length=13 y_contents= 1; while (* in_contents ++ !='\0’ ) i ++ ; length = i ; return How are you! } String object destroyed main ( ) String object destroyed { string x , y ; // 两次调用构造函数 x . set_contents ( "Hello world\n" ) ; y . set_contents ( "How are you!\n" ) ; int i = x . get_length ( ) ; char *p = x . get_contents ( ) ; cout << "x_length=" << i << " x_contents=" << p ; i = y . get_length ( ) ; p = y . get_contents ( ) ; cout << "y_length=" << i << " y_contents=" << p ; return 0 ; // 两次调用析构函数 }
构造函数是必须的。
当没有用户定义的构造函数时,系统提供缺省版本的构造函数 系统缺省版本的构造函数做公共初始化工作; 用户提供版本的构造函数做用户要求的初始化工作 构造函数名与类名相同 一个类可以拥有多个构造函数(重载) 构造函数可以有任意类型的参数,但不能具有返回类型
3
12.1
构造函数与析构函数
1. 构造函数
例: ……
class AA { …… } ;
…… int x, y ; // 声明变量时开辟两个整型存储空间
AA t1, t2 ;
……
// 两次调用构造函数,创建对象
4
12.1
构造函数与析构函数
2. 析构函数
析构函数 是用于取消对象的成员函数
当一个对象作用域结束时,系统自动调用析构函数
1 2
// ex12_3 又一个简单例子 #include<iostream.h> #include<string.h> class student { public: student( char *pname, int xhours, float xgpa ) { cout<<"constructing student "<< pname << endl; strncpy(name,pname,sizeof(name)); name[sizeof(name)-1] = '\0'; semeshours = xhours; gpa=xgpa; } ~student() {cout<<"destructing "<<name<<endl;} protected: char name[20]; int semeshours; float gpa; }; void main() { student ss( "Jenny", 22, 2.3 ) ; } // 参数个数类型匹配
3. 简单例子
7
3. 简单例子
int string :: set_contents (int in_length , char *in_contents ) { length = in_length ; contents = in_contents ; return 1 ; } int string :: set_contents ( char *in_contents ) // 重载成员函数 { contents = in_contents ; int i = 0 ; while (* in_contents ++ !='\0’ ) i ++ ; length = i ; return 1; } main ( ) { string x , y ; // 两次调用构造函数 x . set_contents ( "Hello world\n" ) ; y . set_contents ( "How are you!\n" ) ; int i = x . get_length ( ) ; char *p = x . get_contents ( ) ; cout << "x_length=" << i << " x_contents=" << p ; i = y . get_length ( ) ; p = y . get_contents ( ) ; cout << "y_length=" << i << " y_contents=" << p ; return 0 ; // 两次调用析构函数 }
例:
class AA { …… } ; ……
2. 析构函数
void test()
{ int x, y ; …… return ; // 两次调用析构函数,撤消对象 // 变量 x, y 生存期结束 } // 声明变量时开辟两个整型存储空间
AA t1, t2 ; // 两次调用构造函数,创建对象
6
//ex12_1 一个简单字符串 #include<iostream.h> #include<stdio.h> class string { private: int length; char *contents ; public: string ( ) ; // 构造函数 ~string ( ) ; // 析构函数 int get_length( ) { return length ; } char * get_contents ( ) { return contents ; } int set_contents ( int in_length, char * in_contents ) ; int set_contents ( char * in_contents ) ; }; string :: string ( ) { length = 0 ; * contents = NULL; printf ( "String object initialized\n" ) ; } string :: ~string ( ) { cout << "String object destroyed\n" ; }
析构函数的作用是进行清除对象,释放内存等 析构函数是必须的。 没有用户定义析构函数时,系统提供缺省版本的析构函数 系统缺省版本的析构函数做公共善后工作; 用户提供版本的析构函数做用户要求的善后工作 析构函数名为: ~ 类名 析构函数没有参数,也没有返回类型
5
12.1
构造函数与析构函数
相关文档
最新文档