目录
2、三个访问限定符:private protected public
1、类的声明和定义
类的声明和定义分离时需要注意,在.h中声明,在.cpp文件中定义需要在成员函数前加上 类名::,这是因为在编译器进行编译的时候,遇到在.cpp文件中的函数,如果没有加上类名::会找不到,就会报错。而且,碰到如下情况时,函数的定义中不能使用类中定义的成员变量。
这时候需要在.cpp文件中的函数名前加上A::
注:如果声明和定义不分离,在.h中直接定义,系统可能会将其看成内联函数。不分离的坏处在于,在.h文件中包含定义,而.cpp文件在包含头文件时是直接将头文件的内容复制过来,这样多个.cpp文件包含同一个头文件时就可能导致重复定义,会报错。
2、三个访问限定符:private protected public
学到目前认为private和protected暂无差异,都是私有的,而public是公有的。私有表示在类中定义的变量、函数等只能在该类的作用域里使用(注意,类的声明和定义分离只是在不同的文件中,还是同一个作用域);公有表示出了这个类的作用域,外界依然可以使用。(具体的使用方式,最简单的便是实例化一个对象,通过 对象.函数名()调用)
下面是一些默认规则:
①访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。,如果后面没有访问限定符了,就到类的结束为止。
②struct中默认是public限定符,class中默认是private限定符,这是因为struct需要去兼容C语言。
③访问限定符只在编译时起作用,编译完了后不同的限定符都没有区别了。
3、类对象的大小
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
这里回顾一下内存对齐的方式以及内存对齐的意义:
方式:
①第一个成员在与结构体偏移量为0的地址处。
②其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数=min{编译器默认对齐数,该成员大小} (VS中默认的对齐数为8)
③结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍
④如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
意义:
内存对齐的目的是为了优化内存访问速度和效率。它要求数据在内存中的存储地址必须是数据类型大小的整数倍,以便于处理器能够高效地访问数据。
注:让结构体按照指定的对齐参数进行对齐,利用关键字#pragma pack(n),n是指定的对齐数,且该语句不加分号。
4、this指针
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针有以下几大特性:
①this指针的类型:类类型* const,this指针不可被赋值
②只能在“成员函数”的内部使用
③this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
this形参。所以对象中不存储this指针。
④this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递