Cherno C++【16-20】
【16】指针
指针是一个整数,一种储存内存地址的数字
所有类型的指针都是保存内存地址的整数
对于 x86 架构的解决方案平台,一个指针(即地址)的内存大小通常是 4 个字节。
定义一个空指针,
// A code block
void* ptr = NULL ;
在c++中NULL就表示0,通过#define NULL 0来规定的;同样也可以用关键字nullptr
&变量名 即表示查询该变量的地址
可以从地址写入或者读取数据,对指针进行解引用,可以访问这个数据,方法是*指针变量名
char* buffer = new char[8]; //动态分配了一个长度为8的 char 类型数组,并返回一个指向数组首元素的指针
memset(buffer, 0, 8); //将内存块(buffer)的前8个字节清零的
//char** 表示指向指针的指针,即一个二级指针。在这里,ptr 被声明为一个 char** 类型的变量,因此它可以存储指向指针的地址。&buffer 取地址运算符被用于获取 buffer 指针变量的地址,并将该地址赋值给 ptr 指针变量,因此 ptr 存储了 buffer 指针变量的地址。
char** ptr = &buffer;
//堆内存的分配和释放需要显式地进行,即使用 new 运算符动态分配内存,使用 delete 运算符释放内存。
delete[] buffer;
【17】引用
引用只是指针的伪装,只是指针的语法糖
“reference”必须要引用已经存在的变量,引用本身并不是新的变量,他们并不占用内存。引用可以理解为是变量的别名。
用指针进行传参
void Increment(int* value)
{
(*value)++;
}
int main()
{
int a = 5;
Increment(&a);
LOG(a);
std::cin.get();
}
用引用进行传参
void Increment(int& value)
{
(value)++;
}
int main() //程序的入口
{
int a = 5;
Increment(a);
LOG(a);
std::cin.get();
}
一旦声明了一个引用就不能改变它引用的东西。但是指针可以改变其所表示的地址。
【18】 类(class)
类只是对数据和功能组合在一起的一种方法。由class类型构成的variable成为对象,新的对象变量称为实例。
类中也可以包括函数,类的函数被称为方法。
类中定义的变量只能被类内的函数调用,如果想被外部函数调用,要加上public:
class Player
{
public:
int x, y;
int speed;
void Move(int xa, int ya)
{
x += xa * speed;
y += ya * speed;
}
};
【19】类与结构体对比
在 C++ 中,类(Class)和结构体(Struct)都是用户自定义的复合数据类型,可以包含成员变量、成员函数等成员。二者在语法上非常相似,甚至可以互相替代使用,但在使用习惯和设计理念上有一些区别,具体如下:
(1)默认访问权限不同
在 C++ 中,类的默认访问权限是 private,而结构体的默认访问权限是 public。这意味着,在类中声明的成员变量和成员函数默认情况下只能被类内部的其他成员访问,而在结构体中声明的成员变量和成员函数则可以被外部直接访问。当然,我们可以通过在类或者结构体中明确指定访问权限来覆盖默认设置。
(2)设计思想不同
从历史上看,C++ 最初是从 C 语言演化而来的,所以在 C++ 的早期版本中,结构体与 C 语言中的结构体类似,主要用于组织数据。而类则是 C++ 新增的一个概念,更加强调面向对象编程的特性,例如封装、继承、多态等。因此,从设计思想上来看,类更适用于面向对象编程的场景,而结构体更适用于简单的数据组织场景。
(3)继承方式不同
在 C++ 中,类支持多重继承(multiple inheritance),即一个类可以同时派生自多个基类;而结构体只能单一地从一个父结构体或基本数据类型中继承。这意味着,如果需要实现多重继承的功能,就必须使用类而不是结构体。
【20】写c++类
class Log
{
public:
const int LogLevelError = 0;
const int LogLevelWarning = 1;
const int LogLevelInfo = 2;
private:
int m_LogLevel = LogLevelInfo ;
public:
void SetLevel(int level)
{
m_LogLevel = level;
}
void Warn(const char* message)
{
if(m_LogLevel >= LogLevelWarning)
std::cout << "[WARNING]: " << message << std::endl;
}
void Error(const char* message)
{
if (m_LogLevel >= LogLevelError)
std::cout << "[Error]: " << message << std::endl;
}
void Info(const char* message)
{
if (m_LogLevel >= LogLevelInfo)
std::cout << "[Info]: " << message << std::endl;
}
};
int main() //程序的入口
{
Log log;
log.SetLevel(log.LogLevelError);
log.Warn("hello!");
log.Error("hhh");
log.Info("xixi");
std::cin.get();
}