/* * Main.cpp * * Created on: 2015-7-24 * Author: feiruo */ /* * 类与对象: * * 1.抽象: * 面向对象方法中的抽象,是指对具体问题或对象的概括,抽出一类对象的公共性质并加以描述的过程。 * 数据抽象:描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征; * 行为抽象:描述某类对象的共同行为或功能的特征。 * * 2.封装: * 封装就是将抽象得到的数据和行为或功能相结合,形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机结合。形成类,其中的数据和函数都是类的成员。 * *class Clock{ public: void setTime(int newH,int newM,int newS); void showTime(); private: int hour,minute,second; }; * * 3.继承: * 面向对象语言中类的继承机制允许程序员在保持原有类特性的基础上,进行更具体更详细的说明。 * * 4.多态: * 从广义上讲,多态性是指一段程序能够处理多种类型对象的能力。在C++语言中,这种多态性可以通过强制多态、重载多态、类型参数化多态、包含多态4中形式来实现。 * 强制多态是通过一种类型的数据转换成另一种类型的数据来实现的。重载是指给同一个名字赋予不同的含义。包含多态和形参数化多态属于一般多态性,是真正的多态性。 * * 5.类的定义: * 在面向对象程序设计中,程序模块是由类构成的。类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述。 * class 类名称{ public: //外部接口; private: //私有成员; protected: //保护型成员; }; * * 6.对象: * 类是一种抽象机制,它描述的是一类事物的共同属性和行为。类的对象就是该类的某一种特定实体(实例化). * 采用的一般方式: * 类名称 对象名; * * 7.类的成员函数: * (1)成员函数的实现: * 函数的原型声明要写在类体中,原型说明了函数的参数表和返回值类型。而函数的具体实现是写在类定义之外的。与普通函数不同的是,实现成员函数时要指明类的名称,具体形式为: * 返回值类型 类名::函数成员名(参数表){ //函数体; } * (2)成员函数调用中的目的对象: * 调用一个成员函数与调用普通函数的差异在于,需要使用"."操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象。 * * (3)带默认形参值得成员函数: * 如:类Clock中的:void setTime(int newH,int newM,int newS); * * (4)内联成员函数: * 函数的调用过程中要消耗一些内存资源和运行时间来传递参数和返回值。内联函数的声明有两种方式: * 隐式声明: * class Clock{ public: void setTime(int newH,int newM,int newS); void showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }; private: int hour,minute,second; }; * * 显式声明: * inline void Clock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; } *为了保证定义的简洁,可以使用inline关键字显式声明的方式。即在函数体实现时,在函数返回值类型前加上inline,类定义中不加入showTime的函数体。 * * 8.构造函数: * 构造函数的作用是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。构造函数也是类的一个成员函数,除了一般成员函数特征之外,还有一些特殊的性质: * (1)构造函数的函数名与类名一致,而且没有返回值。 * (2)构造函数一般被声明为公有函数。 * (3)只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数调用的代码。因此,构造函数在对象被创建的时候将被自动调用。 class Clock{ public : Clock(){}; } * (4)作为类的成员函数,构造函数可以直接访问类的所有数据成员,可以是内联函数,可以带有参数表,可以重载。 * * 9.复制构造函数: * 复制构造函数是一种特殊函数,具有一般构造函数的特性,其形参是本类的对象的引用。其作用是使用一个已经存在的对象初始化同类的一个新对象。 * class 类名{ public: 类名(); 类名(类名 &对象名); }; 类名::类名(类名 &对象名){ //函数体 }; * 复制构造函数的3种调用情况: * (1)当用类的一个对象去初始化该类的另一个对象时。 * (2)如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。 * (3)如果函数的返回值是类的对象,函数执行完成返回调用者时。 * * 10.析构函数: * 简单来说,析构函数和构造函数正好相反,它用来完成对象被删除前的一些清理工作。析构函数是在对象的生存期即将结束的时刻被自动调用。相应的内存空间也被释放。 * public: slh();//构造函数 ~slh();//析构函数 }; * * 11.类的组合: * 当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。创建对象时,既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。析构函数的调用执行顺序与构造函数的正好相反。 * 类名::类名():内嵌对象1(形参表),内嵌对象2(),...; * 其中,内嵌对象1(形参表),内嵌对象2(),...称为初始化列表,起作用是初始化内嵌对象; * */ #include "Main.h" #include "iostream" #include "cmath" using namespace std; class Clock{ public: void setTime(int newH,int newM,int newS); void showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }; private: int hour,minute,second; }; class Circle{ public: Circle(float r); float circumFrence(); float area; private: float radius; }; class slh{ public: slh();//构造函数 ~slh();//析构函数 }; Main::Main() { // TODO Auto-generated constructor stub } Main::~Main() { // TODO Auto-generated destructor stub }; class Point{ public: Point(int xx=0,int yy=0){ x=xx; y=yy; } Point(Point &p); int getX(){ return x; } int getY(){ return y; } private: int x,y; }; Point::Point(Point &p){ x=p.x; y=p.y; } class Line{ public: Line(Point xp1,Point xp2); Line(Line &l); double getLength(){return len;}; private: Point p1,p2; double len; }; Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2){ cout<<"Calling constructor of line"<<endl; double x=static_cast<double> (p1.getX()-p2.getX()); double y=static_cast<double> (p1.getY()-p2.getY()); len=sqrt(x*x+y*y); } Line::Line(Line &l):p1(l.p1),p2(l.p2){ cout<<"Calling the copy constructor of Line"<<endl; } int main(){ Point myP1(1,1),myP2(4,5); Line line(myP1,myP2); Line line2(line); cout<<"The length of the line is:"; cout<<line.getLength()<<endl; cout<<"The length of the line2 is:"; cout<<line2.getLength()<<endl; return 0; }