zoukankan      html  css  js  c++  java
  • c++面向对象学习

    目录

    谈面向对象(Object-oriented)... 1

    谈封装... 1

    谈继承... 2

    谈多态(Polymorphism)... 2

    谈虚函数... 2

    谈this指针... 4

    谈面向对象(Object-oriented

    “面向对象”是的观念是描绘世界用的,所以,你可以用真实生活中的经验去思考程序设计的逻辑。人是一个对象,人有眼睛、鼻子、耳朵。。。这些是他的属性,人可以走、可以跑、可以吃饭。。。这些也是属性。地球是一个对象,地球中又有许多对象。。。

    面向对象中的抽象可以理解为共性。

    谈封装

    封装指的是屏蔽具体的细节,只提供实现的接口。函数就是一种封装,你只要调用改该函数就可以实现功能,而不需要去关心功能是如何实现的。类是比函数更高级的封装,它中提供了三个成员修饰符来控制成员的访问权限:

    1.public //成员可以在类中以及类外使用

    2.private //成员只能在类中使用

    3.protected //成员在类中及其子类中可以使用

    数据抽象和封装的好处

    1. 避免类内部出现无意的、可能破坏对象状态的用户级错误。

    2. 随时间推移可以根据需求改变或缺陷(bug)报告来完善实现,而无需更改用户及代码。

    谈继承

    什么是继承

    “继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。

    继承的好处

    1. 可以重用代码。

    在同一个行业中,他们各业务流程往往有很大的相似性,但往往我们都是到一个项目中就重新写一套流程代码,或者粘贴以前的代码.可能有很多代码都是以前写过的重复代码.造成重复劳动.如果采用继承应该这样,首先在父类中做一个基本上大部分行业项目都必要的简洁的主流程.在子类中针对具体项目的特殊性做主流程充分的完善的补充.这样在每个项目中,只针对项目的特殊性编写代码,大大降低重复劳动.当然根据具体流程的复杂多可以划分多的继承层次,呈现一种继承的树结构,但一定的要保证层次一定要有实际的意义.

    2. 多态。

    谈多态(Polymorphism

    以相同的的指令去调用了不同的函数,这就是多态。多态靠虚函数来实现

    两个概念

    后期绑定或动态绑定:编译器无法再编译时期不断到底调用哪一个函数,必须在执行期才能判断之。

    前期绑定或静态绑定:非虚函数在编译时期就转换为固定地址的调用了。

    多态的目的是要让处理“基类之对象”的程序代码,能够完全无障碍地继续处理“派

    类之对象”。

    谈虚函数

    虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。

    clip_image002

    Upcasting(向上强制转换)将会造成对象的内容被切割(Object slicing) P70

    #include "stdafx.h"

    #include <iostream>

    class CShape

    {

    private:

    int m_color;

    public:

    CShape() {m_color = 0;}

    virtual void display() = 0; //纯虚函数,抽象类不需要实现该函数

    ~CShape() {}

    };

    class CRect : public CShape

    {

    private:

    int m_length,m_width;

    public:

    CRect()

    {

    m_length = 0;

    m_width = 0;

    }

    ~CRect() {}

    virtual void display()

    {

    std::cout<<"CRect"<<std::endl;

    }

    };

    class CCircle : public CShape

    {

    private:

    int m_radius;

    public:

    CCircle()

    {

    m_radius = 0;

    }

    ~CCircle() {}

    virtual void display()

    {

    std::cout<<"CCircle"<<std::endl;

    }

    };

    int _tmain(int argc, _TCHAR* argv[])

    {

    CRect rect;

    CCircle circle;

    CShape *shape[2] = {

    shape[0] = &rect,

    shape[1] = &circle

    };

    for(int i = 0;i < 2;i++)

    {

    shape[i]->display();

    }

    return 0;

    }

    谈this指针

    class CRect : public CShape

    {

    private:

    int x,y;

    public:

    void display()

    {

    }

    };

    CRect rect1,rect2;

    rect1.Setcolor(1);

    rect2.Setcolor(2);

    编译器实际上为你做出来的代码是

    CRect::Setcolor(1,(CRect*)&rect1);

    CRect::Setcolor(2,(CRect*)&rect2);

    不过CRect本身并没有声明Setcolor,它是从CShape中继承来的,所以编译器实际产生的代码是

    CRect::Setcolor(1,(CRect*)&rect1);

    CRect::Setcolor(2,(CRect*)&rect2);

    class CShape

    {

    ...

    public:

    void Setcolor(int color)

    {

    m_color = color;

    }

    };

    被编译器编译之后,其实是:

    class CShape

    {

    ...

    public:

    void Setcolor(int color,(CShape*)this)

    {

    this->m_color = color;

    }

    }

  • 相关阅读:
    构造方法中使用this的含义
    Android Bundle类
    Android中使用PULL方式解析XML文件
    Android 创建与解析XML(四)—— Pull方式
    File的getPath()和getAbsolutePath()和getCanonicalPath()的区别
    Android-取出SDcard卡下指定后缀名的文件
    page、request、session和application有什么区别?
    prepareStatement的用法和解释
    pageContext对象的用法
    使用JSP连接MySql数据库读取HTML表单数据进行存贮
  • 原文地址:https://www.cnblogs.com/jck34/p/2863996.html
Copyright © 2011-2022 走看看