这篇文章讲的主要是类和对象中的一些基础知识。将会讲到有关类的定义、访问限定符、类域、类的大小、this指针的内容。
目录
类
类的定义
关键字:class,后接类名,{}中存放类的主体内容,}后面的分号不能省略(与结构体类似)。类中的内容称为成员变量和成员函数。为了区分,一般会在成员变量和成员函数前或者后面加上_或m,来表示其是类中的内容。定义在类中的函数默认为内联函数;只是声明却在类外使用::来定义的函数不被默认为是内联函数。
访问限定符
使用public、private和protected来修饰类中的成员变量和成员函数。使用public修饰的成员可以直接在类外被访问(还是要使用::来访问类);使用private和protected修饰的成员不能在类外被访问,在后面在来讲他们的区别。一个访问限定符的作用域是从该访问限定符出现的位置开始到其他的访问限定符出现之前,其中的内容都将被这个访问限定符修饰。如果没有使用访问限定符,则自动默认为private。
类域
在上一节中我们提到C++中有四种域,现在我来讲讲其中的一种类域。在类外使用类域中的成员时需要使用作用域操作符::(和命名空间一样)来指明成员属于哪个类域。类域影响编译的查找规则。
类的大小
类的大小计算方法和结构体的类似,都遵循相同的内存对齐规则(在结构体中有讲解),是为了系统更快的访问数据。但是类中的成员函数占用的内存不被不计算进去。
实例化
实例化就是类在内存中创建对象的过程。类在实例化对象前,其中的内容都是一种声明,只有实例化后才分配了内存。一个类可以实例化多个对象。
this指针
在调用类中的构造函数时我们不由得产生疑问,它是怎么找到不同实例化对象中的成员的呢?实际上,编译器在编译后会在第一形参的位置隐式生成一个this指针,它的类型为当前类类型。以Stack为例,调用构造函数时的传参为(Stack* const this, int x)。
讲了这么多来段代码体会一下
//类的定义
//栈类
class Stack
{
public:
//成员函数
//初始化
//在类中定义的函数默认为内联函数
void Init(int n = 4)
{
_arr = (int*)malloc(sizeof(int) * n);
//检查
if (_arr == NULL)
{
perror("malloc");
return ;
}
capacity = n;
top = 0;
}
//入栈
void StackPush(int x)
{
assert(_arr);//不能为空
_arr[top++] = x;
}
//取栈顶数据
int StackTop()
{
assert(_arr);
return _arr[top - 1];
}
//销毁栈
void StackDestory()
{
free(_arr);
_arr = nullptr;
capacity = 0;
top = 0;
}
private:
//成员变量
int* _arr;
size_t capacity;
size_t top;
};//冒号不能少
class A
{
};
int main()
{
//调用栈中函数
//实例化对象
Stack st;
st.Init();
st.StackPush(1);
st.StackPush(2);
st.StackPush(3);
int ret = st.StackTop();
cout << ret << endl;
cout << sizeof(st) << endl;
//实例化对象
Stack st2;
st2.Init();//隐藏this指针区分st和st2 Stack* const this
st2.StackPush(4);//不能将this指针显示说明,但是可以在函数体内使用this指针
//实例化对象
A a;
//类中没有放任何参数,计算其大小
cout << sizeof(a) << endl;
return 0;
}
//日期类
class Date
{
public:
//初始化
//声明
void Init(int year, int month, int day);
private:
//为了区分成员变量在变量前or后加_
//此处没有开辟空间,仅是声明
int _year;
int _month;
int _day;
};
//类中的函数在声明和定义分离时,需要指定类域
//在当前域中找不到函数中成员的声明域定义在哪里
//在类中声明在类外定义的函数不被默认为内联函数
void Date::Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
int main()
{
//实例化对象
Date d;
d.Init(2025, 3, 10);
return 0;
}
好了,今天的干货就分享到此了。看没看懂都点个赞呗。