其他分享
首页 > 其他分享> > 类和对象(一)——基本知识。为你打下坚实基础

类和对象(一)——基本知识。为你打下坚实基础

作者:互联网

目录

一.类的定义

二.类的访问限定符

三.类的作用域

四.类的实例化

五.类对象在内存中的存储

六.this指针


一.类的定义

        由于C++是面向对象的,并且具有三大特性,封装,多态和继承。类的引入更好的实现这三大特性。

class className{
	//类体,有成员函数与成员变量组成
};

class为定义类的关键字className类的名字(可有编写者任意取名),{}中类的主体,其中类的元素称为成员,主要有成员函数与成员变量组成。

成员函数是指在类中的函数,成员变量指在类中的数据。

二.类的访问限定符

类有三个访问限定符:

说明:

  1. public修饰的成员可以在类外直接访问
  2. protected和private修饰的成员在类外不能直接访问。
  3. 访问权限的作用域从该访问限定符出现位置开始知道下一个访问限定符出现为止。
  4. 当成员前面没有访问限定符修饰时,class的默认访问权限为private,struct默认访问权限为public(因为要兼容c)。

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。(就是,在编译时能检查出语法是否错误)。

PS:C++ 中,struct和class有什么区别:在c++中,struct可以当作结构体去使用,因为c++兼容c。另外在C++中struct还可以用来定义类,与class用法相同,区别是struct成员默认访问方式为public,class成员默认访问方式为private。

三.类的作用域

        类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员,需要::作用域解析符指明成员属于哪个类。

第一种:成员函数在类内定义

class Date{

public:
	void Print(){
		cout << _year << _month << _day << endl;
	}

    //成员变量的声明
	int _year;
	int _month;
	int _day;

};

 第二种:成员函数在类内声明,在类外定义时要声明属于哪个类。

class Date{

public:
	//成员函数的声明
	void Print();
	//成员变量的声明
	int _year;
	int _month;
	int _day;

};
//成员函数的定义,
//在函数名前加类名和域作用限定符::,告知这个函数属于哪个类
void Date::Print(){
	cout << _year << _month << _day << endl;
}

四.类的实例化

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

  1. 类的定义只是限定了一个类里有那些成员,并没有分配实际的内存空间来存储。
  2. 一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间。

五.类对象在内存中的存储

        通过上面代码,我们发现,类并不是简单的保存成员函数和成员变量,按照类型开辟空间大小来存储的。它是按照一定的规则存储的。

        结论:类只保存成员变量,成员函数保存在公共代码区,并且类在内存中存储也存在内存对齐,对齐规则与结构体一样。注意类的大小,编译器给了一个字节来标式这个类(不是为了存储数据,而是为了占位,表示变量的存在)。如图:

这就能解释为什么Preson类为什么占16字节了,

char name[5],对齐数为1,偏移量为0,占5字节。

int age 偏移量为5,对齐数为4,增加偏移量至8,一共占8+4=12字节

char sex 偏移量为12,对齐数为1,一共占13字节。

整体大小要是最大对齐数4的整数倍,整体大小增大到16。

六.this指针

首先我们来看一个代码:

#include<iostream>
#include<Windows.h>
#pragma warning(disable:4996)
using namespace std;

class Date{
public:
	void SetDate(int year,int month,int day){
		_year = year;
		_month = month;
		_day = day;
	}

	void Print(){
		cout << _year << _month << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};



int main(){
	Date d1;
	d1.SetDate(2021, 7, 9);
	d1.Print();
	Date d2;
	d2.SetDate(2020, 4, 5);
	d2.Print();

	system("pause");
	return 0;
}

输出:

         上述代码中定义了两个对象d1和d2,两对象都调用了类里的成员函数SetDate和Print,这里就有一个问题,两函数变量相同但是调用对象不同,那函数是如何区分对象d1和d2的呢?也就是当d1调用时,如何知道是要设置d1对象,而不是d2对象的呢?

        C++引入了this指针来解决这个问题。C++给每个非静态的成员函数增加了一个隐藏的指针参数。让该指针指向当前对象(调用该函数的对象)。在成员函数中所有成员变量的操作,都是通过该指针访问的。编译器自己完成。

所以上面代码可以写成:

 只是这个this指针被隐藏了,编译器帮你做了。

this指针的特性

  1. this指针的类型是:类类型 * const
  2. this指针只能在成员函数内部使用
  3. this指针本质是成员函数的形参,是对象调用成员函数时,将对象的地址作为实参传给this指针,对象中并不存在this指针,存在于成员函数中,后面会说,其实是存在于非静态成员函数中。
  4. this指针式成员函数的第一个隐含的参数(注意是第一个形参),不需要用户传递。
  5. this指针作为形参存在于栈中,在VS它存在于ecx寄存器里。

注意:是哪个对象调用成员函数,this指针就指向哪个对象。

标签:函数,成员,基本知识,打下,访问,坚实基础,限定符,class,指针
来源: https://blog.csdn.net/weixin_57023347/article/details/118581509