C++入门——类和对象(上)
一、类的定义
1.1 类定义的格式
- class为定义类的关键字,Stack为类的名字,{}中为类的主体 ,类体中的内容为类的成员: 类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。
- 为了区分成员变量,一般会习惯上成员变量会加上一个特殊标识,如前或后加一个-- (具体 看公司和个人习惯)
- c++中struct也可以定义类,c++中兼容c语言的用法并升级(struct中可以定义函数)
- 定义在类里面的成员函数默认是inline。
1.2 访问限定符
(1)类型
(2)具体分析
- c++一种实现封装的方法,用类将对象的属性与方法结合在一块,让对象更加完善,通过访 问权限选择性将其接口提供给外部的用户使用。
例如:传统c语言实现(成员变量和成员函数是分开的)
c++实现(成员函数和成员变量是在一起的)
- public修饰的成员在类外可以直接被访问(希望给他人使用的设置为public,一般成员函数设置为);protected和private修饰的成员在类外不能直接被访问(具体两者的区别会在继承中体现,一般成员变量会被设置为protected和private)
- 访问权限作用域从该访问限定符出现的位置到下一个访问限定符的位置,如果没有就到}为止。
- class 定义成员没有被访问限定符修饰的默认为private,struct默认为public.
1.3 类域
- 类定义了一个新的作用域,类的所有的成员都在类的作用域中,在类体外使用时需要使用(声明和定义分离时)::来指明成员属于哪个类域。
- 类域影响的是编译的查找规则,如下面一段程序中的Init如果不指定类域Stack,那么编译器会把就会把Init当成全局函数,那么编译时找不到成员的出处就会报错。指定类域Stack就是标明Init是成员函数,如果当前域找不到变量的出处,就会去类域中寻找。
#include <iostream>
using namespace std;
class Stack
{
public:
void Init(int n = 4);//缺省函数只能在声明中使用
private:
int* array;
int capacity;
int top;
};
void Stack::Init(int n)
{
array = (int*)malloc(sizeof(int) * n);
if (array == nullptr)
{
perror("malloc错误");
return;
}
capacity = n;
top = 0;
}
int main()
{
Stack st;
st.Init();
return 0;
}
二、实例化
2.1 实例化的定义
- 用类在物理内存中创建对象的过程就是实例化对象。
- 类就是对象的一个模板,限定了类的成员变量有什么,注意的是这里的成员变量没有分配空间。就像建筑工地的图纸一样,且一个类可以实例化多个对象,对象是占据空间的且存储成员变量。
2.2对象的大小
- 对象中只储存成员对象,不储存成员函数(因为函数在编译的过程中是一段指令,被存储在代码段,对象如果要储存只能存储地址,但是每一个对象它的成员对象会储存不同的数据,但是成员函数是一样的,如果对象储存它会造成重复储存,其实编译器在编译链接时,就要找函数的地址,不在运行中找,所以不需要存储地址)。
- 以上述我们计算对象大小只需要计算成员对象,计算方法遵循内存对齐规则:
第一个成员要对齐与类偏移量为0的地址。
其他成员变量要对齐到对齐数的整数倍(对齐数=编译器默认对齐数和成员大小的最小值,vs 上的默认对齐数为8)。
总大小为最大对齐数(成员变量最大对齐数和默认对齐数的最小者)的整数倍
如果嵌套了类,嵌套的类对齐到自己的最大对齐数的整数倍,类的整体大小就是所有最大对 齐数(含嵌套类的对齐数)的整数倍。
如果类中没有成员对象,那么它的大小是一(仅仅是用来占位,不存储任何东西),
例:
三、this指针
- 为了区分调用的成员函数是哪一个对象中的,在编译器编译后,类的成员函数默认都会在形参的位置增加一个指明哪一个对象的指针(隐藏的),叫做this指针。
- 类的成员函数中访问成员变量,本质都是通过this指针访问的。
- c++规定不能在实参和形参的位置显示的写this指针,但是可以在函数体内显示使用this指针
原文地址:https://blog.csdn.net/shsbyshdbdhjsk/article/details/145248158
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!