C++类和对象的初步介绍

目录

简单说过程和对象

类的初步认识

 访问限定符

类的实例化

this指针介绍

总结


简单说过程和对象

  在我们学习C语言的过程中,我们知道C语言关注的是过程,逐步的解决问题,就像我们解数学题,你给先求出什么,再求出什么,一步一步的解,才能得到最后的答案。可见面向过程关注的是怎么一步一步实现解题过程; 而对于C++来说,它关注的是对象,我们下过五子棋,对于五子棋来说它的对象可以分为三个:①黑白双方都是一样的行为。②棋盘系统,每走一步,都需将其落子画出来。③规则系统,负责判断输赢。其中①用来接收对象的输入,并告知②,②来完成期盼布局并显示后告知③, ③来判断输赢。可见面向过程更多的是以功能来划分一个问题。

类的初步认识

  struct是我们C语言中用来定义结构体类型的,它的成员是变量,可以是不同类型的变量,而在C++刚开始时struct可以用来做类,类中可以包含成员变量,也可包含成员方法(成员函数),定义结构如下(对于下述结构体定义的方式,在C++中更喜欢用 class 来代替):

typedef int STDataType;
struct Stack
{
    //成员函数
	void Init(int capacity)
	{
		//......
	}

	void Push(STDataType* data)
	{
		//......
	}

    //成员变量
	STDataType* data;
	int capacity;
	int size;
};

  将struct用class来替代

typedef int STDataType;
class Stack
{
	void Init(int capacity)
	{
		//......
	}

	void Push(STDataType* data)
	{
		//......
	}


	STDataType* data;
	int capacity;
	int size;
};

 其中我们的 class为定义类的关键字,Stack为类的名字,大括号( {} ) 里面的是我们的类的主体,并且大括号内的是类的作用域,其中类的成员包含成员变量成员函数或者叫做类的方法。类的所有成员都在类域中,在类体外中定义成员时需要使用 :: 并指明是哪个类。

补充:成员函数的声明尽量放在 .h 文件中,定义放在 .cpp 中,在使用成员函数时,需要加上 (类名+::) 

声明和定义分离的作用:可读性、安全性

//使用时如下:
void Stack::Push(int x)
{

}

 访问限定符

  C++中有三个访问限定符,其中第一个:public; 第二个: private; 第三个: protectedpublic是类中认为是共有的,意思是类中的成员可以直接访问,一般情况public下的是成员函数,而private和protected都是私有的,它们修饰的成员在类中不能直接访问。每个访问限定符修饰的成员的范围是下一个访问限定符或者遇到 }。

typedef int STDataType;
struct Stack
{
public:
	void Init(int capacity)
	{
		//......
	}

	void Push(STDataType data)
	{
		//......
	}

//public已经遇到了private,因此public修饰的范围只到这里
//而private修饰的范围是到 }。
private:
	STDataType* data;
	int capacity;
	int size;
};

 补充:

为什么类域中的变量不可以直接用访问限定符访问,而命名空间可以?

  类域中的变量是描述出来的,并没有真正的实体,除非创建了对象,才有真正属于自己的空间,它相当于是一个声明。

  namespace中的变量是已经定义了的,并且是有自己的空间,namespace相当于是一个围墙,将定义的变量围了起来。

namespac介绍:C++ namespace介绍_三分芝士的博客-CSDN博客

类的实例化

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

      类中定义的成员,是我们对一个对象的描述,我们需要一个对象具有哪些功能,就给其类中定义这些功能。对象在创建时就有了自己的空间。

int main()
{
    //我们用类的类型创建了一个st1对象
    //创建完成后就有了自己的空间
	Stack st1;

    //使用时,用 . 进行访问共有的部分
    st1.Init(3);
	return 0;
}

类有了自己的空间,那么该如何计算类的大小?

  其实类在设计时有三种存储方式

第一种就是直接将成员函数和成员变量存储在对象中

第二种就是将所有的成员函数放在同一个空间,然后将此空间的地址和成员变量放在对象中

第三种就是将成员函数放在单独一个静态区,只将成员变量放在对象中

  这三种方案,我们知道我们创建的每个对象的成员函数都是相同的,只是成员变量的值有所不同,那么第一种存储方式就太浪费空间,而第二种虽然只存了个指针,但是由于函数相同,成员函数不如放在一个公共区域,让编译器自己去寻找,所以存储方式第三种就更为合适,只剩下成员变量时,内存大小是跟结构体是类似的。计算规则在这篇博客中。

自定义类型:结构体,枚举,联合_三分芝士的博客-CSDN博客  

补充:

  如果类中无数据,无函数或者只有函数,此时这个类的大小为1。

原因:

  因为在创建对象时,如果此时对象占用的大小如果为0,就不能表示一个对象,为1表示这个对象存在,占一个地址来标记它存在,表示它们占位。

this指针介绍

   this指针是我们类中成员函数隐藏的一个指针参数,该指针默认指向当前对象,在函数体中所有成员变量的操作,都是通过指针去访问,用户不需要来传递,编译器自动完成。

如何理解上面这句话?

  就是说在我们创建对象时,调用函数,此时默认会传这个对象的地址传给this指针,编译器自动生成这个指针,这个指针不可改变,类型前默认const修饰,并且只能在成员函数内部使用,它的本质就是成员函数的形参。 既然是形参,this指针就存在栈帧中。

补充:

类域中的成员函数为什么不能直接用类名+限定符去访问?

  类域中的函数含有隐藏指针this的,在没有创建对象时,就不能传有效的地址,this指针就无法接收

总结

  类是一个声明,它描述了对象的一些功能,在没有真正创建一个对象时,它是不占内存空间,也不能直接用限定符去访问。在设计类时一般数据设为私有,方法设为共有。一般内中的成员函数的声明和定义是分离的,这样可读性会大大提高。在计算类的大小时,按照结构体的内存对齐方式来计算。C++的三大特性是封装、继承、多态,并不是说这三个就是其全部的特性,只是这三个特性是最明显的,用的最多的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值