类和对象(上)


一、面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

举个例子,现在我们需要买一斤卷心菜。 面向过程就是我怎么样去买菜:走出家门,飞到菜市场,挑选卷心菜,给钱,飞回家。 面向对象就是我作为一个对象,我负责前往菜市场、挑选合适的菜,卷心菜作为一个对象,负责处于菜市场的位置,被挑,通过我和卷心菜的交互完成买菜。

二、类的引入

C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

struct Student
{
	void SetStudentInfo(const char* name, const char* gender, int age)
	{
		strcpy(_name, name);
		strcpy(_gender, gender);
		_age = age;
}
	void PrintStudentInfo()
	{
		cout<<_name<<" "<<_gender<<" "<<_age<<endl;
	}
	char _name[20];
	char _gender[3];
	int _age;
};

//上面结构体的定义,在C++中更喜欢用class来代替

int main()
{
	Student s;
	s.SetStudentInfo("Peter", "男", 18);
	return 0;
}

三、类的定义

class className
{
// 类体:由成员函数和成员变量组成
};

class为定义类的关键字,classname为类名。
{ }中为类的主体,类中的元素称为类的成员:
类中的数据称为类的属性或者成员变量;
类中的函数称为类的方法或者成员函数。
类的两种定义方式:
1.定义时成员函数声明和定义都放在类中。
2.定义时成员函数声明和定义分离,声明放在.h文件中,定义放在.cpp文件中。

四、类的访问限定符及封装

1.访问限定符:

public:公有
private:私有
protected:保护
在类的某个区域加上访问限定符,可以限制对该区域的访问。
比方说,
在这里插入图片描述
上图是一个类,
红色部分是私有的,类外部分是没有权限访问红色的。
蓝色部分是共有的,任何人想用就用。
白色部分是受保护的,类外部分也是没有权限访问的。
橙色部分没有进行说明,如果是用class定义的类,默认为私有

2.封装

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
当自身的逻辑发生变化时,不会破坏使用方的逻辑,或是强制使用方修改自身的逻辑,而是只需要修改自身的代码就可以了。

五、类的作用域

class Person
{
	public:
	void PrintPersonInfo();
	private:
	char _name[20];
	char _gender[3];
	int _age;
};

	void PrintPersonInfo()
{
	cout<<_name<<" "_gender<<" "<<_age<<endl;
}

上述代码的两个PrintPersonInfo是同一个函数吗?
还真不是。
在类外定义类的成员,需要再成员前声明其属于的类。
比方说上文的PrintPersonInfo应该加上 “类名::”
在这里插入图片描述

六、类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  2. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

七、类的对象大小的计算

空类占用一个字节,结构体内存对齐

八、类成员函数的this指针

非静态成员函数实际上的形参个数比程序员写的多一个。多出来的参数就是所谓的“this指针”。这个“this指针”指向了成员函数作用的对象,在成员函数执行的过程中,正是通过“Ihis指针”才能找到对象所在的地址,因而也就能找到对象的所有非静态成员变量的地址。
在这里插入图片描述

// 1.下面程序能编译通过吗?
// 2.下面程序会崩溃吗?在哪里崩溃
class A
{
	public:
	void PrintA()
	{
	cout<<_a<<endl;
	}
	void Show()
	{
		cout<<"Show()"<<endl;
	}
	private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->PrintA();
	p->Show();
}

程序会正常运行,因为传空指针没有问题,解引用空指针才有问题。


总结

以上就是今天的内容辣。
在这里插入图片描述

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二球悬铃木丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值