C++ 类和对象的初步介绍
文章目录
- 1.面向过程和面向对象的初步认识
- 2.类的引入
- 3.类的定义
- 4. 类的访问限定符及封装
- 4.1 访问限定符
- 4.2 封装
- 5.类的作用域
- 6.类的实例化
1.面向过程和面向对象的初步认识
C语言是面向过程的,关注的过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的对象,将一件事情拆分成不同的对象,靠对象间的交互完成。
面向对象编程是一种常用的编程思维,它强调万物皆为对象,因此在编程时我们可以把现实世界中的事物抽象成程序中的对象,从而实现软件的设计与开发。与传统的函数编程不同,面向对象编程注重将数据与行为封装在一起,也就是对象包含数据状态,还包含可调用的行为方法。
面向对象编程的特点在于,它具有封装,继承和多态三大特性,封装意味着对象的状态和行为进行封装,使其对外只需要暴露出必要的接口,从而提高了安全性和可维护性;继承是指某个对象可以继承另一个对象的特性,从而快速构建相似属性的对象;多态是指同一种行为在不同的对象上具有不同的表现形式,即在不同的情境下,同一方法可以被不同的对象进行调用。
总之面向对象是一种强大的编程方法,它具有高度的封装性、灵活的继承性和强大的多态性,通过使用对象作为程序的基本处理单元,实现了数据和行为高度有机结合,可以使程序更加高效,结构清晰,并方便管理和扩展。
2.类的引入
C语言结构体中只能定义变量,在C++中,结构体不加可以定义变量,也可以定义函数。比如:
typedef int DataType;
struct stack
{
int top;
int capacity;
DataType* array;
void Init() {
top = 0;
array = (DataType*)malloc(sizeof(DataType) * 4);
if (array == nullptr) {
perror("malloc");
return;
}
capacity = 4;
}
void Push(DataType x) {
if (top == capacity) {
//扩容
DataType* tmp = (DataType*)realloc(array, sizeof(DataType) * (capacity * 2));
if (tmp == nullptr) {
perror("realloc");
return;
}
array = tmp;
capacity *= 2;
}
array[top] = x;
top += 1;
}
DataType Top() {
if (top == 0) {
cout << "stack is empty";
}
return array[top - 1];
}
};
int main()
{
struct stack ss;
ss.Init();
ss.Push(1);
ss.Push(1);
ss.Push(1);
return 0;
}
用C语言实现的栈,结构体中只能定义变量,而现在用C++实现,会发现struct
中也可以定义函数。
同时我们也发现,我们再也不用像C语言那样在传个结构体类型到函数中了,直接就可以使用结构体中的变量。
不过在C++中,我们更倾向于用class来定义类。
3.类的定义
class ClassName{
//类的组成成分:成员变量和成员函数
};
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。注意分号就是了。
类体中的内容称为类的成员:类中的变量称类的属性或成员变量;类中的函数称为类的方法或者成员函数。
类的两种定义方式
- 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class TestClass{
public:
void Print(){
cout<<_a<<_b<<_c<<endl;
}
private:
char* _a;
int _b;
int _c;
};
- 类声明放在
.h
文件中,成员函数定义在.cpp
文件中,注意:成员函数名前面需要加类名::
//test.h
class TestClass(){
public:
void Print();
private:
char* _a;
int _b;
int _c;
};
//test.cpp
void TestClass::Print(){
cout<<_a<<_b<<_c<<endl;
}
在一般情况下,更期望采用第二种方式。
类中成员变量命名建议:建议在命名前或者后加上下划线。
name -> _name
age -> _age
这样的话,可以很好的类中的成员变量和其他变量。
4. 类的访问限定符及封装
4.1 访问限定符
C++实现封装的方式:用类将对象的属性于方法结合在一块,让对象更加完善,通过访问权限限制性的将其接口提供给外部的用户使用。
- public修饰的成员在类外可以被直接访问。
- protected和private修饰的成员在类外不能直接被访问。
- 访问权限作用域从该修饰限定字符出现的位置开始直到下一个访问限定符出现为止。
- 如果后面没有访问限定符,作用域就到
}
截止。 - class的默认访问权限为private,struct的默认访问权限为public。
提问:C++中的struct和class的区别
回答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义类默认访问权限是private。
注意:访问限定符只在编译时有效,当数据映射到内存1后,没有任何访问限定符的区别。
4.2 封装
将数据和操作方法进行有机结合,隐藏对象的属性和实现细节,仅公开对外接口和对象进行交互。
封装的本质是一种管理,让用户更方便使用类。
就像诸多的电子产品,即使内部结构复杂,但对于使用者来说,不需要区关心它们的内部核心部件,只需要操作其暴露在外部的按钮就可以了,让用户与其完成交互。
在C++语言中实现封装,可以通过将数据以及操作数据的方法进行有机的结合,通过访问权限来隐藏对象内部的细节,控制那些方法可以在类外部直接被使用。
5.类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员时,需要使用::
作用域操作符来指明成员属于哪个类域。
class Person
{
public:
void PrintPersonInfo();
private:
char name_[20];
char age_;
};
//指定类域
void Person::PrintPersonIn()
{
//...
}
6.类的实例化
用类类型创建对象的过程,称为类的实例化
- 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成一个类,来描述学生的信息。
- 一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储类成员变量。
int main()
{
Person yui;//实例化对象
yui.age_ = 18;//初始化
return 0;
}