C++一一类与对象

发布于:2024-05-20 ⋅ 阅读:(144) ⋅ 点赞:(0)

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

前言

一.类的引入

二.类的定义

三.类的访问限定符

四.类的实例化

五.计算类对象的大小


 

8fb442646f144d8daecdd2b61ec78ecd.png前言

本文讲的是c++中的类与对象,不同于c语言的结构体,类与对象会在我们后面的学习中更高频地出现。

一.类的引入

在C语言中结构体只能定义变量。

#include <iostream>
using namespace std;

struct stack
{
	int* a;
	int top;
	int capacity;
};

void stackinit(struct stack* ps);

而在C++中结构体不仅能定义变量还能定义函数

#include <iostream>
using namespace std;

struct stack
{
	int* a;
	int top;
	int capacity;

	void Init(struct stack* ps)
	{
		int top = 0;
		///
	}
};

而且函数命名也不会像C语言那样严格,毕竟不是全局变量。在C++中每一个结构体都属于独立的一个域,所以在里面命名函数时不用担心与其他域的函数重名,二者不会构成重载函数。

二.类的定义

在C++中更喜欢用class去代替struct,其实二者并无太大差别。

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

类的两种定义方式:

  • 声明和定义都放在类中
class A
{
	void fun()
	{
		cout << a << b << endl;
	}
	int a;
	int b;
};

这种方式会让编译器默认里面的函数是内联函数。

  • 类声明放在.h文件,成员函数定义放在.cpp文件,注意:成员函数前需要加类名::
//A.h
class A
{
	void fun();
	int a;
	int b;
};

//A.cpp

void A::fun()
{
	cout << a << b << endl;
}

归根结底就是我们要在struct的基础上熟悉里面可以直接加入函数即可。

这二种方法前者适合短小函数定义或进行小测试,后者更常用于函数定义不短,工作时更规范一些。

成员变量命名规则建议:

class A
{
	void fun(int year, int month, int day)
	{
		year = year;
		month = month;
		day = day;
		cout << year << month << day << endl;
	}
	int year;
	int month;
	int day;
};

当遇到成员变量与函数形参命名相同时,我们还能否分清二者区别?

一般情况下在函数内部会采用局部优先原则,那么红色的year就变成形参了,这样不就混乱了嘛~

所以为了能很好区分二者,提高代码可读性。我们一般会对类所在的成员变量添加独特的标识。

class A
{
	void fun(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
		cout << year << month << day << endl;
	}
	int _year;
	int _month;
	int _day;
};

三.类的访问限定符

类有三种访问限定符

  • public——公有
  • protected——保护
  • private——私有

访问限定符说明

顾名思义,由public修饰的区域类内部可以访问,外部也可以访问。

protectedprivate现阶段来说二者功能差不多所修饰的区域中外部无法访问,只能在内部访问。

而如果没有特地标明它们,在class中里面默认都为private,在struct中里面默认都为public。

class A
{
public:
	void fun(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
		cout << year << month << day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	A a;
	a.fun(1,2,3);
	return 0;
}

四.类的实例化

变量的声明与定义的区别就在于看它有无开空间,其实本质就是有无实例化。

class A
{
public:
	void fun();

private:
	int _year;
	int _month;
	int _day;
};

那么在A类中定义的成员变量是声明还是定义呢?——是声明,并没有开空间。

这也解释了为何为何不能直接在类里对成员变量赋值,例如:A:: _year = 1,因为赋值前提是要实例化,没有空间是没办法赋值的。

class A
{
public:
	int _year;
	int _month;
	int _day;
	void fun()
	{
		cout << _year << endl;
	}
};

int main()
{
	A a;
	A b;
	a._year = 1;
	b._year = 2;
	a.fun();//1
	b.fun();//2
	return 0;
}

总的来说,就像是一张设计图(抽象化的概念),而对象就是靠设计图才设计出来的房子(真正有空间的实体)。一张设计图可以设计出多种类似的房子,所以类与对象是一对多的关系。而其中的赋值可以理解为对房子内部进行装饰,每座房子的装饰风格都可以有所不同。

五.计算类对象的大小

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?

class A
{
public:
	void fun()
	{

	}
private:
	int _year;
};

int main()
{
	printf("%d", sizeof(A));//4
}

当类中既有成员变量也有成员函数时,类的大小似乎只包含了成员变量。我们再进一步验证~

class A
{
public:
	void fun()
	{

	}
};

int main()
{
	printf("%d", sizeof(A));//1
}

仅有成员函数时,结果变为1.

class A
{

};

int main()
{
	printf("%d", sizeof(A));//1
}

当什么都没有时,结果反而是1.这里的1只不过是用来表示空类的一种手段,表示就算没有成员变量,但作为空类也至少存在过~

最后我们得出结论,成员变量是存储在对象里面的,而成员函数则不然。其实这也很好理解,成员变量就是房子(对象)里的物品,而这些都是独立私有的。但成员函数就相当于是篮球场,它并不是通过房子(对象)而生成的,它是公有的不同对象都可以进行使用。因此成员函数并不存储在对象中。


网站公告

今日签到

点亮在社区的每一天
去签到