十七 拷贝构造和拷贝赋值 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类和单例模式实现