拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)

十七 拷贝构造和拷贝赋值
1 浅拷贝和深拷贝
1)如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝。
2)浅拷贝将导致不同对象之间的数据共享,如果数据存放在堆区,可能会在析构时引发"double free"异常,因此就需要自己定义一个支持复制指针指向的内容的拷贝构造函数,即深拷贝。

2 在C++类中会提供一个缺省的拷贝赋值运算符函数,完成两个对象直接的赋值操作。但是它和缺省拷贝构造函数类似,也是浅拷贝,为了得到深拷贝赋值的效果,必须自己定义拷贝赋值运算符函数

 s2 = s3;//s2.operator=(s3)

 类名& operator=(const 类名& that){
    if(this != &that){//1)防止自赋值
      2)释放旧资源
      3)分配新资源
      4)拷贝新数据
    }
    return *this;//5)返回自引用
 }
    
十八 静态成员(static)
1 静态成员变量
class 类名{
   static 数据类型 变量名;//声明静态成员变量
};
数据类型 类名::变量名 = 初值;//定义和初始化
1)静态成员变量不属于对象,但是可以通过对象去访问它。
2)不能在构造函数中定义和初始化,需要在类的外部单独的定义和初始化
3)静态成员变量内存在全局区;
4)静态成员变量可以通过类名直接访问 
   类名::静态成员变量
5)静态成员变量在类所创建多个对象之间是共享的

2 静态成员函数
class 类名{
   static 返回类型 函数名(形参表){函数体}
};
1)静态成员函数没有this指针,也没有const属性
2)可通过"类名::"直接访问,也可以通过对象访问
注:静态成员函数只能访问静态成员

3 单例模式:一个类只允许创建唯一的对象
1)禁止在类的外部创建对象:私有化构造函数
2)类的内部维护唯一对象:静态成员变量
3)提供访问单例对象的方法:静态成员函数
4)创建方式:
   --》饿汉式:单例对象无论用或不用,程序启动即创建。
   --》懒汉式:单例对象在用的时候再创建,不用即销毁。
eg:
class A{
public:
   static A& get(void){
      return m_a;
   }
private:
   A(void);
   A(const A&);
   static A m_a;
};
===================
十九 成员指针(了解)
1 成员变量指针
1)定义
类型 类名::*成员指针变量名 = &类名::成员变量;
2)使用
   对象.*成员指针变量名;
   对象指针->*成员指针变量名;
 ".*":成员指针解引用运算符
 "->*":间接成员指针解引用运算符
注:成员变量指针的本质是类中特定成员在对象中的相对地址。

2 成员函数指针
1)定义
   返回类型 (*类名::成员函数指针)(形参表) 
           = &类名::成员函数名;
2)使用
   (对象.*成员函数指针)(实参表);
   (对象指针->*成员函数指针)(实参表);

==================
二十 操作符重载
eg:复数x+yi 3+4i
(1+2i) + (3+4i) = 4+6i
1 双目操作符
1.1 运算类的双目操作符(L # R):+ - * /
-->左右操作数可以是左值也可以是右值
-->表达式结果是右值
1)成员函数形式
L#R的表达式会被编译器自动处理为L.operator#(R)的成员函数调用,该函数的返回值即为表达式的值。

2)全局函数形式 

1.2 赋值类的双目操作符

练习:复习String类和单例模式实现
原文地址:https://www.cnblogs.com/Kernel001/p/7729757.html