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); }