浅拷贝和深拷贝(重点)
1> 每个类中系统都会提供一个默认的拷贝构造函数,如果程序员显性定义出拷贝构造函数,则系统取消默认提供。
2> 系统提供的拷贝构造函数,是将一个类对象的所有数据成员给另一个对象的所有数据成员初始化的。该拷贝构造函数称为浅拷贝。
class Stu
{
private:
string name;
int id;
double *score;
public://拷贝构造函数 深拷贝
Stu(const Stu &other):name(other.name),id(other.id),score(new double(*(other.score)))
// double *score = new double(*(other.score))
{
cout <<"Stu::拷贝构造函数" << endl;
}
拷贝赋值函数
用一个类对象给另一类对象进行赋值操作
本质:运算符重载
格式
函数名:operator=
返回值:自身的引用
参数:同类的类对象
访问权限:一般为public
类名 &operator=(const 类名&other)
{
函数体内容;
}
//拷贝赋值函数
Stu &operator=(const Stu &other)
{
//避免自己给自己赋值
if(this != &other)
{
name = other.name;
age = other.age;
}
cout << "Stu:拷贝赋值函数" << endl;
return *this;
}
1> 每个类中系统都会提供一个默认的拷贝赋值函数,功能是将一个类对象的所有数据成员赋值给另一个类对象的所有数据成员,如果程序员显性定义出拷贝赋值函数,那么系统取消默认提供。
2>拷贝赋值函数也存在深浅拷贝问题,系统提供的可以称为浅拷贝,深拷贝将拷贝赋值函数(拷贝构造函数)显性定义出来,将有指针成员,自己申请一片空间,再将另一个对象指针指向空间里的值,复制到刚刚申请的空间中去。
匿名对象
没有名字的对象
格式
类名();
作用
1> 用匿名对象给有名对象初始化
2> 用匿名对象给对象数组初始化
3> 用匿名对象作为函数的参数使用
友元
可以让一些函数或者一些类去访问另一个类的私有数据成员。
种类
全局函数做友元
类做友元
成员函数做友元
关键字
friend
总结:
1> 不要过度的使用友元,会降低封装性,破坏封装性。
2> 友元不具有交互性、传递性、继承性。
常成员函数和常对象(const)
常成员函数
常成员函数不能对数据成员做修改操作。
注意
一个类中,常成员函数与普通成员函数同名,不是重复定义,而是重载关系,主要原因:this指针类型不同。
常对象
常对象表示该对象的数据成员不能被改变。
格式:
const 类名 对象名;
总结
1> 常对象,只能调用常成员函数,如果没有常成员函数,调动非常成员函数,则报错,原因是非常成员函数可以改变数据成员。
2> 非常对象,可以调用常成员函数,也可以调用非常成员函数,优先调用非常成员函数。