一.构造函数
1.意义:用来初始化类的对象。
2.实现:
#include <iostream>
using std::cout;
using std::endl;
class Date {
public:
void Print();
private:
int _year;
int _month;
int _day;
};
void Date::Print() {
cout << _year << "-" << _month << "-" << _day << endl;
}
int main() {
Date d1;
d1.Print();
system("pause");
return 0;
}
这是没有自己写构造函数的时候,运行结构是这样的:
3.定义格式:
类名(参数列表);
4.自定义的构造函数
Date(int year=1900,int month=1,int day=1) {
_year = year;
_month = month;
_day = day;
}
运行结果就是这样了:
5.特点:
①函数名==类名
②无返回值
③对象实例化时自动调用
④可重载
⑤对于无参对象的定义,只要对象名,不要();
Date(){
_year=1900;
_month=1;
_day=1;
}
//定义对象
Date d1();//错误
Date d1;
⑦默认构造函数只有一个:
1)系统自己写
2)自己写——无参
3)自己写——全缺省
2)与3)只能存在其一,否则调用时会造成二义性。
二.析构函数
1.意义:释放对象的空间。
2.定义格式:
~类名();
3.特点:
①无参无返回值
②一个类只有一个(由于其无参,所以其不可以重载)
③系统自动调用
④先定义的对象,后析构
三.拷贝构造函数
1.意义:实质上就是构造函数的一种重载。用来拷贝对象。
2.定义格式:
类名(const 类名& 对象名)
注意:
1.const可加可不加,最好加上const。
2.参数必须是对象的引用,否则调用时会发生无穷递归。
原因:
调用该函数的流程是:先看参数,再进入函数,但是参数如果是对象本身,那么就会去调用拷贝构造函数
例如:
Date::Date(Date d) {
_year=d._year;
_month=d._month;
_day=d._day;
}
int main(){
Date d1;
Date d2(d1);
}
四.赋值运算符的重载
1.意义:使得代码易读。用于对象间的赋值。
2.格式:
返回值类型 operator =(对象或者是对象的引用)
3.例如:
Date Date::operator=(const Date& d) {
_year = d._year;
_month = d._month;
_day = d._day;
return *this;
}
4.特点:
(1)" .* "、" :: "、" sizeof "、" ?: "、" . "这五个运算符不允许重载
(2)形参只有两个,并且其一必须是类类型,又由于类的成员函数都有隐式的this指针参数,所以作为类的成员函数时,形参是需要写一个就行。当然形参要是引用会提高效率。
注意:
①有返回值,支持连续赋值。
②对自己为自己赋值进行检查
③传参和传返回值引用
④Date d2=d1;这是拷贝构造不是赋值。
注意:
//赋值运算符的重载
Date Date::operator=(Date d)
//拷贝构造函数
Date(Date&d);
Date d1 ,d2 ,d3;
d1 = d2 = d3;
会出现如下错误:
出现错误的原因是:
第一步:
①d2=d3;先调用赋值函数,参数是对象(形参是实参的一份拷贝),再调用拷贝构造函数,参数是对象的引用。
第一步结束,赋值函数返回了一个Date类型的对象,但是该对象是局部变量——具有常量的性质
②d1=const(刚才返回的对象),继续调用赋值函数,再调用拷贝构造,但是拷贝构造的参数是对象的引用,但是刚才返回的已经具有常量性质的对象就与该函数的形参产生了矛盾。因为Date& 与const Date&是两种不同类型的变量。
只要将拷贝构造的参数修改成const Date&即可。
五.取址运算符的重载
1.意义:可以决定&符所取得得地址。
2.格式:
Date* operator&();
3.例如:
Date* Date::operator&() {
return this;
}
可以通过返回值来决定&的结果。
六.const对象的取址运算符&的重载
与五一模不一样,只不过对象是const类型的。
七.const成员函数(不是默认成员函数)
1.形式:
函数后面加上const关键字
2.意义:将this的类型修改成了const 类类型*
const关键字修饰了之后就修改了该变量或者函数的属性为只读。
注意:
(1)const对象不可以调用非const成员函数
(2)非const对象可以调用const成员函数
(3)const成员函数内不可以调用其他非const成员函数
(4)非const成员函数内可以调用其他const成员函数