C++第三天:类和对象,六个成员函数,const类型
C++从开始到放弃第三天
1.类的六个成员函数
当类中一个成员都没有的时候,简称为空类。空类中会自动生成六个成员函数。
1.构造函数:负责初始化
2.析构函数:负责释放,清理工作
3.拷贝构造:对创建对象的拷贝
4.赋值重载:把一个对象赋值给另一个对象
5.普通对象取地址重载
6.const对象取地址重载
2.构造函数
定义:
构造函数是一个特殊的成员函数,名字与类名相同,创建类时由编译器自动调用,并且在每个生命周期中只初始化一次。要注意,构造函数并不是开空间创造对象,而是初始化对象。
特性:
1.函数名与类名相同
2.无返回值
3.对象实例化时函数自动调用对应的构造函数
4.构造函数可以重载
5.如果类中没有自定义构造函数,C++会自动生成一个无参的构造函数,一旦用户定义构造函数,编译器就不会定义。
6.无参的构造函数和全缺省的构造函数都称为默认函数。默认的构造函数只允许存在一个。
class Date
{
public:
Date()//无参构造函数
{}
//Date(int year = 1999, int month = 6, int day = 8)//带参构造函数
//{
// _year = year;
// _month = month;
// _day = day;
//}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1.Print();
//Date d2(2019, 1, 17);
//d2.Print();
system("pause");
return 0;
}
默认构造函数,无参构造函数会调用随机值,导致看起来似乎没什么作用?让我们看看下面的例子
class Time
{
public:
Time()
{
cout << "Time" << endl;
_hour = 0;
_minute = 0;
_second = 0;
}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
//基本类型(内置类型)
int _year;
int _month;
int _day;
//自定义类型
Time s;
};
int main()
{
Date d1;
d1.Print();
system("pause");
return 0;
}
7.C++把类型分为自定义类型(内置类型)和自定义类型。编译器生成的构造函数会对自定义类型成员调用它的默认函数。
3.析构函数
定义:
对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
特性:
1.析构函数是在类名前加一个 ~
2.无参数无返回值
3.一个类有且只有一个析构函数
4.类的生命周期结束时,C++编译器自动调用析构函数。
5.对自定义类型成员调用析构函数。
4.拷贝函数
定义:
只有单个形参,该形参是对类类型对象的引用(用const修饰),再用已存在的类类型对象创造新类型对象时由编译器自动调用。
特性:
1.是构造函数的一个重载类型
2.参数只有一个,必须使用引用传参,使用传值方式会引起引发无穷递归
Date(const Date* d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
3.若未显示定义,系统自动生成临时拷贝
Date d2(d1);
用上述式子调用。
4.编译器自动生成的默认拷贝构造函数可以完成字节的拷贝。
5.赋值运算重载
定义:
赋值运算重载具有特殊函数名的函数。
函数名字:operator后面接需要重载的运算符号
函数原型:返回值类型(operator)操作符。
注意点:
1.用于内置类型的操作符,其含义不能改变。如operator+
2.操作符有一个默认形参this,限定为第一个形参
3. ::、sizeof、?:、. 、.*不能做为运算符重载。
4. 重载操作符必须有一个类类型或者枚举类型的操作数
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
bool operator == (const Date& d2)
{
return _year == d2._year
&&_month == d2._month
&&_day == d2._day;
}
int _year;
int _month;
int _day;
};
void Test()
{
Date d1(2018, 9, 26);
Date d2(2018, 9, 27);
cout << (d1 == d2) << endl;
}
赋值运算符的四个要点:
1.参数类型
2.返回值
3.检查是否自己给自己赋值
4.返回*this
5.一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。
6.const成员
定义:
将const修饰的类成员函数称为const成员函数。const实际在修饰成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
问题:
- const对象可以调用非const成员函数吗? 不能
- 非const对象可以调用const成员函数吗? 能
- const成员函数内可以调用其它的非const成员函数吗?能
- 非const成员函数内可以调用其它的const成员函数吗?不能