C++学习 18-11-23
1.常量成员(const成员)
1.在公有属性中定义一个 const int m_age;(常量成员),则一定需要在初始化列表中初始化。
class CPerson
{
private:
const int n_age; // 常量成员,一定要在初始化列表中初始化
int n_name;
public:
CPerson():n_age(123), n_name(100) // 初始化列表
{
}
};
2.常量函数(const函数)
1.不能修改类中的成员属性
class CPerson
{
private:
const int n_age; // 常量成员,一定要在初始化列表中初始化
int n_name;
public:
CPerson():n_age(123), n_name(100) // 初始化列表
{
}
public:
void Show()
{
n_name++;
}
void ConstShow() const // 常函数,不能修改类中的成员属性,因为this已经变为了const
{
n_name++;
}
};
3.常量对象(const对象)
1.只能使用常函数,普通函数不能调用。
class CPerson
{
private:
const int n_age; // 常量成员,一定要在初始化列表中初始化
int n_name;
public:
CPerson():n_age(123), n_name(100) // 初始化列表,常量成员必须在此处初始化,普通成员可以在此处,也可以在构造函数里
{
}
public:
void Show()
{
n_name++;
}
void ConstShow() const // 常函数,不能修改类中的成员属性,因为this已经变为了const
{
n_name++;
}
};
int main()
{
CPerson ps1;
ps1.Show();
ps1.ConstShow(); // 会出错,不可调用
const CPerson ps2;
ps2.Show(); // 会出错,不可调用
ps2.ConstShow();
system("pause");
return 0;
}
4.安全性只能升级,不能降级
1.可以进行下列操作
int a = 100;
const int *p1 = &a;
// 以下程序是错误的
const int b = 120;
int *p2 = &b;
5.类之间的关系
1.创建一个建模项目->UML类图。
这种类图是用来直观的表示程序中各个类之间的关系的图。
2.类之间的关系分为两大类: 横向关系和纵向关系
纵向关系就是继承关系,它的概念非常明确,也成为面向对象编程的三个重要特征之一。
横向关系较为微妙,按照UML的建议大体上可以分为四种:
1.依赖 (Dependency)
2.关联 (Association)
3.聚合 (Aggregation)
4.组合 (Composition)
它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合
3.创建一个组合关系的类
1.首先定义一个CPerson类,该类可以完成PersonSay()函数,这个函数是由两个对象的函数组成;
2.定义一个CHead类,该类完成的是PersonSay()函数中的一个对象的函数调用;
3.定义一个CHand类,该类完成的是PersonSay()函数中的另一个对象的函数调用;
4.在这个过程当中,CHead类与CHand类的关系就是组合关系。
class CHead
{
public:
void Say()
{
cout << "Head Mouth Say!" << endl;
}
};
class CHand
{
public:
void HandMove()
{
cout << "Hand Move!" << endl;
}
};
class CPerson
{
private:
CHead ps_head;
CHand ps_hand;
public:
CPerson()
{
}
public:
void PersonSay()
{
ps_head.HeadSay();
ps_hand.HandMove();
}
};
int main()
{
CPerson ps1;
ps1.PersonSay();
system("pause");
return 0;
}
4.定义一个依赖关系
1.首先定义一个CComputer类,这个类中可以实现Code函数;
2.其次在CPerson类中定义一个Coding函数,传入CComputer类对象的引用,并在其中调用该对象的Code函数。
class CComputer
{
public:
void Code()
{
cout << "码代码..." << endl;
}
};
class CPerson
{
private:
public:
CPerson()
{
}
public:
void Coding(CComputer& cp)
{
cp.Code();
}
};
int main()
{
CPerson ps1;
ps1.Coding();
system("pause");
return 0;
}
5.定义一个关联关系类
1.首先需要理解什么是关联关系,所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
2.创建一个朋友CFriend类,其中包括friend的人品,人品大于等于5则可以交朋友。
#include<iostream>
#include<time.h>
using namespace std;
class CFriend
{
public:
int f_rp;
public:
CFriend()
{
f_rp = rand() % 10;
}
public:
void PlayTogether()
{
cout << "爸爸带你飞..." << endl;
}
};
class CPerson
{
private:
CFriend *p_friend;
public:
CPerson()
{
p_friend = 0;
}
public:
void FindFriend(CFriend *one_friend)
{
if(one_friend->f_rp >= 5)
{
p_friend = one_friend;
}
}
void LOL()
{
if(p_friend)
{
p_friend->PlayTogether();
}
else
{
cout << "孤独..." << endl;
}
}
};
int main()
{
srand((unsigned int)time(0));
CFriend new_friend;
CPerson ps1;
ps1.FindFriend(&new_friend);
ps1.LOL();
system("pause");
return 0;
}
6.定义一个聚合类
class CPerson
{
private:
public:
CPerson()
{
}
public:
};
class CFamily
{
private:
CPerson *p_family[10];
public:
CFamily() // 初始化家庭指针数组为空(每个元素都为0)
{
for(int i=0; i<10; i++)
{
p_family[i] = 0;
}
}
public:
void PushPerson(CPerson *person)
{
int count = 0;
while(p_family[count])
{
count++;
}
p_family[count] = person;
}
};
int main()
{
CPerson ps1;
CFamily family;
family.PushPerson(&ps1);
system("pause");
return 0;
}
7.依赖关系和关联关系没有生命周期,组合关系和聚合关系是有生命周期的。
7.整体程序
#include <iostream>
#include <time.h>
#include <string>
using namespace std;
class CHead
{
private:
public:
void HeadSay()
{
cout << "HeadSay" << endl;
}
};
class CHand
{
private:
public:
void HandMove()
{
cout << "HandMove" << endl;
}
};
// 定义一个与CPerson呈依赖关系的CComputer类
class CComputer
{
public:
void Code()
{
cout << "码代码...." << endl;
}
};
// 定义一个关联类
class CFriend
{
public:
int f_rp;
public:
CFriend()
{
f_rp = 10;
}
public:
void PlayTogher()
{
cout << "爸爸带你飞" << endl;
}
};
class CPerson
{
private:
CHead head;
CHand hand;
CFriend *p_friend;
public:
CPerson()
{
p_friend = 0;
}
public:
void FindFriend(CFriend *one_friend)
{
if(one_friend->f_rp >= 5)
p_friend = one_friend;
}
void Play()
{
if(p_friend)
p_friend->PlayTogher();
else
{
cout << "我自己飞" << endl;
}
}
void PersonSay()
{
head.HeadSay();
hand.HandMove();
}
void Coding(CComputer& cp)
{
cp.Code();
cout << "掉头发....." <<endl;
}
};
// 定义一个与CPerson是聚合关系的类
class CFamily
{
public:
CPerson *p_family[10];
public:
CFamily()
{
for(int i=0; i<10; i++)
p_family[i] = 0;
}
public:
void PushPerson(CPerson *person)
{
int i = 0;
while (p_family[i])
{
i++;
}
p_family[i] = person;
}
void AllFamilyCoding(CComputer& cp)
{
int i = 0;
while (p_family[i])
{
p_family[i]->Coding(cp);
i++;
}
}
};
int main()
{
srand((unsigned int)time(0));
CComputer cp;
CFriend one_friend;
CPerson ps1;
ps1.PersonSay();
ps1.Coding(cp);
ps1.FindFriend(&one_friend);
ps1.Play();
// 测试CFamily类
CFamily c_family;
c_family.PushPerson(&ps1);
c_family.AllFamilyCoding(cp);
system("pause");
return 0;
}