类的引入
c 语言的结构体只能定义变量
但是
c++的结构体除了定义变量之外,还可以定义函数。
感受感受:
#define _CRT_SECURE_NO_WARNINGS 1
//我们声明一个结构体
struct Stack
{
// c++可以把函数写在结构体中
//叫成员函数:
// 如下:
//c++的写法:初始化一个栈
void Init() //这里可以不用传参,因为它是成员函数,成员变量它可以直接访问
{
a = nullptr;
top = 0;
capacity = 0;
}
//压栈:
void Push(int x)
{
//..........
}
//成员变量
int* a;
int top;
int capacity;
};
//c语言的写法____初始化一个栈
void StackInit(struct Stack* ps)
{
//......
}
//c语言的写法____压栈
void StackPush(struct Stack* ps, int x)
{
//......
}
int main()
{
//在c++中,我们可以有两种方式来定义这个结构体
//方式一:用c语言的方式
struct Stack st1;
//方式二: 因为结构体在c++中升级成了类,所以可以这样使用,不用加struct了。
Stack st2;
//c语言的结构体的初始化:
StackInit(&st1);
//c++的结构体的初始化:
st2.Init();
//c语言的-----压栈:
StackPush(&st1,3);
//c++的------压栈:
st2.Push(3);
return 0;
}
类的定义
看:
class
为定义类的关键字,ClassName
为类的名字,{}
中为类的主体,注意类定义结束时后面分号不能省略。
你会感觉:class
和 struct
的用法有点相似;
那么他们有什么区别吗?
区别就是访问限定符
类的访问限定符即封装
访问限定符
【访问限定符说明】
- public修饰的成员在
类
外可以直接被访问 - protected和private修饰的成员在
类
外不能直接被访问(此处protected和private是类似的) - 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到
}
即类结束。 - class的默认访问权限为
private
,struct为public
(因为struct要兼容C)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
#include<iostream>
using namespace std;
class Stack
{
public: //修饰限定符,公有的。
void Init()
{
a = nullptr;
top = 0;
capacity = 0;
}
//压栈:
void Push(int x)
{
if (top == capacity) //如果满足,说明栈满了
{
//满了的话就扩容空间
//第一步:确定新空间的大小
size_t newcapacity = capacity == 0 ? 4 : capacity * 2;
a = (int*)realloc(a, sizeof(int) * newcapacity);
capacity = newcapacity;
}
//我们默认top是指向0的,那我们要先放上数据在加加
a[top++] = x;
}
//出栈:
int Top()
{
return a[top - 1];
}
private: //private 是访问限定符,意思是 :私有。 一般情况下,一个类的成员变量都是私有的
//成员变量
int* a;
int top;
int capacity;
};
int main()
{
//定义一个栈
Stack st;
//初始化这个栈
st.Init();
st.Push(1);
st.Push(2);
st.Push(3);
st.Push(4);
cout << st.Top() << endl;
return 0;
}
C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别。
注意
类里面是不受访问限定符的限制的,访问限定符限制的是类外面的对类里面的访问。
类可以做声明和定义的分明吗?
答:类 是可以做声明和定义的分离的
func.h
头文件 头文件中是声明
#include<iostream>
using namespace std;
class Stack
{
public:
//成员函数
void Init();
void Push(int x);
int Top();
private:
//成员变量
int* a;
int top;
int capacity;
};
func.cpp
这个文件中就放定义
#include"Func.h"
void Stack::Init()
{
a = nullptr;
top = 0;
capacity = 0;
}
//压栈:
void Stack::Push(int x)
{
if (top == capacity)
{
size_t newcapacity = capacity == 0 ? 4 : capacity * 2;
a = (int*)realloc(a, sizeof(int) * newcapacity);
capacity = newcapacity;
}
a[top++] = x;
}
//出栈:
int Stack::Top()
{
return a[top - 1];
}
声明和定义y也可以全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内
联函数处理