一、面向过程与面向对象的初步认识
C语言是面向过程的,关注的是过程,分析出问题的步骤,通过函数调用逐步解决问题。
C++是面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成。
二、类的引入
在C语言中,结构体只能定义变量,但在C++中结构体不仅仅能定义变量,它还可以定义函数。
例如:在C语言中实现栈,在结构体中只能定义变量。但在C++中便可以在结构体中直接定义函数,更加容易区分。如:
#include<iostream>
#include<assert.h>
using namespace std;
struct Stack
{
void Init()
{
a = nullptr;
size = capacity = 0;
}
void Push(int x)
{
if (capacity == size)
{
int newcapacity = capacity == 0 ? 4 : capacity * 2;
int* tmp = (int*)realloc(a, sizeof(int) * newcapacity);
if (tmp == nullptr)
{
perror("realloc fail\n");
exit(-1);
}
a = tmp;
capacity = newcapacity;
}
a[size++] = x;
}
void Pop()
{
size--;
}
int Top()
{
return a[size - 1];
}
void Destory()
{
free(a);
a = nullptr;
size = capacity = 0;
}
int* a;
int size;
int capacity;
};
int main()
{
Stack st;
st.Init();
st.Push(1);
st.Push(2);
st.Push(3);
st.Push(4);
st.Pop();
cout << st.Top() << endl;
st.Destory();
return 0;
}
但是在C++中更喜欢用class定义类
三、类的定义
class classname
{
//成员函数或成员变量
};
类有两种定义方法:
- 声明和定义全部放在类体中,如:
class A { void Print() { cout << "A" << endl; } int Add(int& a, int& b) { return a + b; } int a; int b; };
注:成员函数在类中定义,编译器可能会将其当成内联函数处理。
-
声明放在在头文件中,定义放在源文件中。注:成员函数在定义时,需要在函数名前加类名::。如:
//头文件 class name { public: void Print(); private: char* n; int a; }; //源文件 void name::Print() { cout << "a" << endl; }
四、类的访问限定符即封装
4.1封装
封装是指将数据和操作数据的方法放在一起,隐藏对象的属性和实现细节,仅对外公开接口和对象交互。在C++中就是,通过访问权限来隐藏对象内部的实现细节,控制那些方法可以在外部使用。
封装本质上就是一种管理,让用户更方便的使用类。
4.2访问限定符
在C++中,类一共有三个访问限定符,分别是:public、private、protected
访问限定符的说明
- public修饰的成员可以在类外进行访问
- protected和priva修饰的成员在类外不能直接被访问到
-
访问权限的作用域是从该访问限定符出现的位置开始到下一个访问限定符结束。如果后面没有访问限定符,作用域就到类的结束
-
class的默认访问权限是private
C++中class和struct的相同点:
由于C++需要兼容C语言,所有的C++中struct是可以当结构体使用的,还可以用来定义类,和class定义类是一样的。
C++中class和struct的不同点:
class的默认访问权限是private而struct的默认访问权限是public