①面向对象编程的基本概念
1.对象——实体
组成部分:{属性,行为}。
eg.一个学生可以是一个对象,那么这个学生的属性有学号,年级,班级等;行为有选课,考试,体侧等。
2.类——抽象
组成部分:{属性,行为}。
类是将所有对象的公有属性和行为抽象出来的。
eg.学校学生类,这个类的属性有有学号,年级,班级等;行为有选课,考试,体侧等。(这是从每一个对象公有的行为与属性中抽象出来的)
3.方法
类的行为的实现过程叫做类的方法。其实也就是类中成员函数的定义。即一个方法包含方法名(函数名),返回值类型,参数表,方法体(函数体)
4.消息
对象之间需要相互沟通,沟通的途径就是向对象发送消息。其实也就是对象调用类的成员函数的语句。即一条消息包含接收消息的对象名,对象需执行的行为名称(方法名),调用方法所需的参数。
②面向对象编程的四种机制
1.抽象-----------2.封装(封装的程度通过访问控制符来控制==访问控制符:public,protected,private)----------3.继承-------------4.多态(多态的两种方式:虚函数,函数重载)
③关于访问控制符
public:公有成员。
可以访问的地方:
1.类的对象
2.类内
3.公有继承(基类的公有成员和受保护的成员在派生类中依然是公有成员和受保护的成员,私有成员只能通过基类的接口去访问,派生类的对象和成员函数均不能直接访问)的派生类的成员函数,及类的对象都可以访问
protected:受保护的成员。
可以访问的地方:
1.类内
2.具有友元关系的函数或者类(友元函数是可以使用那个类的所有成员的,友元类是类中定义的所有的成员函数都是友元函数,都可以访问那个类的所有成员;但是注意,友元类的对象是不可以去直接访问那个类的公有,受保护的,及私有成员的,只能通过成员函数这个接口进行)
3.公有继承的派生类的成员函数可以访问
4.受保护继承(基类的非私有成员在派生类中全都变成了受保护的成员,私有成员只能通过基类的接口去访问私有成员只能通过基类的接口去访问,派生类的对象和成员函数均不能直接访问)的成员函数可以访问
5.私有继承(基类中的非私有成员在派生类中全部变成私有成员,私有成员还是私有成员,只能通过基类的接口去访问,派生类的对象和成员函数均不能直接访问)的派生类的成员函数可以访问
private:
1.不管是类内的成员函数还是还是公有继承还是私有继承还是受保护的继承都只能通过基类的成员函数这个接口去访问
2.但是友元函数或友元类可以直接访问那个类的私有成员
#include
using namespace std;
#include
class A
{
public:
A(int k) :hello(k){};
friend class B;
public:
int hello;
};
class B
{
public:
B(int i) :date(i){};
void print(A a);
private:
int date;
};
void B::print(A a)
{
cout << date+a.hello << endl;
}
int main(void)
{
A a(3);
B b(2);
b.print(a);
system("pause");
return 0;
}
//友元函数或者友元类(具有友元关系的函数或类)出现的原因,有上面所说的继承也好,对象也好,都是没有办法直接访问到私有成员的,所以为了在类外可以不借助与基类的成员函数这个接口去访问,可以直接用自己的东西去访问那个类的私有成员,于是就出现了友元关系,和它具有朋友关系的就可以通过他自己的成员函数去访问那个类的私有成员
④类
class 类名
{
public:
<成员函数或数据成员的声明>
protected:
<成员函数或数据成员的声明>
private:
<成员函数或数据成员的声明>
}
<成员函数的类外实现>
关于上面的类的声明及定义方法有几点要注意的:
1.成员函数的定义可以写在类内,也可以写在类外。写在类内系统是将成员函数默认成内联函数,写在类外就是一般的函数。
(推荐写在类外,这样可以让类的声明更加简洁清楚)
(更加推荐将类的声明写一个头文件,类的定义写一个cpp,主函数再写一个cpp)
2.数据成员的初始化不可以在类内进行
即:private:
int date=2;是不被允许的,虽然编译可以过但是会报警
对于非静态的数据成员初始化应该在构造函数的初始化列表里进行,或者是不初始化,那么定义对象的时候,系统会随机给对象的数据成员赋一组数
对于静态的数据成员,初始化要在类外进行
即:class Date
{
private:
static int date;
}
int Date::date=2;
3.数据成员的定义顺序最好是按照成员的类型大小去定义,由小至大去声明有利于提高空间的利用率
4.::作用域限定符
5.private 及 protected 类的对象都不能直接访问