第9章关于类和对象的进一步讨论 91构造函数 9.2析构函数 9.3调用构造函数和析构函数的顺序 9.4对象数组 9.5对象指针 9.6共用数据的保护 9.7对象的动态建立和释放 9.8对象的赋值和复制 9.9静态成员 910友元 9.11类模板
第9章 关于类和对象的进一步讨论 9.1 构造函数 9.2 析构函数 9.3 调用构造函数和析构函数的顺序 9.4 对象数组 9.5 对象指针 9.6 共用数据的保护 9.7 对象的动态建立和释放 9.8 对象的赋值和复制 9.9 静态成员 9.10 友元 9.11 类模板
9.1构造函数 9.1.1对象的初始化 类的数据成员是不能在声明类时初始化 怎样对类的数 据成员进行初 始化?
9.1 构造函数 9.1.1 对象的初始化 类的数据成员是不能在声明类时初始化 怎样对类的数 据成员进行初 始化?
类中所有的成员都是公用的,则可以在定义对象时对数 据成员进行初始化 class Time public:. 如果数据成员是私有的,或者 hour; 类中有private或protected的成员, minute; 就不能用这种方法初始化 sec; 为 Time t1={14,56,30}; 和结构体变量的初始化是差不多 的,在一个花括号内顺序列出各 公用数据成员的值,两个值之间 用逗号分隔
类中所有的成员都是公用的,则可以在定义对象时对数 据成员进行初始化 class Time {public: hour; minute; sec; }; Time t1={14,56,30}; 和结构体变量的初始化是差不多 的,在一个花括号内顺序列出各 公用数据成员的值,两个值之间 用逗号分隔 如果数据成员是私有的,或者 类中有private或protected的成员, 就不能用这种方法初始化
例8.3将例8.2的程序 int main()) 调用set time函数来 改用含成员函数的类 Time t1; 为数据成员赋值 来处理。 t1.set time()月 个类定义了多 #include t1.show time(); 个对象,而且类 using namespace std; Time t2; 中的数据成员比 class Time t2.set time(); 较多,那么,程 public: t2.show time(); 序就显得非常臃 void set_time(); return 0; 肿烦琐。 void show time(); 侧1但 private: void Time:set time() int hour; cin>>hour;cin>>minute; int minute; cin>>sec; int sec; void Time:show time() cout<<hour<<":"<<minute<<":"< 运行情况与程序(a)相同 sec<<endl;
例8.3 将例8.2的程序 改用含成员函数的类 来处理。 #include using namespace std; class Time {public: void set_time( ); void show_time( ); private: int hour; int minute; int sec; }; int main( ) {Time t1; t1.set_time( ); t1.show_time( ); Time t2; t2.set_time( ); t2.show_time( ); return 0; } 运行情况与程序(a)相同 void Time∷set_time( ) { cin>>hour; cin>>minute; cin>>sec; } void Time∷show_time( ) { cout<<hour<<″:″<<minute<<″:″<< sec<<endl; } 用成员函数来对对 象中的数据成员赋 初值 调用set_time函数来 为数据成员赋值 一个类定义了多 个对象,而且类 中的数据成员比 较多,那么,程 序就显得非常臃 肿烦琐
9.1.2构造函数的作用 C++提供了构造函数(constructor)来处理对象的初始化 构造函数是一种特殊的成员函数 不需要用户来调用它 在建立对象时自动执行 特点 构造函数的名字必须与类名同 名不能由用户任意命名 不具有任何类型,不返回任何值 功能是由用户定义的, 用户根据初始化的要 求设计函数体和函数 参数
9.1.2 构造函数的作用 C++提供了构造函数(constructor)来处理对象的初始化 构造函数是一种特殊的成员函数 不需要用户来调用它 在建立对象时自动执行 构造函数的名字必须与类名同 名不能由用户任意命名 不具有任何类型,不返回任何值 功能是由用户定义的, 用户根据初始化的要 求设计函数体和函数 参数 特 点
a1在例??其神上定)构造成员函数 #include using namespace std; void Time:set time() class Time cin>>hour; public: 定义构造函 给成员变 cin>>minute; Time() 数,函数名 量赋值 与类名相同 cin>>sec; (hour-0; minute-0; sec-0; 数据成员 赋初值 void Time:show time() void set time(); cout<<hour<<""<<minute<<" void show time() rivate: "<<sec<<endl; int hour; /私有数据成员 int minute; int sec;
例9.1 在例8.3基础上定义构造成员函数 #include using namespace std; class Time {public: Time( ) {hour=0; minute=0; sec=0; } void set_time( ); void show_time( ); private: int hour; //私有数据成员 int minute; int sec; }; 定义构造函 数,函数名 与类名相同 数据成员 赋初值 void Time∷set_time( ) {cin>>hour; cin>>minute; cin>>sec; } void Time∷show_time( ) { cout<<hour<<″:″<<minute<<″ :″<<sec<<endl; } 给成员变 量赋值
建立对象t1,同时调用构 int main( 造函数t1.Time() Time t1; t1.set time() t1.show_time(); 虞 Time t2;- 建立对象1,同时调用构 造函数tl.Time() t2.show time() return 0; 程序运行的情况为: 102554 (从键盘输入新值赋给t1的数据成员) 10:25:54 (输出t1的时、分、秒值) 0:0:0 〔输出t2的时、分、秒值)
int main( ) {Time t1; t1.set_time( ); t1.show_time( ); Time t2; t2.show_time( ); return 0; } 建立对象t1,同时调用构 造函数t1.Time( ) 建立对象t1,同时调用构 造函数t1.Time( ) 程序运行的情况为: 10 25 54↙ (从键盘输入新值赋给t1的数据成员) 10:25:54 (输出t1的时、分、秒值) 0:0:0 (输出t2的时、分、秒值)
在类内对构造函数进行声明而在类外定义构造函数 Time(); 对构造函数在类内进行声明 在类外定义构造函数: Time:Time() hour-0; 得 minute-0; 在类外定义构造成员函 sec-0; 数,要加上类名Time 和域限定符“:
在类内对构造函数进行声明而在类外定义构造函数 Time( ); Time∷Time( ) {hour=0; minute=0; sec=0; } 在类外定义构造函数: 对构造函数在类内进行声明 在类外定义构造成员函 数,要加上类名Time 和域限定符“∷
int main() (1)在类对象进入其作用时调用构造函数 Time t1; t1.set time() (3)构造函数不需用户调用, 也不能被用户调用 t1.show time(); Time t2; (⑤)如果用户自己没有定义构造函数, t2.show_time(); 则C++会自动生成一个构造函数,只 return 0; 是这个构造函数的函数体是空的,也 没有参数,不执行初始化操作。 (2)与一般函数的一个重要的不同之点 Time:Time() 是没有返回值,因此也不需要在定义 hour-0; 构造函数时声明类型 minute-0; (4)在构造函数体中不仅可对数据成员 sec=0; 赋初值,而且可包含其他语句。但是 般不提倡在构造函数中加入与初始 化无关的内容,以保持程序的清晰
int main( ) {Time t1; t1.set_time( ); t1.show_time( ); Time t2; t2.show_time( ); return 0; } Time∷Time( ) {hour=0; minute=0; sec=0; } (1) 在类对象进入其作用时调用构造函数 (2) 与一般函数的一个重要的不同之点 是没有返回值,因此也不需要在定义 构造函数时声明类型 (3) 构造函数不需用户调用, 也不能被用户调用 (4) 在构造函数体中不仅可对数据成员 赋初值,而且可包含其他语句。但是 一般不提倡在构造函数中加入与初始 化无关的内容,以保持程序的清晰。 (5) 如果用户自己没有定义构造函数, 则C++会自动生成一个构造函数,只 是这个构造函数的函数体是空的,也 没有参数,不执行初始化操作
9.1.3带参数的构造函数 用户希望对不同的对象赋予不同的初值时可以采用 带参数的构造函数 构造函数首部的一般格式为: 构造函数名(类型1形参1,类型2形参2,.) 用户是不能调用构造函数的,因此无法采用常规的调用 函数的方法给出实参。 实参是在定义对象时给出的 定义对象的一般格式为: 类名对象名(实参1,实参2,);
类名 对象名(实参1,实参2,.); 9.1.3 带参数的构造函数 用户是不能调用构造函数的,因此无法采用常规的调用 函数的方法给出实参。 用户希望对不同的对象赋予不同的初值时可以采用 带参数的构造函数 构造函数首部的一般格式为: 构造函数名(类型 1 形参1,类型2 形参2,.) 实参是在定义对象时给出的 定义对象的一般格式为: