← C++ 高级程序设计(2020)2020-C++高级程序设计-C++ 类成员变量
发布 更新 约 9 分钟阅读阅读 — 次
- 学习记录
- 2020 年课程笔记
类的成员变量
1. Const成员
1.1. const成员变量
- 初始化放在构造函数的成员初始化表中进行:
- 常量在初始化的时候必须被给值,而不是赋值,所以不能写在构造函数内
- 所以我们通过初始化表的方式完成。
- 每一个Const变量是指对于这个对象的生命周期内是不变的
- static const:编译器内的常量,所有的对象都是一样的,最好在定义的地方进行初始化。
1 2 3 4 5
| class A{ const int x; public: A(int c):x(c){} }
|
1.2. Const成员函数
- 可以是函数也可以是参数
- 我们将不修改对象内变量的值的时候,将对应方法声明为const
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class A{ int x,y; public: A(int x1, int y1); void f(); void show() const; }; void A::f(){x = 1; y = 1;} void f(A * const this);
void A::show() const {cout <<x << y;} void show(const A* const this);
const A a(0,0); a.f(); a.show();
|
- 声明为const的对象只能调用常成员对象函数
- 如果是非const的对象,则都可以进行调用
- 是否const方法真的就不能修改对象里面的值了呢?不是,const只是语法上避免了,但是不是完全不可修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class A{ int a; int & indirect_int; public: A():indirect_int(*new int){ ... } ~A() { delete &indirect_int; } void f() const{ indirect_int++; } };
|
- 关键词mutable:表示成员可以再const中进行修改,而不是用间接的方式来做。
- 去掉const转换:
(const_cast)<A*>(this)->x转换后可以修改原来的成员
2. 静态成员
- 放在类的外部,只能初始化一次。
- 一个类共享变量
2.1. 静态成员简介
- 类刻画了一组具有相同属性的对象
- 对象是类的实例
- 问题:为什么不声明成全局变量,而是声明成类的成员。
- 如果把这些共享变量定义为全局变量,却缺乏数据保护
- 名污染
- struct和class在封装上大致类似
- struct默认访问public
- class默认访问private
2.2. 静态成员变量
- 静态成员变量是类对象所共享
- 唯一拷贝
- 遵循类访问控制
- 必须放置在类外
1 2 3 4 5 6
| class A{ int x,y; static int shared; }; int A::shared=0; A a,b;
|
2.3. 静态成员函数
- 只能存取静态成员变量,调用静态成员函数
- 遵循类访问控制:在类上直接访问只能是静态成员变量
- 类也是一种对象,可以通过类直接调用静态方法
1 2 3 4 5 6 7
| class A{ static int shared; int x; public: static void f() {shared} void q() { x,shared} };
|
2.4. 调用静态成员
- 通过对象使用:
A a;a.f();
- 通过类使用:
A::f();
- C++支持观点"类也是对象"
- smalltalk
1 2 3 4 5 6 7 8 9
| class A{ static int obj_count; public: A(){obj_count++;} ~A(){obj_count--;} static int get_num_of_obj(); }; int A::obj_count=0; int A::get_num_of_obj() { return obj_count; }
|
- 原则:谁创建,谁归还。解决方法:自动归还
- singleton:单件模式:通过静态成员函数来创建对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class singleton{ protected: singleton(){} singleton(const singleton &); public: static singleton *instance() { return m_instance == NULL? m_instance = new singleton: m_instance; } static void destroy() { delete m_instance; m_instance = NULL; } private: static singleton *m_instance; }; singleton *singleton::m_instance= NULL;
|
评论