31类和对象 3.1.4对象成员初始化 在实际应用中往往需要多个类,这时就可能把一个已定义类的对象作为另一 个类的成员。为了能对这些对象成员进行初始化,构造函数定义格式: 类名>∷:<构造函数名〉(形参表):对象1(参数表),对象2(参数表),…,对象 n(参数表) 对象1、对象2、…、对象n就是该类使用的其他类的对象,冒号“:”后面 的列表称为成员初始化列表。 说明: (1)对象成员必须初始化,但不能将对象成员直接在构造函数体内进行初始化 (2)对象成员初始化时,必须有相应的构造函数,且多个对象成员的构造次序不 是按初始化成员列表的顺序,而是按各类声明的先后次序进行的。 (3)对象成员初始化也可在类的外部进行,但必须与构造函数在一起 (4)事实上,成员初始化列表也可用于类中的普通数据成员的初始化
3.1类和对象 3.1.4对象成员初始化 在实际应用中往往需要多个类,这时就可能把一个已定义类的对象作为另一 个类的成员。为了能对这些对象成员进行初始化,构造函数定义格式: <类名>::<构造函数名>(形参表):对象1(参数表), 对象2(参数表), …, 对象 n(参数表) { } 对象1、对象2、…、对象n就是该类使用的其他类的对象,冒号“ : ”后面 的列表称为成员初始化列表。 说明: (1)对象成员必须初始化,但不能将对象成员直接在构造函数体内进行初始化。 (2)对象成员初始化时,必须有相应的构造函数,且多个对象成员的构造次序不 是按初始化成员列表的顺序,而是按各类声明的先后次序进行的。 (3)对象成员初始化也可在类的外部进行,但必须与构造函数在一起。 (4)事实上,成员初始化列表也可用于类中的普通数据成员的初始化
31类和对象 3.1.5静态成员 静态数据成员 是同一个类中所有对象共享的成员,不是某一对象的成员。用静态数据成员 可以节省内存,是所有对象所公有的,对多个对象来说,静态数据成员只存 储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,它的值 是可以更新的。静态数据成员是静态存储的,具有静态生存期。定义静态数 据成员: (1)使用关键词 static声明静态数据成员。 (2)对静态数据成员进行初始化。静态数据成员要分配空间,不能在类声明中 进行初始化。静态数据成员初始化在类的外部进行,它的格式如下: <数据类型><类名>:<静态数据成员名>=<值> >静态成员函数 静态成员函数属于类的静态成员,不是对象成员。对静态成员的引用不需 要用对象名 在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用 类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对 象来引用。 公有的静态成员函数既可以有通过相应的对象访问,也可以通过其所属的 类名来引用
3.1类和对象 3.1.5静态成员 ➢ 静态数据成员 是同一个类中所有对象共享的成员,不是某一对象的成员。用静态数据成员 可以节省内存,是所有对象所公有的,对多个对象来说,静态数据成员只存 储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,它的值 是可以更新的。静态数据成员是静态存储的,具有静态生存期。定义静态数 据成员: (1) 使用关键词static声明静态数据成员。 (2) 对静态数据成员进行初始化。静态数据成员要分配空间,不能在类声明中 进行初始化。静态数据成员初始化在类的外部进行,它的格式如下: <数据类型><类名>::<静态数据成员名>=<值> ➢ 静态成员函数 ▪ 静态成员函数属于类的静态成员,不是对象成员。对静态成员的引用不需 要用对象名。 ▪ 在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用 类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对 象来引用。 ▪ 公有的静态成员函数既可以有通过相应的对象访问,也可以通过其所属的 类名来引用
31类和对象 3.1.6友元 [例 Ex FriendFunc]友元函数的使用。 #include iostream. h> class cpoint (public CPointoim x CPoint( unsi gned x, unsigned y X-X, m y void Print o cout < Point(< m x<<"<< m y<<")"<< endl; friend CPoint Inflate( CPoint&pt, int offset);//声明一个友元函数 privat unsigned m X, m y CPoint inflate( CPoint&pt, int offset)//友元函数的定义 CPoint ptTemp= pt ptTemp. m X+= oFfset 直接改变私有数据成员mx和my ptTemp. m y + oFfset return ptTemp: CPoint pt( 10, 20 pt. Print o /调用友元函数 pt. Print o
3.1类和对象 3.1.6友元 [例Ex_FriendFunc] 友元函数的使用。 #include <iostream.h> class CPoint {public: CPoint() { m_x = m_y = 0; } CPoint( unsigned x, unsigned y ) { m_x = x; m_y = y; } void Print() { cout << "Point(" << m_x << ", " << m_y << ")"<< endl; } friend CPoint Inflate(CPoint &pt, int nOffset); // 声明一个友元函数 private: unsigned m_x, m_y; }; CPoint Inflate ( CPoint &pt, int nOffset ) // 友元函数的定义 { CPoint ptTemp = pt; ptTemp.m_x += nOffset; // 直接改变私有数据成员m_x和m_y ptTemp.m_y += nOffset; return ptTemp; } void main() { CPoint pt( 10, 20 ); pt.Print(); pt = Inflate(pt, 3); // 调用友元函数 pt.Print(); }
31类和对象 3.17常类型 常对象 常对象是指对象常量,定义格式:<类名> const<对象名 定义常对象要进行初始化,该对象不能再被更新,修饰符 const可以放在类名后 面,也可以放在类名前面 常指针和常引用 常指针也是使用关键字 cons t来修饰的。有三种形式 第一种形式是将 const放在指针变量的类型之前,表示声明一个指向常量的 指针。此时,在程序中不能通过指针来改变它所指向的数据值,但可以改变 指针本身的值 第二种形式是将 const放在指针定义语句的指针名前,表示指针本身是一个 常量,称为指针常量或常指针。因此,不能改变这种指针变量的值,但可以 改变指变量所指向的数据值。 第三种形式是将 const在上述两个地方都加,表示声明一个指向常量的指针 常量,指针本身的值不可改变,而且它所指向的数据的值也不能通过指针改 变
3.1类和对象 3.1.7常类型 ➢ 常对象 常对象是指对象常量,定义格式:<类名> const <对象名> 定义常对象要进行初始化,该对象不能再被更新,修饰符const可以放在类名后 面,也可以放在类名前面。 ➢ 常指针和常引用 常指针也是使用关键字const来修饰的。有三种形式。 ▪ 第一种形式是将const放在指针变量的类型之前,表示声明一个指向常量的 指针。此时,在程序中不能通过指针来改变它所指向的数据值,但可以改变 指针本身的值。 ▪ 第二种形式是将const放在指针定义语句的指针名前,表示指针本身是一个 常量,称为指针常量或常指针。因此,不能改变这种指针变量的值,但可以 改变指变量所指向的数据值。 ▪ 第三种形式是将const在上述两个地方都加,表示声明一个指向常量的指针 常量,指针本身的值不可改变,而且它所指向的数据的值也不能通过指针改 变
31类和对象 [例 Ex ConstPara]常参数的函数传递。 #include iostream. h> class cone t public void print(const int xp, int n) //使用常参数 {cout<"{"<<*p; for (int i=1: i<n; i++) cout<<","<*(p+i) cout<<""<<end1 private void main ( int array[6]={1,2,3,4,5,6} COne one one print (array, 6)
3.1类和对象 [例Ex_ConstPara] 常参数的函数传递。 #include <iostream.h> class COne { public: void print(const int *p, int n) // 使用常参数 { cout<<"{"<<*p; for (int i = 1; i<n; i++) cout<<", "<<*(p+i); cout<<"}"<<endl; } private: }; void main() { int array[6] = {1, 2, 3, 4, 5, 6}; COne one; one.print(array, 6); }