一、类的定义格式

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,而是被编译器认定为一个全局变量,在这个为指定的函数中是不能找到上述定义的成员变量的。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部