十七 拷贝构造和拷贝赋值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+6i1 双目操作符1.1 运算类的双目操作符(L # R):+ - * /-->左右操作数可以是左值也可以是右值-->表达式结果是右值1)成员函数形式L#R的表达式会被编译器自动处理为L.operator#(R)的成员函数调用,该函数的返回值即为表达式的值。2)全局函数形式 1.2 赋值类的双目操作符练习:复习String类和单例模式实现