目录
什么是类
类将现实生活中相似的事物抽象出来,将它的不同类型的属性以及其相关操作封装在一起,分为公有、私有,构成一个集合,形成的一种新的数据类型。
类中有相关的属性和操作
如:
水果类:苹果、香蕉、葡萄
属性:颜色、大小
操作:吃、榨汁
学生类:小学生、中学生、大学生
属性:学号、姓名、年龄
操作:学习
对象:是类的一个实例化,是现实生活中存在的,占用内存单元。如:苹果是水果类的一个对象。
类的定义
class 类名
{
访问权限(public/private/protected):
成员变量/成员函数;
};
类中有公有、私有、保护三种类型的数据
public:自己和外界都可以访问——操作(成员函数)
private:自己和友元可访问,其他都不可访问——属性(成员变量)
protected:自己和子类可访问,外界不能访问
类的大小
1.类中数据成员大小之和
2.普通函数不占类的空间大小
3.static数据成员不在类中分配空间
4.virtual虚函数占一个指针大小(x64:8,x86:4)
class Clock//钟表类
{
public:
void Set();
void Show();
virtual void fun() {};
private:
int m_hour;
int m_minute;
int m_second;
static int a;
};
int main()
{
Clock c;
cout << sizeof(Clock) << endl;//内存对齐(x64)输出:24
}
this指针
非静态成员函数中有隐藏的this指针,接收当前对象的地址
使得多次调用此函数时,传入的参数不会混淆
class Clock
{
public://同名不同参——重载
void Set()//void Set(this)
{
m_hour = 10;
m_minute = 10;
m_second = 10;
}
void Set(int hour)//Set(this,int hour)
{
m_hour = hour;
this->m_minute = 20;//可以这样写
m_second = 20;
}
void Show()
{
cout << m_hour<<":"<<m_minute<<":"<<m_second<< endl;
}
private:
int m_hour;
int m_minute;
int m_second;
};
缺省函数——在声明函数的时候指定默认值
带参数的函数
1.如果没有传参,则调用默认值;
2.如果传参了,就用所传递的值;
3.如果有一个带默认值,则后面(右边)的必须带默认值;
4.参数的默认值只在声明的时候带,在定义的时候不带
(如果将函数的定义放在类的外部,则不需要带默认值)
5.不能函数重载了
inline内联函数——在类里面实现的函数
内联函数在编译的时候就执行了:空间换时间
将功能比较简单,代码比较短小(五行以内)的函数作为内联函数
inline只是程序员的建议,至于编译器是否按照inline来编译是不一定的。
代码相对多,功能复杂的函数,即使人为写成了inline函数,编译器也不会按照inline函数编译
class Clock
{
public:
void Set() {}
inline void Set(int hour = 23,int minute = 30, int second = 30)//内联函数
{
m_hour = hour;
m_minute = minute;
m_second = second;
}
void Show()//按照inline函数来编译
{
cout << m_hour << ":" << m_minute << ":" << m_second << endl;
}
virtual void fun() {};
private:
int m_hour;
int m_minute;
int m_second;
};
int main()
{
Clock c1;
c1.Set(13,13);
c1.Show();//13:13:30
}
宏定义与inline的区别
1.宏定义在编译之前展开,inline在编译时
2.宏定义会出现歧义,inline函数不会
3.宏定义时预处理命令,inline是函数(本质不同)