目录
前言
一、复合类
二、友元函数和静态成员
三、多态
四、运算符重载
五、类模板的类外实现
六、杂七杂八
前言
不知不觉一个学期又过去了,我也马上就要大二了,在网课的荼毒和自己的摆烂下,导致不能单杀C艹,特此在这里攻克一下自己的薄弱点。
一、复合类
其实把一个类中的另一个类当作普通数据成员就好了,保险起见在函数参数里加“&“。
二、友元函数和静态成员
1.静态成员
类的所有对象共用 一个存储空间 描述这一类的对象 共有的数据例子:总分,统计时的数字。
class CMan {
string szName;//区分不同的人
float height, weight;//保存一个人的身高和体重信息
float figureQuota; //保存一个人的体重指标信息
static int peopleTotal; //保存群体的总人数
static float quotaSum; //保存群体的全部体重指标之和
public:
CMan(string name, float h, float w);
float computeQuota();//计算体重指标 public :
float getDiffToAverage(); //查看体重指标与群体平均指标的差
float getQuota();//查看体重指标
~CMan();//消除一个人对群体平均体重指标的影响
};
int CMan::peopleTotal=0;
float CMan::quotaSum=0;//别忘了声明,=0是为了一般情况下的计数
静态成员是属于整个类的,而不是属于该类的特定的对象的。
(1)静态成员的初始化:
只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间。
静态数据成员在程序编译时分配空间,到程序结束时才释放空间。
静态数据成员的初始化只能在类体外进行,若不初始化,系统会默认赋值(比如数值型数据默认为0)。
(2)静态成员常用的场合
用来保存流动变化的对象个数。
作为一个 标志 ,指示一个特定的动作是否发 生。一个指向链表第一个成员的指针。
class A
{ int a;
static int num;
public:
A():a(1){num++;cout<<"Constructing...."<<" "
<
运行结果:
Constructing.... 1
Constructing with reference....2
Coping Constructing...3
Destructing...3
Destructing...2
Destructing...1
2.静态成员函数
静态成员函数不能访问非静态数据成员和非静态成员函数,它只能访问静态数据成员和其他的静态成员函数
静态成员函数的作用是为了能处理静态数据成员。
#include
#include
using namespace std;
const double PI=3.1415;
class Cylinder
{public:
Cylinder(double r):radius(r){};
static double getHeight(){return height;};
void static setHeight(double h){height=h;};
double volume();
private:
double radius;
static double height; //把height定义为静态成员
};
double Cylinder::volume()
{ return PI*radius*radius*height;}
double Cylinder::height=10; //在类体外对静态数据成员height初始化
int main()
{
cout<
别死脑筋,构造函数参数爱写几个写几个,不一定全写
3.友元(其实能不用就不用)
(1)为了让类外的函数或另一个类,可以访问类中的私有成员,可以将它们声明为友元。
友元的声明只能出现在类定义的内部,以关键字friend声明。
友元不是本类的成员,所以不受访问控制影响。
友元的引入破坏了类的封装性和数据的隐藏性,请小心使用。
class Time {
int hour;
int minute;
int sec;
public: Time(int,int,int);
friend void display(Time &); //声明display为Time类的友元
};
Time∷Time(int h,int m,int s) //构造函数
{ hour=h; minute=m; sec=s; }
void display(Time& t)
//友元不是Time类的成员,所以只能通过对象访问私有成员
{ cout<
(2)将另一个类的成员函数声明为友元
class Date; //对Date类的提前引用声明
class Time {
public:
void display(Date &);
//display是成员函数,形参是Date类对象的引用
};
class Date {
public:
friend void Time∷display(Date &);
//声明Time中的display函数为友元成员函数
};
友元类说实话没大用,就不码字了(嘻嘻)。
三、多态
在程序中同一符号或名字在不同情况下具有不同解释的现象称为多态性。
1.虚拟继承(其实这是属于继承的,不过这个和继承风格不太搭)
主要是在探究解决二义性的方法:(1)使用作用域运算符“::”(2)重定义有冲突的成员
虚拟继承可解决重复继承时继承多次简接基类,使公共基类的成员在其派生类中只产生一个拷贝
虚基类:如果某个基类被声明为虚基类,那么在被重复继承时,在派生类对象实例中只存储一个副本(若不声明为虚基类,就会出现多个副本)。
在从基类派生新的类时,将这个基类用virtual关键字说明为虚基类。例如:
class BASE1 : virtual public BASE
某构造函数的实现:
CStudentOnJob(string _name, int _stuNo, string _title, string _research):
CPerson(_name),
CStudent(_name, _stuNo),
CTeacher(_name, _title),
research(_research)
{ cout<<"CStudentOnJob Constructor"<
构造方法执行过程:如果缺省,Cperson就会调用不带参数的构造方法,姓名并没有赋值进去。
1.
使用参数初始化
Cperson
部分;
2.
构造
CStudent
部分,忽略
CStdent
用于
Cperson
的部分
3.
构造
CSTeacher
部分,忽略
CSTeacher
用于
Cperson
的部分
4.
构造
CStudentOnJob
部分
静态联编,是指这种联编在编译阶段完成的,即在编译阶段就必须确定标识符(函数名)与代码之间的对应关系。由于联编过程是在程序运行前完成的,所以又称为早期联编。
静态联编能够实现编译时多态。
动态联编是指根据目标对象的动态类型(而不是静态类型)在程序运行时(而不是在编译阶段)将函数名绑定到具体的函数实现上。
动态联编可以实现运行时多态。
2.纯虚函数: virtual <函数返回类型> <函数名>(<参数表>) = 0;
3.抽象类:
包含纯虚函数的类称做抽象类。(我才知道~)
由于无法实例化一个含纯虚函数的抽象类,因而不能创建抽象类的对象。
抽象类不能用作变量类型、函数返回和显式转换的类型,但可定义指向抽象类的指针或引用。
四、运算符重载
其实内容很简单,怕自己忘了怎么声明再提一嘴
CComplex& operator += (const CComplex& r_c)
用友元函数重载(参数中必须有一个类型为类对象或类对象引用)
friend Increase & Increase::operator++(int) //(后增量)
friend Increase operator++(Increase& a, int)
输入输出运算符重载:
friend ostream & operator << (ostream & stream, const 类名 &obj )
{ stream<<"注意区分单双引号"<
friend istream & operator >> ( istream &stream, 类名 &obj )
{ stream>>obj.a;// 函数体
return stream;
}
用数组判断是否出界”[]“运算符:
#include
#include
using namespace std;
const int SIZE=10;
class VECTOR{
protected:
int table[SIZE];
public:
VECTOR(){
for(int i=0;i<=SIZE-1;i++)
table[i]=i;}
int& operator[ ](int index){
if((index<0)||(index>SIZE-1)){
cout<<"Index out of boundsn";
exit(0);
}
return table[index];
}
};
int main()
{
VECTOR label;
cout<



