C++作为一门面向对象的高级语言(OOP——Object Oriented Programming)自然有着相应概念与定义。
一.class——类的引入
在C语言中,结构体只能定义变量,无法定义函数。后C++引入class(此时还不叫“C++”,而是“C with Classes”,在1983被正式更名为C++),可以理解为一个可以定义函数的结构体(二者略有不同)
二.对象——类的实例化
定义了一组属性和行为的模板或蓝图;对象则是其具体化实现、是类的实例,具体实现类定义的属性和行为。
三.类的定义
class className
{
//成员变量
//成员函数
//成员对象
};
成员变量没什么好说的,这里主要讲成员函数和成员对象。
1.成员函数
(1)函数的声明和实现全都放在类中,但这样编译器可能会将成员函数作为内联函数处理
class Myclass
{
public:
void Fuc(int a)
{
a += 10;
}
};
int main(void)
{
Myclass c1;
c1.Fuc(10);
return 0;
}
汇编代码如下
Myclass c1;
c1.Fuc(10);
00007FF6DD581503 mov dword ptr [rsp+58h],0Ah
00007FF6DD58150B mov eax,dword ptr [rsp+58h]
00007FF6DD58150F add eax,0Ah
00007FF6DD581512 mov dword ptr [rsp+58h],eax
可以看到函数直接在这里展开
补充:内联函数——inline
由inline修饰的函数会在编译阶段于调用函数处展开,并不会调用函数(这种情况仅在被inline修饰函数的内容较少时出现,具体由编译器判断)
(2)只在类中声明函数,类外实现 ,但类外实现须在函数名前加上类名::
class Myclass
{
public:
void Func(int a);
};
void Myclass::Func(int a)
{
a += 10;
}
int main(void)
{
Myclass c1;
c1.Func(10);
return 0;
}
2.成员对象
class Myclass_f
{
int _a;
};
class Myclass_s
{
Myclass_f obj1;
};
int main(void)
{
return 0;
}
类的成员变量是另一个类的实例,上述代码中;Myclass_s中的实例化对象被称为成员对象。
四.类的访问限定符——public,protected,private
public修饰的成员可以在类外直接被访问,protected、private则不行。访问权限作用域从该访问限定符出现的位置直到下一个访问限定符出现为止。class的默认访问限定符为private,struct则为public(为兼容C)
注:访问限定符只在编译阶段有用,当数据映射到内存后,无任何区别。
五.类的大小
类的大小为成员变量之和,但成员函数被放在公共代码段,不被算入大小,空类大小为一。计算规则依旧遵循C语言中的内存对齐规则,参考代码如下:
#include<iosteam>
using namespace std;
class Myclass_f
{
int _a;
int _b;
char _s;
char arr[4];
};
class Myclass_s
{
};
int main(void)
{
Myclass_f obj1;
Myclass_s obj2;
cout << sizeof(obj1) << endl;
cout << sizeof(obj2) << endl;
return 0;
}
输出结果为:16
1
、