OOP面向对象的编程特性:1.抽象 2.多态3.封装和数据隐藏4.继承 5.代码的重用性
用户定义类型就是实现抽象接口的类设计。
类型:1.确定内存存储的大小。2.如何解释存储中的位 3.对类型的操作或者方法
类有两部分:类声明,类方法定义。这两部分通常放在不同的文件夹中。
类名的首字母通常大写。
访问控制:private,public。对象的私有成员可以有公有成员和友元函数访问。class当中默认的访问控制是private
成员函数:可以在类声明中定义,也可以在外部定义。
数据隐藏:1.类中的私有数据。2.类中的私有函数 3.将类声明和类的方法定义放在不同文件当中。
class作用:
- 是类的标识。
- 可以用来定义模板。(通常使用typename)
- class用来定义enum枚举值得占用空间
enum class:short {main}
类和结构很像:区别在于类访问控制默认是private,而结构的默认访问控制是public。
定义在类内部的函数并默认为内联函数。
内联函数可以进行多次定义。
在OOP调用成员函数:被称作是传递消息。
对于类的不同对象:他们拥有不同的数据,但是共享同一组方法(即方法只有一个副本)
构造函数和析构函数:
在创建对象的时候,一定调用构造函数。
构造函数:构造函数没有返回类型。构造函数当中不能将参数名设置成成员名。
1.当没有定义构造函数的时候,系统会生成默认构造函数。
2.当有显示定义的时候,不会生成:所以需要创建默认构造函数。这有两种方法:1.写一个默认构造函数。2.将显示定义的构造函数的参数都给上默认值。
析构函数:没有参数,没有返回类型。
对象的初始化操作:
Stock是一个类,其构造函数为Stock(const char * a,int num = 0,double num = 0.0);
Stock();
// 显示初始化
Stock first_class = Stock("123"); // 该方法可能会建立临时对象,然后进行赋值操作
Stock second_class("123");
Stock thirst_class();
// 隐式初始化
Stock thirst_class;
// c++11中的列表初始化
Stock first_class = {"123"};
Stock first_class {"123"};
// 当构造函数只有一个变量的时候(假设Stock(int n))
Stock forth_class = 3;
// 对象数组的初始化
Stock ab[2] = {Stock("123",1,3),Stock("123")}
自动变量存在栈当中:所以对于对象来说其释放时,后定义的先调用析构函数。
尽量使用初始化来给对象初始值,(这样的效率更高)。
类方法不修改隐式定义的数据:则定义时: int change() const;这样说明类方法不修改隐藏数据。
在声明对象的时候使用const,则不能调用没有声明const的方法。
class Sale
{
void show();
}
const Sale a;
a.show(); // 不能使用
class Sale
{
void show() const; // 意味着不能修改调用对象中的隐藏数据。
};
a.show(); // 可以使用
this指针:对用方法的对象的地址。方法默认的参数。
对象数组的初始化流程:1.首先调用默认构造函数,初始化元素。2.然后利用{}中的构造函数创建临时对象。3.将临时对象赋给数组元素。
类定义的时候不会分配存储空间:所以其中的符号常量实现方法:
1.利用enum枚举实现。 2.利用static实现。 这两种方法创建的是类作用域当中的数据,但是并不会在类的对象当中。
类作用域中的枚举:不能自动转化成整形。
使用enum class egg {small,medium};这样可以避免同一文件中的同名枚举量冲突。
枚举的底层存储类型转化: enum class:short pizza {Small,Medium,Large}
ADT(abstract data type)抽象数据类型:实现栈。
代码:
// 设置保存小数点后几位
std::streamsize prec=std::cout.precision(3);
// 恢复之前的情况
std::cout.precision(prec);
ios_base::fmtflags orig =
std::cout.setf(ios_base::fixed,ios_base::floatfield);
// 恢复原状
std::cout.setf(orig,ios_base::floatfield);