C++PrimerPlus学习之对象和类

版权声明:转载之前请说你是博主的粉丝哦。 https://blog.csdn.net/qq_34921856/article/details/83587997

OOP的特性

  • 抽象
  • 封装和数据隐藏
  • 多态
  • 继承
  • 代码的可重用性

  • 抽象转换为用户定义类型的C++工具

  • 数据表示+操纵数据的方法

  • 一个例子

      //stock00.h
    #ifndef STOCK00_H_INCLUDED
    #define STOCK00_H_INCLUDED
    
    #include<string>
    class Stock//常见写法,将首字母大写
    {
    private:    //1,私有成员只能被公有成员使用。2,这个可省略,class默认访问类型为private,而struct默认访问类型为public。
        std::string company;
        long shares;
        double share_val;
        double total_val;
        void set_tot(){total_val=shares*share_val;}//内联函数
    public:     //公有成员可被外界使用,是程序员和这个类的"接口"。
        std::string getcompany();
    
        Stock();//默认构造函数
        Stock(const std::string & _company,long _shares,double _share_val);//自定义构造函数
        ~Stock();//析构函数
    
    
        void show()const;   //不修改数据的函数请加上const
    //protected:    该关键字以后讨论
    };
    
    inline std::string Stock::getcompany()//内联函数的另一种写法,定义在头文件内。
    {
        return company;
    }
    #endif // STOCK00_H_INCLUDED
    
      //stock.cpp
    #include<iostream>
    #include"stock00.h"
    
    Stock::Stock() {}
    
    Stock::Stock(const std::string & _company,long _shares,double _share_val)
    {
        company=_company;
        shares=_shares;
        share_val=_share_val;
        set_tot();
    }
    
    void Stock::show()const
    {
        std::cout<<"company: "<<company<<std::endl;
        std::cout<<"shares: "<<shares<<std::endl;
        std::cout<<"share_val: "<<share_val<<std::endl;
        std::cout<<"tot_val: "<<total_val<<std::endl;
    }
    
    Stock::~Stock()
    {
        std::cout<<"good bye "<<company<<std::endl;
    }
    
    
    //main.cpp
    #include<iostream>
    #include"stock00.h"
    using namespace std;
    
    int main()
    {
        Stock gs=Stock("gs",12,20.0);
        gs.show();
        cout<<gs.getcompany()<<endl;
    }
    /*
    output
    company: gs
    shares: 12
    share_val: 20
    tot_val: 240
    gs
    good bye gs
    */
    
  • 一个小点
    接受一个参数的构造函数允许使用赋值语法将对象初始化为一个值

    Object obj = 1; // 如果有构造函数 Object(int)的话
    

this指针

  • this指针指向用来调用成员函数的对象

  • this指针被作为隐藏参传递给成员函数 – 且只能是第一个参数

  • 在成员函数后面加const的实质是给第一个参数即this指针加const属性

    //stock00.h
    const Stock &topval(const Stock &s)const;
    
    //stock00.cpp
    const Stock &Stock::topval(const Stock &s)const
    {
       if(s.total_val>total_val)return s;
       return *this;
    }
    

类作用域

  • 作用域为类的常量

    //枚举类型
    class Bakery
    {
    private:
    	enum {Months=12};
    	double costs[Months];
    	...
    }
    //使用关键字static
    class Bakery
    {
    private:
    	static const int Months=12;
    	double costs[Months];
    }
    //Months为静态变量,它和其他静态变量存储在一起。
    
  • 作用域内枚举(C++11)

    • 常规枚举可自动转换为整型,但作用域内枚举不能隐式地转换为整型。
    • 可以显式地指出底层整型类型。
    #include<bits/stdc++.h>
    using namespace std;
    /*
    默认情况下,枚举的底层类型为int
    */
    //作用域内枚举
    enum class egg{Small,Medium,Large,Jumbo};
    enum class t_shirt{Small,Medium,Large,Xlarge};//这样就不会发生冲突了
    
    //常规枚举
    enum egg_old{Small,Medium,Large,Jumbo};
    
    //可以显式的指出枚举的底层类型
    enum class : short pizza{Small,Medium,Large,XLarge};
    
    int main()
    {
      egg choice=egg::Large;
      t_shirt Floyd=t_shirt::Large;
      egg_old one=Medium;
      int king=one;//  allowed
      //int ring=choice;//not allowed
      
      if(king<Jumbo)    //allowed
          cout<<"hello world"<<endl;
      
      if(king<t_shirt::Large)//not allowed
          cout<<"cool boy"<<endl;
      
      //显示转换
      int Frodo=int(t_shirt::Small);
      
    }
    

猜你喜欢

转载自blog.csdn.net/qq_34921856/article/details/83587997