文章目录
一、类的定义
1、类的定义格式
- calss是定义类的关键词,用法更C语言中的结构体struct关键词用法一样,区别是类可以在里面创建函数,当然在C++中也是兼容结构体的,同样也对结构体进行升级也可以包含函数了。
- 在类里面的函数默认是被内联函数inline修饰的。
- C++中的类和结构体的用法相同,区别在于默认的限制访问。
- 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。
- 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例。
#include <iostream>
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:修饰的成员在类外可以直接访问。
- private和protected:修饰的成员不能直接被访问。
- class定义的成员没有被限定符修饰的默认为private,而struct默认为**public。
3、类域
- 类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作⽤域操作符指明成员属于哪个类域。
- 类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
#include <iostream>
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 <iostream>
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地址]。
- 计算大小跟结构体的内存对齐一样,用空间换时间。
内存对齐规则
- 第⼀个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
- 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。
- VS中默认的对⻬数为8
- 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。
#include <iostream>
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指针
标签:定义,对象,成员,类域,C++,int,Init,Stack From: https://blog.csdn.net/2401_83305953/article/details/140965661
- this指针是编译器隐形加入的指针变量,用来确定所访问的类,防止混乱,因为类可以创建多个对象,每个对象都有自己的成员,存储信息不同,在调用成员函数时又会调用同一个地方的函数,就会隐形加入一个确定自己对象的this指针