C++——类与对象(一)

发布于:2024-04-19 ⋅ 阅读:(25) ⋅ 点赞:(0)


要了解类和对象,需要先了解下面向对象编程和面向过程编程。

面向过程编程是指一件事是分为若干具有先后顺序的步骤来完成的,比如炒一盘菜,需要先买菜,然后择菜和洗菜,接着切菜和炒菜。是分为一个个步骤完成的。C语言就是面向过程的,主要关注的是过程。

而C++是基于面向对象的,面向对象是指一件事需要若干事物进行交互来完成,还是如上例,炒一道菜需要菜,调味品,锅等,并不关注炒菜的过程,关注的是需要哪些事物。C++就是基于面向对象的,由于C++兼容C语言,所以C++也支持面向过程。

1.类和对象

类是一种自定义类型,和C语言中的结构体一样,不同的是C语言的结构体内只能定义变量,而在C++中,类里面不仅可以定义变量,还可以定义函数。定义一个类,需要用到一个新的关键字class

定义方式如下

class 类名
{

};

对象是类实例化过程中产生的变量,在C++中,更习惯称变量对象。一个类可以创建多个对象。不同于于C语言创建结构体变量的是,创建类对象时不需要再类型前加class

class A
{
 //...
};
int main()
{
    A a;
    return 0;
}

只需要再变量名前加类名即可。不需要加class。

在类里面定义的变量叫成员变量或类的属性,定义的函数叫成员函数或类的方法
如下A类

class A
{
public:
    //成员函数
	void print()
	{
		cout << x << f << d << endl;
	}
private:
    //成员变量
	int x;
	float f;
	double d;

};

成员变量可以是内置数据类型,也可以是自定义数据类型。

当类内函数的声明和定义分离时,在定义文件内需要加域作用限定符
如下图person类
在这里插入图片描述

可以看到这个Init函数写的很抽象,weight=weight?哪个是成员,哪个是形参啊,严重可能会出现错误。因此,建议成员变量名前或后加一个_用以区分。
修改后如下

void Init(int weight, int age, int height)
{
_weight = weight;
_age = age;
_height = height;
}

左边是成员,右边是形参,一下子就区分开来了。

在类定义内,出现了两个新的面孔,分别是publicprivate,紧接着就介绍访问限定符。

2.访问限定符

访问限定符有三个分别是public(共有),private(私有)和protected(保护)

public修饰的成员可以直接在类外进行访问。
private修饰的成员不能再类外进行访问。
访问限定符的作用域为该访问限定符出现下一个访问限定符出现为止,若没有下一个访问限定符,则到类域结束为止。
struct的访问限定符默认为public,因为要兼容C语言,class的访问限定符默认为private。

protected暂且不谈。

有了访问限定符,我们可以决定哪些成员可以被访问,哪些成员不可以被访问。

3.类的作用域和对象的实例化

类的定义会产生一个新的作用域,类的全部成员都在这个作用域内,当我们需要在类外面访问类内的成员时,需要指定访问的是哪个类域,也就是需要加域作用限定符。(::)

对象的实例化过程为:

类名 变量名
如person类对象的实例化为 person p1;

当对象实例化出来后,类的成员变量就被定义出来了,因为成员变量得到了内存的分配。
并且一个类可以实例化多个对象。

类也是一种自定义数据类型,那么它的大小是多少呢,首先,它需要遵循内存对齐。
在这里插入图片描述
可以看到,同样的成员,定义顺序不同,那么类的大小就不同。
class可以定义函数,那么它的大小会有所改变吗?
在这里插入图片描述
大小没有任何的改变。

事实上,每实例化一个对象,系统对给每一个对象的成员变量分配内存空间,不会给函数分配空间,当使用对象去调用函数时,所有对象都是去公共代码段去调用同一个函数。因此,一个类的大小,就是成员变量的大小,但是要遵循内存对齐。例外是只有成员函数的类和空类(什么都没有的类)。

这两种类的大小为1,目的是用来唯一标识这个类的对象。
验证如下图
在这里插入图片描述

4.this指针

前面说到,对象调用的都是同一个函数,那么是如何识别是不同的对象调用的。

每一个非静态成员函数都有一个隐藏的形参为this指针,当对象调用函数时会将对象的地址作为实参传递给this指针,不同对象的地址不同,所以可以区别是不同对象调用函数。

this指针的特性:
1.指针类型为 类类型* const,如person类的this指针类型为person* const,const修饰的是this,因此不能再函数内部对指针进行修改
2.this指针只能再成员函数内使用
3.this是成员函数的隐藏形参,不需要我们传递实参

void person::print()
{
	//两种写法作用相同
	cout << _weight <<" " << _age <<" " << _height << endl;
	cout << this->_weight <<" " << this->_age <<" " << this->_height << endl;
}

有了this指针就可以是分辨不同对象调用函数了。

类与对象(一)就介绍这些了。