zoukankan      html  css  js  c++  java
  • C++类&对象

    一、C++ 类定义

    定义格式:

    实例:

    使用关键字 class 定义 Box 数据类型

    class Box
    {
       public:
          double length;   // 盒子的长度
          double breadth;  // 盒子的宽度
          double height;   // 盒子的高度
    };

    二、C++ 对象定义

    声明类的对象与声明基本类型的变量同理

    比如:声明类Box的两个对象

    Box Box1;          // 声明 Box1,类型为 Box
    Box Box2;          // 声明 Box2,类型为 Box

    对象 Box1 和 Box2 都有它们各自的数据成员

    三、访问数据成员

    实例:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          double length;   // 长度
          double breadth;  // 宽度
          double height;   // 高度
          // 成员函数声明
          double get(void);
          void set( double len, double bre, double hei );
    };
    // 成员函数定义
    double Box::get(void)
    {
        return length * breadth * height;
    }
     
    void Box::set( double len, double bre, double hei)
    {
        length = len;
        breadth = bre;
        height = hei;
    }
    int main( )
    {
       Box Box1;        // 声明 Box1,类型为 Box
       Box Box2;        // 声明 Box2,类型为 Box
       Box Box3;        // 声明 Box3,类型为 Box
       double volume = 0.0;     // 用于存储体积
     
       // box 1 详述
       Box1.height = 5.0;   // OK: 因为 height 是公有的
       Box1.length = 6.0;  
       Box1.breadth = 7.0;
     
       // box 2 详述
       Box2.height = 10.0;
       Box2.length = 12.0;
       Box2.breadth = 13.0;
     
       // box 1 的体积
       volume = Box1.height * Box1.length * Box1.breadth;
       cout << "Box1 的体积:" << volume <<endl;
     
       // box 2 的体积
       volume = Box2.height * Box2.length * Box2.breadth;
       cout << "Box2 的体积:" << volume <<endl;
     
     
       // box 3 详述
       Box3.set(16.0, 8.0, 12.0); 
       volume = Box3.get(); 
       cout << "Box3 的体积:" << volume <<endl;
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Box1 的体积:210
    Box2 的体积:1560
    Box3 的体积:1536

    类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样,如上例

     四、类的成员修饰符

    关键字 public、private、protected 称为访问修饰符

    1.公有(public)成员

    公有成员在程序中类的外部是可访问的,如上例

    可以不使用任何成员函数来设置和获取公有变量的值

    2.私有(private)成员

    私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。

    只有类和友元函数可以访问私有成员。

    默认情况下,类的所有成员都是私有的。

    例如:

    在下面的类中,width 是一个私有成员

    class Box
    {
       double width;
       public:
          double length;
          void setWidth( double wid );
          double getWidth( void );
    };

    实际操作中,我们一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数

    实例:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          double length;
          void setWidth( double wid );
          double getWidth( void );
     
       private:
          double width;
    };
     
    // 成员函数定义
    double Box::getWidth(void)
    {
        return width ;
    }
     
    void Box::setWidth( double wid )
    {
        width = wid;
    }
     
    // 程序的主函数
    int main( )
    {
       Box box;
     
       // 不使用成员函数设置长度
       box.length = 10.0; // OK: 因为 length 是公有的
       cout << "Length of box : " << box.length <<endl;
     
       // 不使用成员函数设置宽度
       // box.width = 10.0; // Error: 因为 width 是私有的
       box.setWidth(10.0);  // 使用成员函数设置宽度
       cout << "Width of box : " << box.getWidth() <<endl;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Length of box : 10
    Width of box : 10

    3.protected(受保护)成员

    protected(受保护)成员变量或函数与私有成员相似,即在类的外部不可访问

    但是,protected(受保护)成员在派生类(即子类)中是可访问的

    实例:

    #include <iostream>
    using namespace std;
     
    class Box
    {
       protected:
          double width; // protected : 类的外部只有子类可以访问
    };
     
    class SmallBox:Box // SmallBox 是派生类
    {
       public:
          void setSmallWidth( double wid );
          double getSmallWidth( void );
    };
     
    // 子类的成员函数
    double SmallBox::getSmallWidth(void)
    {
        return width ; // 子类可以访问父类 protected 修饰的成员
    }
     
    void SmallBox::setSmallWidth( double wid )
    {
        width = wid;
    }
     
    // 程序的主函数
    int main( )
    {
       SmallBox box;
     
       // 使用成员函数设置宽度
       box.setSmallWidth(5.0);
       cout << "Width of box : "<< box.getSmallWidth() << endl;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Width of box : 5

    五、类的构造函数

    1.类的构造函数

    类的构造函数也是类的成员函数,它会在每次创建类的新对象时自动调用执行

    构造函数的名称与类的名称是完全相同的;

    不会返回任何类型,也不会返回 void;

    例如:

    #include <iostream>
     
    using namespace std;
     
    class Line
    {
       public:
          void setLength( double len );
          double getLength( void );
          Line();  // 这是构造函数
     
       private:
          double length;
    };
     
    // 成员函数定义,包括构造函数
    Line::Line(void)
    {
        cout << "Object is being created" << endl;
    }
     
    void Line::setLength( double len )
    {
        length = len;
    }
     
    double Line::getLength( void )
    {
        return length;
    }
    // 程序的主函数
    int main( )
    {
       Line line;
     
       // 设置长度
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() <<endl;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Object is being created
    Length of line : 6

    2.带参数的构造函数

    默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数,这样在创建对象时就会给对象赋初始值

    例如:

    #include <iostream>
     
    using namespace std;
     
    class Line
    {
       public:
          void setLength( double len );
          double getLength( void );
          Line(double len);  // 这是构造函数
     
       private:
          double length;
    };
     
    // 成员函数定义,包括构造函数
    Line::Line( double len)
    {
        cout << "Object is being created, length = " << len << endl;
        length = len;
    }
     
    void Line::setLength( double len )
    {
        length = len;
    }
     
    double Line::getLength( void )
    {
        return length;
    }
    // 程序的主函数
    int main( )
    {
       Line line(10.0);
     
       // 获取默认设置的长度
       cout << "Length of line : " << line.getLength() <<endl;
       // 再次设置长度
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() <<endl;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Object is being created, length = 10
    Length of line : 10
    Length of line : 6

    3.使用初始化列表初始化成员

    构造函数的定义后面加冒号来初始化

    假设有一个类 C,具有多个字段 X、Y、Z 等需要进行初始化

    C::C( double a, double b, double c): X(a), Y(b), Z(c)
    {
      ....
    }

    实例:

    Line::Line( double len): length(len)
    {
        cout << "Object is being created, length = " << len << endl;
    }

    等同于

    Line::Line( double len)
    {
        length = len;
        cout << "Object is being created, length = " << len << endl;
    }

    六、类的析构函数

    类的析构函数也是类的成员函数,它会在每次删除所创建的对象时自动调用执行;

    析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀;

    它不会返回任何值,也不能带有任何参数;

    析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源

    实例:

    #include <iostream>
     
    using namespace std;
     
    class Line
    {
       public:
          void setLength( double len );
          double getLength( void );
          Line();   // 这是构造函数声明
          ~Line();  // 这是析构函数声明
     
       private:
          double length;
    };
     
    // 成员函数定义,包括构造函数
    Line::Line(void)
    {
        cout << "Object is being created" << endl;
    }
    Line::~Line(void)
    {
        cout << "Object is being deleted" << endl;
    }
     
    void Line::setLength( double len )
    {
        length = len;
    }
     
    double Line::getLength( void )
    {
        return length;
    }
    // 程序的主函数
    int main( )
    {
       Line line;
     
       // 设置长度
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() <<endl;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Object is being created
    Length of line : 6
    Object is being deleted

    七、C++this指针

    每一个对象都能通过 this 指针来访问自己的地址

    在成员函数内部,它可以用来指向调用对象

    实例:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          // 构造函数定义
          Box(double l=2.0, double b=2.0, double h=2.0)
          {
             cout <<"Constructor called." << endl;
             length = l;
             breadth = b;
             height = h;
          }
          double Volume()
          {
             return length * breadth * height;
          }
          int compare(Box box)
          {
             return this->Volume() > box.Volume(); // 这里的 this 指向的是调用对象 Box1
          }
       private:
          double length;     // Length of a box
          double breadth;    // Breadth of a box
          double height;     // Height of a box
    };
     
    int main(void)
    {
       Box Box1(3.3, 1.2, 1.5);    // Declare box1 参数传入构造函数中,给对象赋予初值
       Box Box2(8.5, 6.0, 2.0);    // Declare box2
     
       if(Box1.compare(Box2))      // 对象 Box1 调用函数 compare
       {
          cout << "Box2 is smaller than Box1" <<endl;
       }
       else
       {
          cout << "Box2 is equal to or larger than Box1" <<endl;
       }
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Constructor called.
    Constructor called.
    Box2 is equal to or larger than Box1

    八、C++类的静态成员

    静态成员在类的所有对象中是共享的

    注意:

    静态成员的初始化不能放置在类的定义中,应该在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化;

    如果没有初始化语句,在创建第一个对象时,会被初始化为零

    实例:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          static int objectCount;
          // 构造函数定义
          Box(double l=2.0, double b=2.0, double h=2.0)
          {
             cout <<"Constructor called." << endl;
             length = l;
             breadth = b;
             height = h;
             // 每次创建对象时增加 1
             objectCount++;
          }
          double Volume()
          {
             return length * breadth * height;
          }
       private:
          double length;     // 长度
          double breadth;    // 宽度
          double height;     // 高度
    };
     
    // 初始化类 Box 的静态成员
    int Box::objectCount = 0;
     
    int main(void)
    {
       Box Box1(3.3, 1.2, 1.5);    // 声明 box1
       Box Box2(8.5, 6.0, 2.0);    // 声明 box2
     
       // 输出对象的总数
       cout << "Total objects: " << Box::objectCount << endl;
     
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Constructor called.
    Constructor called.
    Total objects: 2
  • 相关阅读:
    关于<?php exit;?>"的绕过问题
    机器学习--DIY笔记与感悟--②决策树(1)
    机器学习--DIY笔记与感悟--①K-临近算法(2)
    js 一些基础的理解
    js switch判断 三目运算 while 及 属性操作
    数据类型 数据类型转换 运算符
    数组的一些常用方法分析 介绍
    js常用的字符串方法分析
    js 的作用域 域解析 分析
    js 函数 作用域 全局作用域 局部作用域 闭包
  • 原文地址:https://www.cnblogs.com/wy0526/p/15684629.html
Copyright © 2011-2022 走看看