今天开始学八股,作为抽象派速记代言人,面对要死记硬背的东西,一定要让它变得有趣才是我能够记得下去的王道!
指针与引用的区别
先来看一下八股文的定义:
指针存放某个对象的地址,其本身就是变量(命了名的对象),本身就有地址,所以可以有指向指针的指针,可变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。
引⽤就是变量的别名,从一而终,不可变,必须初始化
不存在指向空值的引⽤,但是存在指向空值的指针
如果理解起来有点困难的话,可以这样去想,指针是一个粉丝,他喜欢一个idol,就算是他指向那个idol,但是粉丝自身也可以是一个idol,也可以被另一个人喜欢,所以可以有喜欢粉丝的粉丝。粉丝是可以变化的,粉丝喜欢的那个idol可能会塌房,粉丝可以脱粉,换idol追,这就是说明粉丝是可变的。
而引用相当于是替身,是idol的替身,要先有idol,才有替身,而替身永远都是idol的替身,哪怕他塌房了,替身也永远是他的替身。
不存在一个替身演员没有对应的idol,但是存在一个粉丝他谁都不追的情况。
这样理解起来是不是立马就顺畅起来了,代码八卦圈的小故事,就是指针与引用
定义和声明
指针是⼀个变量,其值是另⼀个变量的地址。声明指针时,使⽤ * 符号。(追星是这样的)
int x = 10;
int *ptr = &x;
引用是一个别名,它是在已存在的变量上创建的,在声明引用时,使用&符号(替身要跟着主演)
int y = 20;
int &ref = y;
使用和操作
指针:可以通过解引用操作符 * 来访问指针指向的变量的值,还可以通过地址运算符 & 获取变量的地址。(要看我偶像,追个星就看到了,要看他地址,得像狗崽队一样跟随才可以)
引用在声明时被初始化,并在整个生命周期中一直引用同一个变量,不需要任何解引用操作符,因为引用本身就是变量的别名(替身)
int value = *ptr; // 获取指针指向的值
int address = &x; // 获取变量 x 的地址
int newValue = ref; // 获取引用的值
空值和空引用
指针可以为空(nullptr)表示不指向任何有效的地址。
引用必须在声明时初始化,并且不能在后续改变引⽤的绑定对象。因此,没有空引用的概念
可变性
指针: 可以改变指针的指向,使其指向不同的内存地址。
引用: ⼀旦引用被初始化,它将⼀直引用同⼀个对象,不能改变绑定。
用途
指针: 通常用于动态内存分配、数组操作以及函数参数传递。
引⽤: 通常用于函数参数传递、操作符重载以及创建别名。
数据类型
整型 short int long 和 long long
C++ 整型数据长度标准
short 至少 16 位
int 至少与 short ⼀样⻓
long 至少 32 位,且至少与 int ⼀样⻓
long long 至少 64 位,且至少与 long ⼀样⻓
在使⽤8位字节的系统中,1 byte = 8 bit
很多系统都使用最小长度,short 为 16 位即 2 个字节,long 为 32 位即 4 个字节,long long 为 64 位即 8 个字节,int 的长度较为灵活,⼀般认为 int 的长度为 4 个字节,与 long 等长。
可以通过运算符 sizeof 判断数据类型的⻓度。例如:
cout << "int is " << sizeof (int) << " bytes. \n";
cout << "short is " << sizeof (short) << " bytes. \n";
头⽂件climits定义了符号常量:例如:INT_MAX 表示 int 的最⼤值,INT_MIN 表示 int 的最⼩值。
这种死记硬背的我也啥办法,只好死记硬背。
short : 16 bit 2 byte
int : 32 bit 4 byte
long:32 bit 4 byte
long long:63 bit 8 byte
无符号类型
即为不存储负数值的整型,可以增大变量能够存储的最大值,数据长度不变。
int 被设置为⾃然⻓度,即为计算机处理起来效率最⾼的⻓度,所以选择类型时⼀般选⽤ int 类型。
关键字
const 关键字
const的作用:被它修饰的值不能改变,是只读变量。必须在定义的时候就给它赋初值。
常量指针(底层const)
常量指针:是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值,常量指针强调的是指针对其所指对象的不可改变性。说人话就是指针是正常指针,指针指向的对象是常量。
特点:定义的时候 * 靠近变量名,因为是常量指针,所以定义的时候先定义常量再定义指针,比如先写int const或const int再写*
形式:
(1)const 数据类型 *指针变量 = 变量名
(2)数据类型 const *指针变量 = 变量名
int temp = 10;
const int* a = &temp;
int const *a = &temp;
// 更改:
*a = 9; // 错误:只读对象
temp = 9; // 正确
指针常量(顶层const)
指针常量是指定义了⼀个指针,这个指针的值只能在定义时初始化,其他地方不能改变。指针常量强调的是指针的不可改变性。人话就是指针是常量,永远指向一个地方无法改变。
特点:定义的时候 * 靠近变量类型。指针常量,先定义指针,再定义常量。
形式:
数据类型 * const 指针变量=变量名
int temp = 10;
int temp1 = 12;
int* const p = &temp;
// 更改:
p = &temp2; // 错误
*p = 9; // 正确
static关键字的作用
前面写太多了,有点慢,看看能不能提速一下,后面会更精简!但是质量依旧在线!
static的意思是静态的,静止的,主要用于控制变量和函数的生命周期,作用域以及访问权限
接下来的内容先一个一个看完,整体理解会更好!
静态变量
- 在函数内部使用static关键字修饰的变量称为静态变量。
- 静态变量在程序的整个生命周期内存在,不会因为离开作用域而被销毁(这个变量的时间静止了,所以无法销毁,时间宝石的力量)
- 静态变量默认初始化为零(对于基本数据类型)
void exampleFunction() {
static int count = 0; // 静态变量
count++;
cout << "Count: " << count << endl;
}
静态函数
- 在类内部使用static关键字修饰的函数时静态函数。
- 静态函数属于类而不是类的实例,可以通过类名直接调用,而无需创建对象。
- 静态函数不能访问非静态成员或非静态成员函数。(静止的只能和静止的玩)
class ExampleClass {
public:
static void staticFunction() {
cout << "Static function" << endl;
}
};
静态成员变量
- 在类中使用static关键字修饰的成员变量是静态成员变量
- 所有类的对象共享同一个静态成员变量的副本
- 静态成员变量必须在类外部单独定义,以便为其分配存储空间
class ExampleClass {
public:
static int staticVar; // 静态成员变ᰁ声明
};
// 静态成员变ᰁ定义
int ExampleClass::staticVar = 0;
静态成员函数
和上面静态函数一样
静态局部变量
和上面的静态变量一样
Const关键字的作用
const关键字主要用于指定变量、指针、引用、成员函数等的性质
- 1. 常量变量:声明常量,使变量的值不能被修改。
- 2. 指针和引用:声明指向常量的指针,表示指针所指向的值是常量,不能通过指针修改。声明常量引用,表示引用的值是常量,不能通过引用修改。
const int* ptr = &constantValue; //指向常量的指针
const int& ref = constantValue; //常量引用
- 3. 成员函数:用于声明常量成员函数,表示该函数不会修改对象的成员变量(对于成员变量是非静态的情况)。
- 4. 常量对象:声明对象为常量,使得对象的成员变量不能被修改。
- 5. 常引用参数:声明函数参数为常量引用,表示函数不会修改传入的参数。
- 6. 常量指针参数:声明函数参数为指向常量的指针,表示函数不会通过指针修改传入的数据。(指针常量?)