LInux C++学习day06 拷贝构造和拷贝赋值 静态成员(static) 成员指针 操作符(运算符)重载

一 拷贝构造和拷贝赋值
1 浅拷贝和深拷贝
1)如果类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量本身,没有复制指针所指向的内容,这种拷贝方式称为浅拷贝.
2)浅拷贝将导致不同对象间的数据共享,如果数据在堆区,析构时还可能会出现“double free”的错误,导致进程终止,所以必须自己定义一个支持复制指针所指向内容的拷贝构造函数,即深拷贝.

2 拷贝赋值
1)当两个对象进行赋值操作时,比如“i3=i2”,编译器会自动将其处理为“i3.operator=(i2)”成员函数调用形式,其中“operator=”被称为拷贝赋值函数,但其本质就是一个成员函数,该函数的返回结果就是表达的结果.
2)如果类中包含了指针形式的成员变量,缺省的拷贝赋值函数和缺省拷贝类似,也是浅拷贝,可能有double free和内存泄漏的错误,因为必须自定义深拷贝赋值函数:
类名& operator=(const 类名& that){
if(&that != this){//防止自赋值
释放旧内存;
分配新内存;
拷贝新数据
}
return *this;//返回自引用
}
注:that对象对应右操作符,this指向左操作数
练习:实现String类,增加拷贝赋值函数

二 静态成员(static)
1 静态成员变量
1)语法
class 类名{
static 数据类型 变量名;//声明
};
数据类型 类名::变量名=初值;//定义和初始化
2)使用说明
–》普通成员变量属于对象,每个对象都会包含一份独立的普通成员变量;而静态成员变量不属于对象,一个类中静态成员变量只有一份
–》静态成员变量不能在构造函数中定义和初始化,需要在类的外部单独的定义和初始化。
–》静态成员变量和全局变量类似,被放在数据段,可以把静态成员变量理解为被限制在类中使用的全局变量.
–》访问静态成员变量方法
类名::静态成员变量;//推荐
对象.静态成员变量;//本质和上面一样

2 静态成员函数
1)语法
class 类名{
static 返回类型 函数名(形参表){}
};
2)使用说明
–》静态成员函数中没有this,也没有const属性,可以把静态成员函数理解为被限制在类中使用的全局函数
–》使用方法:
类名::静态成员函数(实参表);//推荐
对象.静态成员函数(实参表);//本质和上面等价
–》在静态成员函数中只能访问静态成员,在非静态成员函数中既可以访问静态成员,也可以访问非静态成员

3 单例模式
1)概念
一个类只允许创建唯一的对象,并提供它的访问方法.
2)实现思路
–》禁止在类的外部创建对象:私有化构造函数
–》类的内部维护唯一的对象:静态成员变量
–》提供唯一对象的访问方法:静态成员函数
3)创建方式
–》饿汉式:单例对象无论用或不用,程序启动即创建
–》懒汉式:单例对象用时在创建,不用即销毁

三 成员指针//了解
1 成员变量指针
1)定义
类型 类名::*成员指针变量名 = &类名::成员变量;
2)使用
对象.*成员指针变量名;
对象指针->*成员指针变量名;

注:".*"被称为直接成员指针解引用操作符
 	 "->*"被称为间接成员指针解引用操作符

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

四 操作符(运算符)重载
1 基本概念
操作符重载的本质就是一个写具有特殊名称的函数,使用operator 后接一个操作符,比如“operator=” “operator+”,把已定义的符号来重新定义,实现程序员想要的运算功能.

eg:复数 x+yi
(1+2i) + (3+4i) = 4+6i

猜你喜欢

转载自blog.csdn.net/weixin_43789711/article/details/90113487