注:以下为个人见解,有可能错误,欢迎批评指出!
C++的成员分类:
-
按照成员在类中扮的角色分:
数据成员、成员函数。
-
按照成员自身的使用特性分://特性:特殊性质
普通成员、静态成员、常量成员、友元、对象成员
下以成员自身使用特性来分别介绍
一、普通成员
即前面所学,不再做介绍。
二、静态成员
A.静态数据成员
定义格式:static 类型 数据成员名表;//数据成员名表即(一个到多个)变量
说明:
-
- 一般在类中定义为私有成员、保护成员。
- 初始化(分配内存空间):应该在程序开始运行时即生成,必须在任何函数在外进行初始化。
格式:类型 类名::静态数据成员名=初值 //格式类似类外成员函数定义,static 不用管了,不允许使用 - 静态数据成员在一个类(类是定义的对象的集合)中只有一个,属于所有对象,为所有对象所共享。
如:普通数据成员在一个类中可以有多。 ob1.x ob2.x 两个x数据成员(同名)均属于同一类。 - static 只是声明用,在类外不允许再用static
代码:只为说明静态数据成员的定义和初始化
1 #include<iostream> 2 using namespace std; 3 class counter 4 { 5 private: 6 static int count;//静态数据成员的定义 7 }; 8 int counter::count=100;//静态数据成员的初始化
B.静态成员函数
定义格式:在成员函数前加上static即可
调用方法:
①类名::静态成员函数名(实参表);
②对象名.静态成员函数名(实参表);
注:更偏爱①,更能说明静态成员函数属于类而不是属于哪个对象。
说明:
-
- 静态成员函数只能专门访问静态数据成员。
- static 只是声明用,在类外定义静态成员函数时不允许再用static。
- 通常用静态成员函数来处理静态数据成员。
代码:只为说明静态成员函数的定义
1 #include<iostream> 2 using namespace std; 3 class simple 4 { 5 private: 6 static int v1,v2,v3; 7 public: 8 static void sum(void) //静态成员函数的定义 9 { 10 v3=v1+v2; 11 } 12 }; 13 int simple::v1=0; 14 int simple::v2=0; 15 int simple::v3(0);
1 #include<iostream> 2 using namespace std; 3 class simple 4 { 5 private: 6 static int v1,v2,v3; 7 public: 8 static void sum(void); //静态成员函数在类内的声明 9 }; 10 int simple::v1=0; 11 int simple::v2=0; 12 int simple::v3(0); 13 void simple::sum(void) //在类外的定义 14 { 15 v3=v1+v2; 16 }
三、常量成员
常量成员(或对象)的关键就在常量二字,一经 定义 确定 ,其值不能更改。
A.常量成员函数
定义:与普通成员函数类似,在后加const(即使在类外定义也要加const)
说明:
1. 用于处理常量对象。
2. 可凭借const构成重载即使参数完全一样。(注:重载是参数的不同)
B.常量数据成员(C中学过、不再赘述)
定义:与普通数据成员类似,只需在成员名前加const即可,位置有两个。
C.常量对象(雾:大概率不是类中成员,在类外定义,除非是容器类)
定义:与普通对象定义类似,只需在成员名前加const即可,位置有两个。
1. const Myclass ob;
2. Myclass const ob; //Myclass 是类名
说明:
1. 常量对象定义时初始化后,数据成员的值不能更改。(常量性)
2. 需要常量函数才可操作常量对象。
四、友元
A.友元函数
作用:实现了非该类的函数可以访问该类的私有成员。
注:访问私有成员:只有该类的函数才可以访问私有成员。
方法:在类中声明,写上允许访问私有成员的函数,前加friend
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 class girl 5 { 6 private: 7 char*name; 8 int age; 9 public: 10 girl(char*na,int n) 11 { 12 name=new char[strlen(na)+1]; 13 if(name!=NULL) 14 { 15 strcpy(name,na); 16 } 17 age=n; 18 } 19 ~girl(void) 20 { 21 delete []name; 22 } 23 friend void disp(girl&g); //此处为友元函数的声明 24 } ;
B.友元类
作用:实现了非该类的某一类(例如类A)的所有函数可以访问该类的私有成员。
方法: eg. friend class A;即为A中的所有成员函数均可以访问该类的私有成员。
五、容器类(包含对象成员)
容器类:含对象成员的类称为容器类
A.容器类的构造函数
类名(形参表):对象名1(参数表1),……,对象名n(参数表n)
B.关于容器类的一些说明
创建容器类时先执行对象成员的构造函数,再执行容器类的构造函数。
析构时遵循先定义后释放。
代码
1 #include<string.h> 2 #include<hdate.h> 3 class person 4 { 5 private: 6 char *name; 7 char sex[2]; 8 Date birthday; //处理数据用已知的类,不必事事都到底层 9 public: 10 person(*na,*s,int y,int m,int d):birthday(y,m,d) //容器类的构造函数 11 { 12 name=new char[strlen(na)+1]; //在容器类构造函数内部,不必对对象成员初始化(在对象所属类已经初始化) 13 if(name!=NULL) 14 { 15 strcpy(name,na) 16 } 17 strcpy(sex,s); 18 } 19 ~person(void) 20 { 21 delete []name; 22 } 23 char *get_name(void) 24 { 25 return(name); 26 } 27 char *get_sex(void) 28 { 29 return(sex); 30 } 31 int get_year(void) 32 { 33 return(birthday.get_year()); 34 } 35 int get_month(void) 36 { 37 return(birthday.get_month()); 38 } 39 int get_day(void) 40 { 41 return(birthday.get_day()); 42 } 43 void print(void); 44 } 45 void person::print(void) 46 { 47 cout<<"姓名:"<<name<<endl; 48 cout<<"性别:"<<sex<<endl; 49 cout<<"出生日期:"<<birthday.get_year()<<"年"; 50 cout<<birthday.get_month()<<"月"; 51 cout<<birthday.get_day()<<"日"<<endl; 52 }