一.类
1.类的定义
类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance)
,拥有类的成员变量和成员函数。
class Person
{
public:
void Display()
{
cout << _name << ":" << _age << ":"
<< _sex << ":" << _id << endl;
}
char* _name;
int _age;
char* _sex;
int _id;
};
void main()
{
Person p;
p._name = "Peter";
p._age = 18;
p._sex = "boy";
p._id = 001;
p.Display();//不能直接调用Display,在使用前要加对象。
}
2.访问限定符
public,private,protected
a.public成员可以从类外直接访问,private和protected成员不能从类外部直接访问到
b.每个限定符可以在类中多次使用,它的作用域是从该限定符出现到下一个限定符之前或类体结束之前
c.类体中如果没有定义限定符,则默认为私有的
d.类的访问限定符体现了面向对象的封装性
3.对象的大小的计算
所有变量之和(不算成员函数,成员函数存在于公共代码区)
在计算时遵从内存对齐:
内存对齐可以提高效率
class BB
{
};
输出时
cout<<sizeof(BB)<<endl;
结果为1。起到占位作用,表示这个类定义的对象是存在的
二.类的6个默认成员函数
1.构造函数
定义:要对私有的成员函数进行初始化,必须用一个公有的成员函数来进行。并且只在定义对象是自动执行一次。
特征:a.函数名和类名相同
b.无返回值
c.对象构造时系统自动调用对应的构造函数
d.可以重载
e.可以在类外定义,也可以在类体里定义
f.如果类定义中没有给出构造函数,则会自动生成一个缺省的构造函数(不传参数)
g.无参的构造函数和全缺省的构造函数都认为是缺省的构造函数,缺省的构造函数只能有一个
class Date
{
public:
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
//无参的构造函数
Date()
{}
//有参的构造函数
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
2.拷贝构造函数
定义:创建对象时用同类对象初始化
特征:a.是构造函数的重载
b.参数必须引用传参,否则会无穷递归
c.没有显示定义,系统会自动生成缺省的拷贝构造,依次拷贝类成员进行初始化
class Date
{
public:
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
Date(int year = 1990,int month = 1 ,int day = 1)
{
_year = year;
_month = month;
_day = day;
}
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}//拷贝构造函数
private:
int _year;
int _month;
int _day;
};
3.析构函数
定义:当一个对象的生命周期结束后,C++自动调用一个成员函数
特征:a.析构函数在类名前加~
b.无参无返回值
c.一个类有且只有一个析构函数,未定义时系统会自动生成缺省的析构函数
d.对象生命周期结束时,C++自动调用
e.进行清理工作
class Date
{
public:
~Date()
{}
private:
int _year;
int _month;
int _day;
};
4.赋值操作符重载
运算符重载:operator+合法的运算符构成函数名
不能改变优先级/结合性/操作数个数
5个不能重载的运算符: .* :: sizeof ?: .
赋值操作符重载定义:对一个已存在的对象进行拷贝赋值
class Date
{
public:
Date(int year = 1990,int month = 1 ,int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
//bool operator == (Date* this,const Date& d)
bool operator == (const Date& d)//隐含一个this指针
{
return _year == d._year
&& _month == d._month
&& _day == d._day;
}
private:
int _year;
int _month;
int _day;
};
Date operator = (const Date& d)
{
if (this != &d)
{
this->_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
d1 = d2 = d3;
Date& operator = (const Date& d)
//编译器系统会对以上代码做什么样的处理?
//d2.operator = (&d2,d3) =>return *this(d2)
//d1.operator = (&d1,d2.operator = (&d2,d3)) => return *this(d1)