C++类和对象

文章目录

    • 一、类的定义
        • 1、类的定义格式
        • 2、访问限定符
        • 3、类域
    • 二、实例化
        • 1、实例化概念
        • 2、对象的大小
    • 三、this指针

一、类的定义

1、类的定义格式
  • calss是定义类的关键词,用法更C语言中的结构体struct关键词用法一样,区别是类可以在里面创建函数,当然在C++中也是兼容结构体的,同样也对结构体进行升级也可以包含函数了。
  • 在类里面的函数默认是被内联函数inline修饰的。
  • C++中的类和结构体的用法相同,区别在于默认的限制访问。
  • 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。
  • 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例。

#include 
using namespace std;

class Stack
{
public:

	void Init(int n = 4)
	{
		arr = (int*)malloc(sizeof(int) * n);
		capacity = n;
		top = 0;
	}
private:
	int* arr;
	int capacity;
	int top;
};

int main()
{
	Stack s;
	s.Init();
	return 0;
}
2、访问限定符
  • C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。
  • public:修饰的成员在类外可以直接访问。
  • privateprotected:修饰的成员不能直接被访问。
  • class定义的成员没有被限定符修饰的默认为private,而struct默认为**public。
3、类域
  • 类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作⽤域操作符指明成员属于哪个类域。
  • 类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
#include 
using namespace std;

class Stack
{
public:
	void Init(int n = 4);
private:
	int* arr;
	int capacity;
	int top;
};

//当声明和定义分离时需要指定类域
void Stack::Init(int n)//缺省参数在申明时添加定义不用添加
{
	arr = (int*)malloc(sizeof(int) * n);
	capacity = n;
	top = 0;

}

int main()
{
	Stack s;
	s.Init();
	return 0;
}

二、实例化

1、实例化概念
  • ⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。
  • 类是对象进⾏⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。
  • ⼀个类可以实例化出多个对象,实例化出的对象 占⽤实际的物理空间,存储类成员变量。
#include 
using namespace std;

class Stack
{
public:
	void Init(int n = 4);
private:
	int* arr;
	int capacity;
	int top;
};

//当声明和定义分离时需要指定类域
void Stack::Init(int n)//缺省参数在申明时添加定义不用添加
{
	arr = (int*)malloc(sizeof(int) * n);
	capacity = n;
	top = 0;

}

int main()
{
	//实例化
	Stack s1;
	Stack s2;
	return 0;
2、对象的大小
  • 对象的大小是由类中包含的成员决定,而占用大小跟变量成员有关,函数成员是一个函数指针,一个地址,在编译时把保存地址,调用函数时是直接在汇编指令里[call地址]。
  • 计算大小跟结构体的内存对齐一样,用空间换时间。

C++类和对象_第1张图片
内存对齐规则

  • 第⼀个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
  • 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
  • VS中默认的对⻬数为8
  • 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
#include 
using namespace std;

class ut
{
public:
	double d;
	char e[5];
};

class st
{
public:
	int a;
	ut b;

};

int main()
{

	cout << sizeof(st) << endl;
	return 0;
}

三、this指针

  • this指针是编译器隐形加入的指针变量,用来确定所访问的类,防止混乱,因为类可以创建多个对象,每个对象都有自己的成员,存储信息不同,在调用成员函数时又会调用同一个地方的函数,就会隐形加入一个确定自己对象的this指针

C++类和对象_第2张图片

你可能感兴趣的:(c++,c++)