对象:此对象,非彼对象,:-D,跟妹子无关(不过貌似也可以,,),闲言少叙,书归正传
我们可以把我们见到的一切事物都称为对象。它可以有形,可以无形,可以简单,可以复杂,但是对某一种具体的对象,比如公司。
抽象:
我们可抽象出所有公司都具有的属性,比如公司名字,地址,所属行业等,这些共同属性就构成了一种类型-公司类。由此得出计算机中类的理解,面对一个具体的问题(对象),首先进行抽象,得到这类具体问题的共有性质,一般的抽象应该包括两部分:数据抽象和行为抽象,前者描述的是对象的属性或状态,后者描述的是共同行为或功能。
封装:
封装就是将得到的数据和行为结合,形成一个有机体,也就是将数据和操作数据的函数代码结合,形成“类”,其中的数据和函数都是类的成员。
继承:
为了解决当前问题,我们一般会查看前人已经对这个问题的认识和研究成果,并对这些成果进行利用。这就是继承,这有这样才能在对问题有深入的了解。即,继承前人的成果。
多态:
多态是程序能够处理多种类型对象的能力,c++中通过强制多态,重载多态,类型参数多态,包含多态来实现。
类:
类是对问题的抽象描述,是对对象的相关函数和数据的封装。我们可以从另一个简单的角度理解类,例如,基本数据类型,像int,double等,我们声明一个类型变量
int i;
double j;
不仅仅是声明变量i用于存储int类的数据,更重要的是,限定对变量的操作,比如int类型的只能进行算数和比较运算等,这说明每一种数据类型包括了数据本身的属性和对数据的操作。因此c++中的类就可以看成是一种用户自定义的数据类型,定义一个类之后,就可以定义该类的变量,这个变量就称为这个类的对象(实例),这个过程也叫做类的实例化。
类的定义语法:
class 类名称
{
public:
外部接口;
protected:
保护型成员;
private:
私有成员;
};//注意这里有一个分号哟!
其中public,protected,private 分别代表成员的不同访问权限。注意,类中可以只声明函数的原型,函数的实现可以在类外面定义。
example:
class clock
{
public:
void settime(int newh,int newm,int news);
void showtime();
protected:
//保护型成员;
private:
int hour,minute,scent;
}
//类函数的实现
void clock::settime(int newh,int newm,int news)
{
hour=newh;
minute=newm;
scend=news;
}
void clock::showtime()
{
cout<<hour<<":"<<minute<<“:"<<scend<<endl;
}
类成员的访问权限:
public定义了类的外部接口,在类外部只能访问类的public成员。
private定义了私有成员,只能被本类的成员函数访问,类外部访问都是非法的
protected定义了保护类型成员,类似于私有成员,差别在于对继承过程中产生的新类的影响不同
类的成员函数
类的成员函数时类的行为,是程序算法的实现部分,是对封装数据的操作方法。
成员函数的声明与实现
函数的原型声明在类中,说明了函数的参数和返回值类型,具体实现是在类之外。与普通函数不同的是,类实现函数需要指明类的名称,形式如下:
返回值类型 类名 ::函数成员名(参数表)
{
函数体
}
另外类的成员函数也可以有默认形参值(即,函数实现的时候形参可以直接赋值)
内联函数:这个先不写
对象:
c++中类的对象就是类的一种实体(实例),如果将类看成是一种自定义类型,那么类的对象就可以看成是该类型的变量,形式如下:
类名 对象名;
定义了类及其对象,j就可以访问对象的公有成员,访问形式采用的是”.“操作符,一般形式是:
对象名.公有成员函数名(参数表) //注意不要忘记还有参数表哟!
另外还有构造函数和析构函数,构造函数的作用是在对象别处创建的时候,顺便对对象进行初始化,构造函数也是类的一个成员函数,但是构造函数的函数名与类名相同,而且没有返回值,构造函数通常被声明为公有函数,与构造函数类似的还有拷贝构造函数,这个先不写,等到以后学好引用后在写。
关于析构函数,则是对象的一个清除函数,析构函数是类的公有函数,它的名称是类名前加”~“,没有返回值,不接受任何参数,它在对象的生存周期即将结束的时候自动调用。
最后贴出个完整的类应用程序
有一个圆形泳池,需要在其周围建议圆形过道,并在其周围为上栅栏,栅栏价格35/米,过道20元/平方米,道宽三米,泳池半径键盘输入,求过道和栅栏造价
// example_1_2_class_swimmingpool.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream> using namespace std;
const float PI=3.1415926;
const float fenceprice=;
const float concreteprice=; class circle
{
public:
circle(float r);//构造函数,用于初始化类值
float cirsumference();
float area(); private:
float radius; };//注意类的最后有一个分号,跟在花括号之后,不常见
//类的实现
circle::circle(float r){radius=r;}//构造函数的实现 float circle::cirsumference()//计算圆的周长
{
return * PI * radius; }
float circle::area()//计算园的面积
{
return PI*radius*radius; } int _tmain(int argc, _TCHAR* argv[])
{
float radius;
float fencost,concretecost;
cout<<"Enter the radius of the pool:";
cin>>radius;
circle pool(radius);
circle poolrim(radius+); fencost=poolrim.cirsumference()*fenceprice;
cout<<"fencing cost is "<<fencost<<endl; concretecost=(poolrim.area()-pool.area())*concreteprice;
cout<<"concrete cost is "<<concretecost<<endl;
system("pause");
return ;
}
类的组合
类的组合描述的是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是包含于被包含的关系,当创建类的对象时,如果类具有内嵌对象成员,那么各个内嵌成员对象将首先被自动创建,在创建对象时,既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员初始化,因此理解这些对象的构造函数的被调用顺序就很重要。
组合类构造函数的定义形式为:
类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),...
{类的初始化}
其中,”内嵌对象1(形参表),内嵌对象2(形参表),...”称作初始化列表,作用是对内嵌对象初始化,另外对基本类型的数据成员也可以这样初始化,而且使用初始化列表比使用赋值语句的效率要高。例如上面的构造函数可以这样写:
circle::circle(float r):radius(r) {}
在创建组合类的对象时,不仅调用它自身的构造函数,还将调用其内嵌对象的构造函数,这时调用顺序是:
首先调内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的次序,然后执行本类构造函数的函数体。
但是析构函数的调用执行顺序与构造函数刚好相反。