当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:类和对象(一)

    Scissors_初夏的博客:初夏小谈:类和对象(一)

    作者:[db:作者] 时间:2021-08-28 16:11

    类?什么是类?

    ? ? ? ?在了解什么是类之前,先来了解一下C语言struct,C语言由于它是面向过程的,它更多的关注求解一个问题的过程,即步骤。在C语言的struct结构体中是不能定义函数的,它只能定义变量。而在C++中,它是基于面向对象的。它关注更多的是对象。它在处理一个问题时,是把一个问题拆分成几个对象来做。而不像C语言那样,一步下来该做哪一步地执行。

    一、类的概念:

    所以在C++中把处理问题的步骤进行包装就形成了类。这个类可以处理特定的问题,而不用去关注它是怎么一步步处理的。在C++中类用class来标识,struct也可以。类中不仅可以定义变量,还可以定义函数。例如:

    struct student
    {
    	void SetStudentInfo(const char* name, const char* gender, int age)
    	{
    		strcpy(_name, name);
    		strcpy(_gender, gender);
    		_age = age;
    	}
    
    	void PrintStu()
    	{
    		cout << _name << " " << _gender << " " << _age << endl;
    	}
    	//成员变量
    	char _name[20];
    	char _gender[10];
    	int  _age;
    };

    struct就是定义类的关键字,后面紧跟着就是类名student,大括号中就是类的主体。在这个类中定义了两个成员函数和三个成员变量。

    ? ? ? ? 注意:①:在类定义完后要加;

    二、类的定义:

    ? ? ? ①:类第一种定义方式就是上面的例子那种,将成员函数的声明和定义全部放在类中

    ? ? ? ②:就是将类中成员函数的定义和声明分开。

    ? ? ? 二者的中像第一种方式,如果把函数声明和定义全部放到类中,编译器有可能会把它当做内联函数来处理。

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

    ? ?一、访问限定符

    ? ? ? 1.访问限定符:顾名思义就是该成员变量或成员方法能不能被访问,在C++中给出:

    ? ? ? ? ? ? ①:允许访问符:public

    ? ? ? ? ? ? ②:无法访问:private、protected

    ? ? ? 2.为什么要加访问限定符?

    ? ? ? ? ? ? 在C++中,用类来进行对成员函数和成员变量进行封装,而它就像人一样也有一些不想被人访问的东西,所以就用访问限定符来修饰。只提供一些可以被访问的接口来给外部使用。

    ? ? ? 3.对访问限定符做一下说明:

    ? ? ? ? ? ? ①:public修饰的成员函数和成员变量都可以在外面被使用。

    ? ? ? ? ? ? ②:被private和protected修饰的成员是私有的。在外面不可以被访问。

    ? ? ? ? ? ??③:访问限定符所管辖的范围就是从它开始自上而下直到遇到其它的访问限定符结束

    ? ? ? ? ? ? ④:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。

    ? ? ? 4.class和struct的区别?

    ? ? ? ? ? ? 在C++中也可以用struct来定义类,是因为C++要兼容C,在C++中也可以用struct来定义结构体。在定义类时不同的是:struct定义的类,默认访问权限是共有的,而class定义的类则是默认私有的。

    ? ?二、封装

    ? ? ? 1.什么是封装?

    ? ? ? ? ? ? ?封装就是把数据和操作数据的方法进行包装,隐藏其实现的细节,只向外提供相应的接口来和对象进行交互。

    封装的本质是一种管理。

    四、类的作用域

    ? ? ? 1.类定义了一个新作用域,类中成员作用域都在类中,想要在类外定义成员,那就需要::作用域来说明在哪个类中。

    ? ? ? 2.成员变量在类中具有全局属性

    五、类的实例化

    ? ? ? ?1.定义一个类之后,就有了这种类类型,此时它不是一个不是一个实体,而是一个模型。编译器并没有为它分配实际的内存空间。此时就好比int,char一样

    ? ? ? ?2.用类类型定义出来的变量就是类的实例化,它被称为对象(其实也就是变量)。

    ? ? ? ?3.类和用类类型定义出来的对象的关系就好比,建造房子的图纸和大楼的关系。

    六、类大小的计算

    ? ? ? ?1.一个类的大小,就是其成员变量所占的内存空间的大小,要考虑内存对齐。成员函数放在公共的代码段。

    ? ? ? ?2.结构体内存对齐规则:

    ? ? ? ? ? ? ? ? ? ①:第一个成员在结构体偏移量在0的地址处。

    ? ? ? ? ? ? ? ? ? ②:其它成员对齐到默认对齐数的整数倍的地址处。(VS默认对齐数为8,gcc默认对齐数为4)

    ? ? ? ? ? ? ? ? ? ③:结构体的总体大小对齐到成员最大对齐数和默认对齐数取小的整数倍。

    ? ? ? ? ? ? ? ? ? ④:如果有嵌套结构体,嵌套的结构体先对齐到内部最大的对齐数,之后再对齐到最大的对齐数的整数倍。

    七、this指针

    ? ? ? ?1.this指针是什么?

    ? ? ? ? 由于C++将将成员函数和成员变量进行封装定义在类中。当创建多个对象,为其对象进行处理时。会调相应函数但是,当进入函数内部时,如何区分现在处理的是哪个对象呢?,this指针就是指向当前对象,只是这是由编译器自动赋予参数。对用户是透明的。

    ? ? ? ?2.那么编译器是识别类分为三步?

    ? ? ? ? ? ? ? ?①:识别类名

    ? ? ? ? ? ? ? ?②:识别类中成员变量

    ? ? ? ? ? ? ? ?③:识别类中的成员函数&并且对类中的成员函数进行修改

    ? ? ? ?3.this指针的特性:

    ? ? ? ? ? ? ? ?①:this指针的类型:类类型* const

    ? ? ? ? ? ? ? ?②:只能在成员函数内部使用

    ? ? ? ? ? ? ? ?③:但进行调用函数时会将对象的地址进行传参,this指针存的就是对象的地址。

    ? ? ? ? ? ? ? ?④:this是成员函数所传的第一个指针,一般通过ecx寄存器来传递。它是通过_thiscall约定,

    不定参数是通过参数压栈(_cdecl约定)??void TestFunc(...) {}

    ? ? ? ?4.this既然是const类型不可在函数里面改,那么它一定不可以空吗?

    ? ? ? ? ? ? ? 答案是否定的。代码如下:

    class Student
    {
    public:
    	void SetStudentInfo( const char* name, const char* gender, int age)
    	{
    		strcpy(_name, name);
    		strcpy(_gender, gender);
    		_age = age;
    	}
    
    	void PrintStudentInfo()
    	{
    		cout << this << endl;
    		cout << _name << " " << _gender << " " << _age << endl;
    	}
    
    	//不定参数是通过参数压栈(_cdecl约定)
    	void TestFunc(...)
    	{}
    
    private:
    	char _name[20];
    	char _gender[20];
    	int _age;
    };
    
    int main()
    {
    	Student s;
    	s.SetStudentInfo("Tom", "男", 18);
    	cout << &s << endl;
    	s.PrintStudentInfo();
    
    	//不定参数压栈时通过eax寄存器来传递
    	Student s1;
    	s1.TestFunc(66);
    
    	//this可以为空吗?
    	Student s2;
    	s2.SetStudentInfo("Tom2", "男", 22);
    	Student* ps = &s2;
    	ps->PrintStudentInfo();
    	ps = nullptr;
    	//指针虽然为空,但是它是一个对象,就会把指针里面内容(虽然为空)传进去
    	ps->PrintStudentInfo();
    
    	system("pause");
    	return 0;
    }

    ? ? ? ? ? 5.既然在此引用和指针都能起到相同的作用,而且引用更安全,方便,为什么不用引用吗?

    ? ? ? 因为类比引用出现的早,引用在C++1.0才出现的。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?珍&源码

    cs