类和对象
初步认识
C语言是面向过程,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题;
C++是基于面向对象的,关注的是对象,讲一件事情拆分成不同的对象,靠对象之间的交互完成。
类
class为定义类的关键字,class 后跟类的名字,{}中为类的主题,结束时后面是分号。
class A { //类体:由成员函数和成员变量组成 };
访问限定符
public修饰的成员可以在类外直接访问;
protected和private不可以在类外直接访问;
访问权限作用域从访问限定符出现的位置开始直到下一个访问限定符出现的时为主;
class的默认访问权限为private,struct为public。
面向对象的三大特性:封装、继承、多态。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对公开接口来和对象进行交互。
在类体外定义成员,需使用::作用域解析符指明成员属于那一个类。
类成员函数的this指针
this指针的存在位置: 栈上
特性:
- 类型:类类型* const;
- 只能在“成员函数”的内部使用;
- 本质上是一个成员函数的形参,是对象调用成员函数是,将对象地址作为实参传递给this形参,所以对象中不存储this指针;
- this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过ecx寄存器自动传递,不需要自主传递。
类的6个默认成员函数
1.初始化函数
2.析构函数
3.拷贝函数
4.赋值重载
5.取地址重载(普通对象和const对象取地址)
class Date
{
public:
//构造函数
//无参
Date()
{
}
//带参
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
//析构
~Date()
{
cout << "Date() "<<endl;
}
//拷贝
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
//赋值(==为例)
bool operator==(Date& d)
{
return _year == d._year &&
_month == d._month &&
_day == d._day;
}
//取地址
Date* operator&()
{
return this;
}
const Date* operator& ()const
{
return this;
}
private:
int _year;
int _month;
int _day;
};
初始化列表
以一个冒号开始,接着以一个逗号分隔的数据的成员列表,每个成员后面跟一个放在括号中的初始值或表达式。
class Date
{
public:
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
}
private:
int _year;
int _month;
int _day;
};
explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。
static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的
成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化
特性:
- 静态成员为所有类对象所共享,不属于某个具体的实例
- 静态成员变量必须在类外定义,定义时不添加static关键字
- 类静态成员即可用类名::静态成员或者对象.静态成员来访问
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
- 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值、const修饰符等参数
友元
分类:友元函数、友元类
友元函数:
class Date
{
friend ostream& operator<< (ostream& out, const Date& d);
friend istream& operator>> (istream& in, Date& d);
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
ostream& operator<< (ostream& out, const Date& d)
{
out << d._year << "-" << d._month << "-" << d._day << endl;
return out;
}
istream& operator>> (istream& in, Date& d)
{
in >> d._year;
in >> d._month;
in >> d._day;
return in;
}
友元类:
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
友元关系是单向的,不具备交换性;
友元关系不能传递。
内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。
特性
- 内部类可以定义在外部类的public、protected、private都是可以的。
- 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
- sizeof(外部类)=外部类,和内部类没有任何关系。