标题:【Cpp】类和对象
@水墨不写bug
正文开始:
(一)面向过程与面向对象
面向过程和面向对象是两种不同的编程思想。
面向过程指的是将程序分解成多个步骤,每个步骤都是一个独立的函数,通过函数之间的调用实现程序的功能。面向过程的程序设计着重于算法和步骤的顺序,将问题分解为一系列的步骤来解决。
面向对象则是以对象为中心的编程思想。对象是数据和操作数据的函数组合而成的。面向对象的程序设计着重于对象之间的交互和关系,将问题分解为一组对象之间的协作。
面向过程和面向对象的主要区别在于思考问题的角度和解决问题的方式。面向过程更加注重步骤和算法的实现,而面向对象更加注重对象之间的关系和交互。同时,面向对象的程序设计可以更好地实现封装、继承和多态等特性,使代码更加灵活和可复用。
举个例子:点外卖
面向过程,将从你下单点外卖到你拿到饭菜,到这一动作分成若干步骤:
你下单——商家做饭——骑手取餐——商家骑手交接——骑手送餐——你拿到饭菜。
而面向对象,就截然不同了。
面向对象注重的是骑手,商家,顾客三个类实例化产生的对象之间的交互:你选择了哪个商家,商家输出产品,骑手输送产品等动作,都是实例化的对象的功能的体现。
(二)类 . Class
(1)认识类
C语言的结构体中只能定义变量,不能定义函数。
Cpp中规定结构体内可以定义函数,并用 class 代替 struct 来定义一个结构体,作为一个类的定义。
class className
{// 类体:由成员函数和成员变量组成};
// 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
(2)类的两种定义方式
类的成员函数两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加 “类名::”(一般情况下,更期望采用第二种方式)
类的成员变量的定义方式:
1.为了区分一个类的成员变量和成员函数的形参,通常将成员变量前或者后加一个“_”;
class Date
{
public:void Init(int year){
//区分一个类的成员变量和成员函数的形参,通常将成员变量前或者后加一个“_”_year = year;}
private:int _year;
};
(3)类的访问限定符
public,private,protected。
C++实现封装的方式:用类将对象的属性(通过成员变量体现)与方法(通过成员函数体现)结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
1. public修饰的成员(成员函数或者成员变量)在类外可以直接被访问;
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的);
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;
4. 如果后面没有访问限定符,作用域就到 } 即类结束;
5. class的默认访问权限为private,struct为public(因为struct要兼容C);
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
(4)类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。(类似于在另一个文件中定义类的成员时)在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
class Person
{
public:void Print_person_info();
private:char name[50];char address[50];char gender[10];int age;char tel[15];
};//(类似于在另一个文件中定义类的成员时)
//在类体外定义成员时,需要使用 ::作用域操作符指明成员属于哪个类域。
void Person::Print_person_info()
{//..
}
(5)类的实例化
用类创建对象的过程称为类的实例化。
类本质上也是一种数据类型,(如int,float,double等)只不过类是一种比较复杂的数据类型,它包含多种可自助实现的功能(类的成员函数)。
既然类是和(如int,float,double等)相似的,那么也就意味着类本身是不占用内存空间的,而通过类实例化出来的对象是占用内存空间的。
但是一个类既包含了成员变量也包含了成员函数,那么占用的内存空间一定不小。如果我们实例化许多个对象,每个对象都会重复保存一份成员函数,不就造成了内存浪费吗?
i,如何计算类对象的大小
#include<iostream>
using namespace std;class A1 {
public:void f1(){}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中什么都没有---空类
class A3
{};int main()
{cout<<sizeof(A1)<<" "<<sizeof(A2)<<" "<<sizeof(A3);return 0;
}
结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
完~
未经作者同意禁止转载