1.1面向对象的思想
以计算圆周长和面积的问题为例:
面向过程的程序设计语言使用高级语言提供的数值计算工具,从功能入手,把完成这个功能的过程罗列出来:输入半径计算,输出计算结果。
面向对象的程序设计允许程序员根据所要解决的问题创建新的数据类型,解决问题时需要考虑借助哪些工具以实现这些工具就是所谓的类:首先考虑要用什么工具,如果计算机能提供一个称为圆的工具,它可以以某种方式保存一个圆,告诉我们有关这个圆的某些特性,例如半径,周长,面积。我们只要定义一个圆类型的对象,以它提供的方式将圆保存在这个对象中即可。
1.2面向对象程序设计的特点
支持代码重用,把自定义好的类,提供给其他也需要处理圆的程序员使用。
实现隐藏,程序员被分为类创造者和类使用者,使用者不需要知道类是如何被创造的。
1.3类的定义
定义类就是定义一组操作数和一组对属性操作的函数,属性称为类的数据成员,函数称为类的成员函数。格式如下:
class 类名
{
[private:]
私有数据成员和成员函数;
public:
公有数据成员和成员函数;
};
[成员函数类型] 类名::成员函数名(形参表,可有默认值eg.int h=0,int m=0)
{
函数体
}
注意:
花括号后要有“;”表示定义结束。
私有成员只能被本类,友元成员函数,友元类,友元函数使用。
一般将用户必须知道的操作定义为public成员,而将数据成员定义为private成员,privateh和public出现次序任意,可反复出现多次,类体内不能对数据成员进行初始化。
内联成员函数:隐式声明,显示声明(前加inline)。
类的定义相当于库的接口,通常被写成一个头文件。
1.4对象的使用
1.4.1 类外定义对象:
定义了新的数据类型--类后,就可以定义这一类型的变量--对象。例如局部对象,全局对象,静态对象,动态对象,对象数组等,系统为对象中的数据成员分配内存空间,类的成员函数只占一份空间,为所有对象共享。
格式如下:
[存储类型] 类名 对象名1(实参表,与构造函数相对应),对象名2 ;
clock c1,c2;
clock *time=&c1;
1.4.2 类外使用对象的成员:
“."运算 / 通过指针,并且隐含了this指针;一般的全局函数只能引用对象的公有成员,成员函数才能用私有成员。
对象名 . 公有数据成员 /公有成员函数名(形参表,必须与类体内定义时的一致)
对象指针名->公有数据成员 /公有成员函数名(形参表,必须与类体内定义时的一致)
(*对象指针名) . 公有数据成员 /公有成员函数名(形参表,必须与类体内定义时的一致)
通过使用对象的公有成员实现对对象内部属性的了解和改变。
1.4.3对象数组:
类名 对象数组名[下标]={ };
构造函数通过各数组元素的形式对应,进行初始化,使用方式:
对象数组名[下标] . 成员名
1.4.4对象指针:
point * ptr;
point p1;
ptr=&p1;
1.5对象的构造与析构
为对象赋值,可以重载,用一个对象的值为另一个同类对象赋值调用复制构造函数;
有默认构造函数才可以在定义对象时没有实参,一般情况下对象的实参一定与构造函数相一致。
只要定义对象就需要构造,所以构造函数只是将构造初始化和赋初值合并在一起执行。
构造函数的定义:
class 类名
{
public:
类名 (形参表,可以有默认值eg.int a=0,int b=1)
{
函数体,进行赋值;
}
......
};
复制构造函数的定义:
class clock
{
public:
clock (形参表,可以有默认值eg.int a=0,int b=1)
{
函数体,进行赋值;
}
clock(clock &c); // 复制构造函数:类名(类名&引用对象名);
......
}
clock :: clock(clock &c)
{ // 复制构造函数体;
}
void main()
{
....... // 定义对象c1
clock c2(c1); // 复制构造函数被调用
}
析构函数:
public函数成员,没有返回值类型,也不能指定为void型,不接受任何参数。
class 类名
{
~ 类名(){...}
};
类名 :: ~ 类名()
{
函数体;
}
1.6常量对象、常量成员函数、常量数据成员
1.6.1常量对象
数据成员值必须初始化,后期不可再改变。
类名 const 对象名(初始化实参列表);
或者:
const 类名 对象名(初始化实参列表);
定义了常量对象后,就要确定访问哪些成员函数对于常量对象的数据成员值是安全的,它只能调用这类常量成员函数。
1.6.2常量成员函数
声明和定义时都说明为常量。
pubic:
[void print();]
void print() const;
1.6.3常量数据成员
类体中提供了一种常量数据成员的定义方式,数据成员声明前加const,支持对于几个对象分别有不同的常量数值相对应,只能在构造函数中进行初始化列表中完成。
class clock
{
private:
const int x;
public:
clock(int i):x(i){ }
}
void main()
{
clock a(10);
}
1.7静态数据成员和静态成员函数
静态数据成员属于类,只能在类内使用,实现类内不同对象的数据共享,但是存储具有全局性;为静态数据成员一次性分配空间,即静态数据成员的定义和初始化,是在类的实现文件中。
静态数据成员的调用方式:类名::静态数据成员名,或者,用属于此类的对象引用。
class clock
{
static int m; //类内声明
};
int clock::m=0;//类外定义
静态成员函数对静态数据成员进行操作,只需在类内函数声明时前加static,定义时不用写;只能对静态成员进行操作。
调用方式:
类名 :: 静态成员函数名 (参数表)
或者:
对象名 . 静态成员函数名(参数表)
1.8友元
提供给一些全局函数,其他类的成员函数(所有成员函数 / 部分成员函数)访问本类公有和私有成员的途径,但是友元关系不能传递,单向,不能被继承。
友元函数:
class point
{
public:
......
friend float dist(point &p1,point&p2)
{ int dx=p1.x-p2.x;
int dy=p1.y-p2.y;
return sqrt(dx*dx+dy*dy);
}
};
void main()
{
point pt1(1,1),pt2(4,5);
cout<
友元类:
class B
{...
F=friend class A;
...
};
时间 | 地点 | 内容 |
---|---|---|
2019.05.25 | 桃苑 | 第一篇模拟学习笔记 |
Ok,that's all! Thanks!
This is a link to more information!