C++学习笔记一

对象和类

  1. 面向对象编程(OOP)特性

  • 抽象
  • 封装和数据隐藏
  • 多态
  • 继承
  • 代码的可重用性
  1. 访问控制

  • private, protected, public
  • class 声明默认为 private, struct声明默认为public
  • 为了更具可读性,建议显式的说明访问权限
  1. 实现类成员函数

  • 定义类成员函数时,使用作用域解析运算符(::)来标识函数所属的类
  • 类方法可以访问类的private组件
  • 不属于公共接口的成员函数声明为private
  1. 内联方法

  • 定义于类声明中的函数自动内联
  • 类声明常将短小的成员方法定义为内联的
  • 使用inline限定符可将类外定义的方法变成内敛方法
  • 根据改写规则(rewrite rule),在类声明中定义方法等同于用原型替换方法定义,然后在类声明的后面将定义改写为内联函数
  • 内联函数的特殊规则要求在每个使用它的文件中都对其定义,最简便的方法是将内联定义放在定义类的头文件中
  1. 使用类

  • 声明类变量或new创建一对象
  • 声明类变量时下面的方法是不对的
Test t1(); // 注意这不是表示使用默认构造函数,而是声明了一个函数原型
  • 正确的写法
Test t1;
Test t2(10);
Test* t3 = new Test();
  1. 构造函数和析构函数

  • 使用构造函数
Point p1 = Point(1, 2); //显式调用
Point p2(3, 4); //隐式调用
Point* p3 = Point(5, 6); //结合new运算符调用
  • 默认构造函数:在未提供显式初始值时,用来创建对象的构造函数
Point p; //默认构造函数隐式版本

如果没有提供任何构造函数,则C++会提供默认构造函数,拷贝构造函数转移构造函数
如果定义了构造函数,建议同时提供默认构造函数
两种方法定义默认构造函数:

  • 给所有参数提供默认值
  • 重载一个没有参数的构造函数
  • 注意:
  • 构造函数大部分情况声明为public
  • 构造函数可以重载
  • 构造函数不能声明为虚函数
  • 析构函数

如果创建的是静态存储类对象,则其析构函数在程序结束时自动被调用
如果创建的是自动存储类对象,则其析构函数在程序执行完代码块时自动被调用
如果是new创建的对象,将驻留在堆区中

  1. const成员函数

cosnt Point p = Point(1, 2);
p.show(); //如果show方法为非const方法,编译器将拒绝执行该语句

对于有参数的方法可以通过将参数声明为const引用或指向const的指针解决
对于没有参数的方法,将const放在方法圆括号的后面

void show() const;
void Point::show() cosnt {}
  1. 对象数组

调用默认构造函数

Point points[5];

调用构造函数初始化

Point points[2] = {
    Point(1, 2),
    Point()
};
  1. 作用域内枚举

  • 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};
  1. 小结

面向对象编程强调的是程序如何表示数据. 使用OOP方法解决问题的第一步是根据它与程序之间的接口来描述数据,从而指定如何使用数据, 然后设计一个类实现接口. 一般来说, 私有数据成员存储信息, 公有成员方法提供访问数据的唯一途径. 类将数据和方法组合成一个单元, 其私有性实现数据隐藏.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容