对象和类
面向对象编程(OOP)特性
抽象
封装和数据隐藏
多态
继承
代码的可重用性
访问控制
private, protected, public
class 声明默认为 private, struct声明默认为public
为了更具可读性,建议显式的说明访问权限
实现类成员函数
定义类成员函数时,使用作用域解析运算符(::)来标识函数所属的类
类方法可以访问类的private组件
不属于公共接口的成员函数声明为private
内联方法
定义于类声明中的函数自动内联
类声明常将短小的成员方法定义为内联的
使用inline限定符可将类外定义的方法变成内敛方法
根据改写规则(rewrite rule),在类声明中定义方法等同于用原型替换方法定义,然后在类声明的后面将定义改写为内联函数
内联函数的特殊规则要求在每个使用它的文件中都对其定义,最简便的方法是将内联定义放在定义类的头文件中
使用类
声明类变量或new创建一对象
声明类变量时下面的方法是不对的
Test t1(); // 注意这不是表示使用默认构造函数,而是声明了一个函数原型
正确的写法
Test t1;Test t2(10); Test* t3 = new Test();
构造函数和析构函数
使用构造函数
Point p1 = Point(1, 2); //显式调用Point p2(3, 4); //隐式调用Point* p3 = Point(5, 6); //结合new运算符调用
默认构造函数:在未提供显式初始值时,用来创建对象的构造函数
Point p; //默认构造函数隐式版本
如果没有提供任何构造函数,则C++会提供默认构造函数,拷贝构造函数和转移构造函数
如果定义了构造函数,建议同时提供默认构造函数
两种方法定义默认构造函数:
给所有参数提供默认值
重载一个没有参数的构造函数
注意:
构造函数大部分情况声明为public
构造函数可以重载
构造函数不能声明为虚函数
析构函数
如果创建的是静态存储类对象,则其析构函数在程序结束时自动被调用
如果创建的是自动存储类对象,则其析构函数在程序执行完代码块时自动被调用
如果是new创建的对象,将驻留在堆区中
const成员函数
cosnt Point p = Point(1, 2); p.show(); //如果show方法为非const方法,编译器将拒绝执行该语句
对于有参数的方法可以通过将参数声明为const引用或指向const的指针解决
对于没有参数的方法,将const放在方法圆括号的后面
void show() const;void Point::show() cosnt {}
对象数组
调用默认构造函数
Point points[5];
调用构造函数初始化
Point points[2] = { Point(1, 2), Point() };
作用域内枚举
C++11提供了一种新枚举,其枚举常量的作用域为类(为了避免不同枚举明明冲突)
enum class egg {SMALL, MEDIUM, LARGE, JUMBO};enum class t_shirt {SMALL, MEDIUM, LARGE, XLARGE};
使用时需要用枚举名来限定枚举量c
egg choice = egg::SMALL; t_shirt size = t_shirt::SMALL;
C++11作用域内枚举底层类型为int
可用如下方法将底层类型设为short, 底层类型必须为整型
enum class : short egg {SMALL, MEDIUM, LARGE, JUMBO};
小结
面向对象编程强调的是程序如何表示数据. 使用OOP方法解决问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据, 然后设计一个类实现接口. 一般来说, 私有数据成员存储信息, 公有成员方法提供访问数据的唯一途径. 类将数据和方法组合成一个单元, 其私有性实现数据隐藏.
作者:HYIndex
链接:https://www.jianshu.com/p/952c2e7df449