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

    类的成员声明与定义

    声明一个类,则类就是一个类型,类不能直接访问其属性,这是与Python最大区别

    #include "pch.h"
    #include <iostream>
    using namespace std;
    
    struct Book
    {
        char title[40];
        char author[40];
        char subject[40];
        int book_id;
    };
    
    class Box
    {
    public:  //声明公共属性
        double length;
        double height ;
        double weight = 30;
        void setlength(double let);   //声明函数不定义
    
        void setheight(double het)    //声明函数并定义
        {
            height = het;
        }
    
        double getvolumn(void)
        {
            return length * height * weight;
        }
    
    };
    
    void Box::setlength(double let)  //使用 :: 范围解析符定义函数
    {
        length = let;
    }
    
    
    
    int main()
    {
        double v;
        Box my_first_box;
        my_first_box.setheight(10);
        my_first_box.setlength(10);
        v = my_first_box.getvolumn();
        cout << v << endl;
    }

    类的访问修饰符

    class Base {
     
       public:
     
      // 公有成员 类与实例、继承类都能访问
     
       protected:
     
      // 受保护成员 实例不能直接访问,可通过公有函数调用,但是派生类能访问
     
       private:
     
      // 私有成员 实例不能直接访问,但能通过公有函数调用,派生类不能访问
     
    };

    继承类型

    派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。

    我们可以根据访问权限总结出不同的访问类型,如下所示:

    访问publicprotectedprivate
    同一个类 yes yes yes
    派生类 yes yes no
    外部的类 yes no no

    当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。

    我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:

    • 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有保护成员来访问。
    • 保护继承(protected): 当一个类派生自保护基类时,基类的公有保护成员将成为派生类的保护成员。
    • 私有继承(private):当一个类派生自私有基类时,基类的公有保护成员将成为派生类的私有成员。

    C++ 中的函数重载

    在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。

    下面的实例中,同名函数 print() 被用于输出不同的数据类型:

    #include <iostream>
    using namespace std;
     
    class printData
    {
       public:
        //--------------------------------------------三个print同名函数,但参数不同则是不同的函数
    void print(int i) { cout << "整数为: " << i << endl; } void print(double f) { cout << "浮点数为: " << f << endl; } void print(char c[]) { cout << "字符串为: " << c << endl; } }; int main(void) { printData pd; // 输出整数 pd.print(5); // 输出浮点数 pd.print(500.263); // 输出字符串 char c[] = "Hello C++"; pd.print(c); return 0; }

    C++ 接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现。

    C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。

    如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:

    class Box
    {
       public:
          // 有纯虚函数则该类为抽象类
          virtual double getVolume() = 0;
       private:
          double length;      // 长度
          double breadth;     // 宽度
          double height;      // 高度
    };

    如下实例:

    #include <iostream>
     
    using namespace std;
     
    // 基类
    class Shape 
    {
    public:
       // 提供接口框架的纯虚函数
       virtual int getArea() = 0;
       void setWidth(int w)
       {
          width = w;
       }
       void setHeight(int h)
       {
          height = h;
       }
    protected:
       int width;
       int height;
    };
     
    // 派生类
    class Rectangle: public Shape
    {
    public:
       int getArea()
       { 
          return (width * height); 
       }
    };
    class Triangle: public Shape
    {
    public:
       int getArea()
       { 
          return (width * height)/2; 
       }
    };
     
    int main(void)
    {
       Rectangle Rect;
       Triangle  Tri;
     
       Rect.setWidth(5);
       Rect.setHeight(7);
       // 输出对象的面积
       cout << "Total Rectangle area: " << Rect.getArea() << endl;
     
       Tri.setWidth(5);
       Tri.setHeight(7);
       // 输出对象的面积
       cout << "Total Triangle area: " << Tri.getArea() << endl; 
     
       return 0;
    }

    #include<iostream>usingnamespacestd; // 基类classShape{public: // 提供接口框架的纯虚函数virtualintgetArea() = 0; voidsetWidth(intw){width = w; }voidsetHeight(inth){height = h; }protected: intwidth; intheight; }; // 派生类classRectangle: publicShape{public: intgetArea(){return(width * height); }}; classTriangle: publicShape{public: intgetArea(){return(width * height)/2; }}; intmain(void){RectangleRect; TriangleTri; Rect.setWidth(5); Rect.setHeight(7); // 输出对象的面积cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // 输出对象的面积cout << "Total Triangle area: " << Tri.getArea() << endl; return0; }

  • 相关阅读:
    每日总结
    每日总结
    每日总结
    每日总结
    每周总结
    每日总结
    10.20
    10.19
    10.18
    10.17
  • 原文地址:https://www.cnblogs.com/echoboy/p/10398198.html
Copyright © 2011-2022 走看看