class A{
int a;
int & indirect_int;
public:
A():indirect_int(*new int){ ... }
~A() {
delete &indirect_int;
}
void f() const{
//只要不是直接修改变量的值就OK
//引用本身是不能修改的,所以编译器认为没问题
indirect_int++;//只是指向的内容发生了变化
}
};
//用a来做初始化
关键词mutable:表示成员可以再const中进行修改,而不是用间接的方式来做。
去掉const转换:(const_cast)<A*>(this)->x转换后可以修改原来的成员
2. 静态成员
放在类的外部,只能初始化一次。
一个类共享变量
2.1. 静态成员简介
类刻画了一组具有相同属性的对象
对象是类的实例
问题:为什么不声明成全局变量,而是声明成类的成员。
如果把这些共享变量定义为全局变量,却缺乏数据保护
名污染
struct和class在封装上大致类似
struct默认访问public
class默认访问private
2.2. 静态成员变量
静态成员变量是类对象所共享
唯一拷贝
遵循类访问控制
必须放置在类外
class A{
int x,y;
static int shared;
};
int A::shared=0;//j静态成员的初始化放在类的外部,只能被赋值一次,所以不再头文件中定义,而是在实现中定义,避免重复。并且定义的时候不用再写static
A a,b;
2.3. 静态成员函数
只能存取静态成员变量,调用静态成员函数
遵循类访问控制:在类上直接访问只能是静态成员变量
类也是一种对象,可以通过类直接调用静态方法
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
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; }