一、类的定义格式
1、首先我们创建一个类:
#include<iostream>
using namespace std;
class Stack
{
//公有的
public:
//定义一个成员函数并给一个默认的缺省值
void Init(int n = 6)
{
int* arr = (int*)malloc(sizeof(int) * n);
if (arr == NULL)
{
perror("malloc");
exit(1);
}
_capacity = n;
_top = 0;
}
//私有的
//定义成员变量
private:
int* _arr;
int _capacity;
int _top;
};
class为定义类的关键字,Stack为类的名字,{}中的为类的主体,需要注意的是类的定义结束后最后的分号是不能省略的。
类中的内容称为类的成员:类中的变量称为类的属性或者成员变量、类中的函数称为类的方法或者成员函数。
可以看到在定义成员变量时,每个变量前面都加了 "_" ,这是定义成员变量时添加的一个特殊标识,主要是为了区分成员变量,该特殊标识不是强制性添加的,可以不加。
我们知到C++是完全兼容C的,所以在C中的大部分用法在C++中同样适用:比如struct的用法
只不过在C++中struct在使用中可以被升级成定义类的关键字,与class的用法相同,但是不推荐使用。
定义在类前面的成员函数默认为inline。
2、下面是我们之前使用C来push、top、destroy数据的过程
class Stack
{
//共有的
public:
//定义一个成员函数并给一个默认的缺省值
void Init(int n = 6)
{
int* arr = (int*)malloc(sizeof(int) * n);
if (arr == NULL)
{
perror("malloc");
exit(1);
}
_capacity = n;
_top = 0;
}
//再定义一些成员函数
//插入数据
void Push(int x)
{
//扩容
_arr[_top++] = x;
}
//取顶部数据
int Top()
{
assert(_top > 0);
return _arr[_top - 1];
}
//销毁
void Destroy()
{
free(_arr);
_arr = nullptr;
_capacity = _top = 0;
}
//私有的
//定义成员变量
private:
int* _arr;
int _capacity;
int _top;
};
int main()
{
//调用初始化 插入 取数据 销毁函数
return 0;
}
3、使用C++的方式来实现相关的方法
// 定义一个时间类
class Data
{
public:
// 对这个类进行初始化操作
// 可以全部给缺省值也可以都不给
//void Init(int year = 1, int month = 1, int day = 1)
void Init(int year , int month , int day )
{
year = _year;
month = _month;
day = _day;
}
// 定义类成员
private:
int _year;
int _month;
int _day;
};
int main()
{
Data d;
d.Init(2024,9,14);
return 0;
}
二、C++中的访问限定符
1、publice:修饰的成员可以在类外直接访问 公共的
2、private:修饰的成员不可以在类外访问 私有的
3、class定义的类中的成员在没有被访问限定符修饰时默认为private
4、struct定义的类中的成员在没有被访问限定符修饰时默认为public
作用域:它们的作用域都是从当前限定符开始一直到下一个限定符的出现,如果后面没有访问限定符那么就一直到遇到下一个}终止。
三、类域
类定义了一个新的作用域,类所有成员都在类的作用域中,在类外定义成员时,需要使用::作用域操作符指明成员属于哪个类域。
class Stack
{
public:
void Init(int age = 18);
private:
int _age;
};
void Init(int age)
{
age = 18;
cout << age << endl;
}
void Stack::Init(int age)
{
age = 20;
cout << age << endl;
}
int main()
{
Stack st;
st.Init();
}
可以看到最终的输出结果是20。这也就说明了类域影响的编译的查找规则,上面程序中的Init调用,编译器会输入被类域所影响的函数。
当我们单独调用Init函数时,编译器报错,参数太少。
说明这里的Init并不是上面类中定义的Init,而是被编译器认定为一个全局变量,在这个为指定的函数中是不能找到上述定义的成员变量的。