C++类的基本点
(1)类的定义
在C++中,用“类”描述“对象”。对象是构成系统的基本单位,可以是自然物体,也可以是一种逻辑结构等。
类是所有面向对象的语言的共同特征,类是对象的抽象,而对象是类的具体实例。可以说类是对象的模板,用来定义对象的抽象类型。
(2)成员访问限定符
public(公有的):既可以被本类中的成员函数引用,也可以被类的作用域的其他函数所用。
private(私有的):只能被本类中的成员函数所引用,类外不能调用。
protected(受保护的):不能被类外访问,可被派生类的成员函数访问。
(3)类的三大特性:继承、封装、多态
现在声明一个类:
class student//类名
{public://访问限定符
void show()//成员函数
{
cout << _name << endl;
cout << _age << endl;
cout << _sex << endl;
}
public:
//成员变量
char *_name;
int _age;
char *_sex;
};
int main()
{
//实例化
student s1;
s1._name = "小张";
s1._age = 18;
s1._sex = "男";
s1.show();
student s2;
s2._name = "小李";
s2._age = 18;
s2._sex = "女";
s2.show();
system("pause");
return 0;
}
类的四个默认成员函数
(1)构造函数
私有成员变量要进行初始化,必须用一个公有的函数进行,同时这个函数应该在定义对象时自动执行一次,此时调用的函数称为构造函数。构造函数是一种特殊的成员函数,需要注意的是:
a、与其他函数不同,不需要用户调用构造函数,它在建立对象时自动生成。
b、构造函数的名字必须与类名相同,不能任意命名。
c、构造函数不具备任何类型,不返回任何值,它的作用只是对对象进行初始化。
d、构造函数可重载。
e、若用户没有定义构造函数,则系统会自动生成一个函数体是空的构造函数,没有参数,不执行初始化操作。
(2)拷贝构造函数
通过一个存在的对象初始化一个新建的对象,是使用同类对象进行初始化。与构造函数在创建对象直接进行初始化有差别。
拷贝构造函数的特点是:它其实是一个函数的重载;参数必须使用引用传参,使用传值方式会引发无穷递归调用;若为自定义,系统会默认缺省的拷贝构造函数。
下面是一个包含构造函数与拷贝构造的函数的程序:
class date
{
public:
date()//无参构造函数
{
_year = 1995;
_month = 10;
_day = 9;
}
date(int year,int month,int day)//带参构造函数
{
_year = year;
_month = month;
_day = day;
}
date(const date&d)//拷贝构造函数
{
_year = d._year;
_month = d._month;
_day = d._day;
}
void display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
date d1;//调用无参函数
d1.display();
date d2(2017, 10, 9);//调用带参函数
d2.display();
date d3(d1);//调用拷贝构造函数
d3.display();
date d4 = d2;//调用拷贝构造函数
d4.display();
system("pause");
return 0;
}
(3)析构函数
当对象的生命期结束时,会自动执行析构函数。析构函数是与构造函数作用相反的函数,它的名字是类名的前面加一个“~”符号。 析构函数的特点是:
a、析构函数不返回任何值,没有函数类型,也没有函数参数。
b、析构函数没有函数参数,所以不能被重载。一个类只能有一个析构函数。
c、析构函数的作用并不是删除对象,而是在撤销对象占有内存前进行清理工作。
下面是一个包含析构函数的程序:
class date()
{
public:
~date()//析构函数
{
}
private:
int _year;
int _month;
int _day;
}
(4)赋值操作符重载
它是两个已有对象一个给另一个赋值的过程,不同于拷贝函数。
拷贝函数是用已有对象给新生对象赋初值的过程,赋值运算符的重载是对一个已存在的对象进行拷贝赋值。
运算符重载
(1)目的:增强程序的可读性,C++支持运算符重载
(2)运算符重载的特征:重载<运算符的函数名:operator<;运算符重载后,不能改变运算符的优先级/结合行/操作数个数;5个不能C++重载的运算符:./::/sizeof/?:/.*
隐含this 指针
(1)每个成员函数都有一个指针形参,名字固定,称为隐含this指针。
(2)编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针。
(3)this 指针是成员函数隐含指针形参,是编译器自己处理的,不能在成员函数的形参中添加this指针的参数定义,也不能调用时显示传递对象的地址给this指针。
下为编译器处理隐含this指针: