在C++中,有些成员函数如果我们不去显示定义,编译器会自动生成
会自动生成的特殊函数:
他们不能定义为全局函数,必须是类成员员函数(特别是拷贝赋值重载)
下面介绍默认生成函数的作用,特点
构造 函数,析构函数,赋值拷贝构造函数特点几乎相同:
构造函数:对于自定义类型,调用其构造函数,对于内置类型,不做处理
自定义类型(class,struct等)/ 内置类型(int, float, string等C++自带类型)
析构函数:同构造函数,自定义对象调用其析构,内置类型不处理
拷贝构造:浅拷贝,会对内置类型也处理,但只是简单memcpy,会导致新旧指针指向同一空间
赋值拷贝函数:浅拷贝,同拷贝构造
什么时候要显示(手动)定义构造 ,析构,赋值拷贝构造函数?
当类为Date(日期)类,没有涉及指针成员时,不用显示定义,使用默认生成即可
当为Stack或List时,要显式定义
运算符重载注意事项
运算符重载函数可以显式调用
全局和类中有相同函数时,对象优先调用类中函数/成员
赋值运算符重载
特点
- 是默认构造函数之一
- 编译器自动生成
- 参数必为类引用
- 不能全局函数,必为类成员函数(规定,需要记住)
和拷贝构造区别:
拷贝构造函数调用是在对象不存在时,在创建的时候,调用拷贝构造函数,赋值拷贝函数是,对象已经存在了,调用的赋值拷贝函数
//拷贝构造
Cname nobj=obj;
Cname nobj(obj) //
//赋值拷贝
obj2=obj1
复制拷贝时
返回类型为局部对象引用:错误,引用指向的空间会在出函数后销毁
只有当函数作用域比函数作用域大时,可返回引用类型,如static和new出来的
拷贝重载函数编译器会默认生成
默认复制重载函数作用,功能
什么时候显示写/不写复制重载
tips:类重载比较操作符
当我们要写一个类中的各种比较运算符时,如Date(日期)类,我们要写大于,小于,等于,大于等于,小于等于......,但其实我们只要实现<和=,就可以通过函数复用来完成其余比较函数
例如,现在我们已经实现了<和==函数,要想实现>函数:
class Date{
private:
int _year;
int _month;
int _day;
public:
Date operator>(Date& obj)
{
return !(*this<obj && *this==obj);
}
};
其他比较操作都可以用类似方法有< 和==实现