一、静态成员变量和函数
- 加入static就是静态成员变量,会共享数据
- 静态变量成员在类内声明,类外进行初始化。
- 静态变量成员也是有权限的
- 静态成员函数不可以访问普通变量
- 静态成员函数也是有权限的
二、单例模式
- 为了让类中只有一个实例,实例不需要自己释放
- 将默认构造和拷贝构造私有化
- 内部维护一个对象指针
- 私有化唯一指针
- 对外提供getinstance 方法来访问这个指针。
三、对象模型
- 空类大小为1,每个实例的对象都有一个独一无二的地址。char维护这个地址。
- 只有非静态成员属性才属于对象
- this指针永远指向当前对象,解决当前冲突
- 如果成员函数没有用到this ,那么空指针可以直接访问,
- 如果成员函数用到this指针,就要注意可以加if 判断
四、常函数常对象
常函数
- void func() const{}
- 修饰是this指针,const type * const this
- 不能修改this指针执行的值
常对象
- 在对象前加入const 修饰const Person p1
- 不可以调用普通的成员函数,可以调用常函数
- mutable修饰的关键字在常函数中可以修改
五、友元
友元关系是单向的
全局函数做友元---->目的是访问类中的私有属性,friend
类做友元---->friend class
六、重载运算符
- 如果想让自定义数据类型进行+号运算符,那么就需要重载+运算符。
//修改加号运算符
class Person
{
public:
Person() {};
Person(int a,int b):m_A(a),m_B(b){};
Person operator+ (Person &p) //成员函数重载运算符
{
Person tmp;
tmp.m_A = this->m_A + p->m_A;
tmp.m_B = this->m->B + p->m_B;
}
int m_B;
int m_A;
};
//利用全局函数进行运算符重载
Person operator(Person &p1,Person &p2)
{
Person tmp;
tmp.m_A = this->m_A + p->m_A;
tmp.m_B = this->m->B + p->m_B;
}
Person p3 = p1+p2;
- 左移运算符重载不可以写咋成员函数中,只能用全局函数
ostream& operator(ostream &cout, Person &p1) //引用返回
{
cout << p1.m_a << p1.m_b; //当m_a为私有时,需要加友元friend
return cout;
}
void testFunc(int &ref) //发现是引用,转换为int *const ref = &a
{
ref = 10; //ref 是引用,转换成*ref = 10;
}
- 前置后置运算符
//前置++
MyInter operator++()
{
this->num++;
return *this;
}
//后置++
MyInter operator++(int) //int 为占位参数,区分前后置
{
//临时保存目前数据
MyInter tmp = *this;
num++;
return tmp;
}
- 智能指针,用来托管自定义类型的对象,让对象进行自动的释放。
class Smart
{
Smart pointer(Smart *pointer)
{
this->pointer = pointer;
}
private:
Smart *pointer;
};
void test()
{
Smart s(new Person(10))
s->showage //重载->运算符
}
- = 重载
- 一个类默认创建默认构造、析构、拷贝构造、operate=赋值运算符进行简单的值传递