c/c++(0)

文章介绍了C++中的enum类型用于定义固定值集合,const修饰变量或指针以保持常量性,volatile确保多线程环境下的可见性,typedef提供类型别名增强代码可读性,以及智能指针在内存管理中的作用,防止内存泄漏。
摘要由CSDN通过智能技术生成

enum 是一种自定义类型

enum是一种数据类型,用来定义有限的 POSSIBLE 值。它通常用来代表一组固定的常量值,例如一年的季节(四季)、颜色(红,黄,蓝)、性别(男,女)等。在C++中,可以这样定义一个enum:

cpp
enum Season {Spring, Summer, Autumn, Winter};

这定义了一个Season类型的enum,拥有四个可能值:Spring, Summer, Autumn, Winter.我们可以这样使用这个enum类型:

cpp
Season now = Spring;    // 现在是春天

if (now == Spring) {   // 如果现在是春天
    // do something
}

Enum有以下特点:1. 默认情况下,第一个enumerator的值是0,第二个enumerator的值是1,以此类推。也可以手动指定值:

cpp
enum Color {Red=2, Green, Blue};    // Red的值是2, Green的值是3,Blue的值是4

2. Enum类型的值实际上是一个整型,可以强制类型转换为int。3. Enum是一种约束类型,变量的值只能是列出的几个enumerator之一,不能随意修改。4. 在定义enum时,如果不指定类型,默认类型是int。也可以指定类型为char, short或long等。5. 使用enum可以让代码可读性更高,因为enumerator的名字通常比较易懂。

const cc; 使用bcc编译器 const修饰的变量不能出现等号左边

const是C++中的一个关键字,用于修饰变量、指针或成员函数,产生不同的作用:1. 修饰变量: const变量是一个常量,指其值无法改变。例如:

cpp
const double PI = 3.14;   // PI是常量,值无法改变

2. 修饰指针: const指针指向的内存内容是常量,无法通过该指针修改内容。例如:

cpp
int a = 10;
const int *p = &a;   // p是指向整数a的常量指针
*p = 20;   // 错误,通过p无法修改a的值
a = 20;   // 正确,可以直接修改a

int b = 10;
int * const q = &b;   // q是常量指针,指向b的指针q无法修改
*q = 20     // 正确,通过q可以修改b的值 
q = &a;     // 错误,q是常量指针,无法更改其指向

3. 修饰成员函数:const成员函数无法修改对象的成员变量。例如:

cpp
class Person {
public:
  void printName() const; // const成员函数
  void setName(std::string name); 
private:
  std::string name;
};

// const成员函数
void Person::printName() const { 
  std::cout << name; 
}

// 非const成员函数  
void Person::setName(std::string name) {
  this->name = name; 
}

volatiile 多线程 防止编译器智能优化

1. 编译器不会对含有该变量的语句进行优化。每次使用该变量时,都直接读写内存中的值。这确保程序能读取变量的实时值。2. 该变量不会被register关键字优化到寄存器中,必须读写内存。3. 多线程程序中,volatile变量存取时会强制从内存中读写值,以确保各个线程读取的都是该变量的最新值。因此,volatile关键字通常用在:- 表示外部设备的寄存器或状态
- 多线程程序中共享的变量举个例子:

cpp 
// 开关状态由外部电路控制
volatile bool switch_status = false; 

void doSomething() {
  while (!switch_status) {  // 轮询开关状态
    // do nothing
  }
  // 开关状态为true, 执行功能
}

在单线程程序中,如果不加volatile,编译器可能会优化while循环为空,而实际上switch_status值可能被外部电路改变。加上volatile可以避免这种优化,确保读取变量的最新值。在多线程程序中,volatile可以确保各个线程读取的共享变量值都是最新的,避免线程之间的同步问题。

typedef 重命名:typedef struct{} softarray; 重命名1

ypedef是C/C++中的一个关键字,用于为已有的类型取一个新的名字。它的作用是:1. 给复杂的数据类型定义简短易懂的别名,提高代码可读性。2. 定义泛型类型,增加代码灵活性。typedef的基本语法是:

typedef 原类型 新类型名;

例如:

cpp
typedef int Integer;     // 定义Integer为int类型的别名
typedef double Real;     // 定义Real为double类型的别名

Integer a = 10;         // 等同于 int a = 10;
Real b = 3.14;          // 等同于 double b = 3.14; 

这里我们使用typedef为int和double类型定义了别名Integer和Real,然后使用新类型名定义变量。另一个例子是定义函数指针的类型:

cpp
typedef void (*Function)(int);     // 定义Function为void(int)函数指针类型的别名

Function f1;         
Function f2 = &func1;    // f2指向func1函数

这里我们定义了一个Function类型的别名代表void(int)函数指针,然后声明函数指针变量f1和f2,f2指向func1函数。这使代码更易读和理解。typedef还可以用于定义泛型类型,例如:

cpp
typedef char* GenericPtr;    // 定义GenericPtr为char*类型的别名

GenericPtr p1 = "Hello";    // p1指向字符串 
GenericPtr p2 = (GenericPtr)0x100; // p2指向0x100内存地址

这里我们定义了一个通用指针类型GenericPtr,它可以指向字符串,也可以指向任意内存地址,这增加了代码的灵活性。

gcc aa.c aaaa.a -o test 链接 aa.c aaaa.o生成test文件

智能指针 内存泄漏 用完不归还

智能指针是C++11中加入的新特性,用于管理内存和简化内存管理。它封装了原始指针,在指针销毁时自动释放指针所指向的内存。C++提供了多种智能指针,常用的有:1. std::unique_ptr: 独占所有权的智能指针, signifies unique ownership. 确保指针所管理的内存不会被其他指针管理。

cpp
std::unique_ptr<int> ptr(new int(10));  // ptr管理new出来的int内存

2. std::shared_ptr: 共享所有权的智能指针, allows shared ownership of an object through reference counting. 通过引用计数管理内存,对象会在引用计数为0时自动删除。

cpp
std::shared_ptr<int> ptr1(new int(10));
std::shared_ptr<int> ptr2 = ptr1;   // 引用计数变为2
ptr1.reset();                       // 引用计数为1

 3. std::weak_ptr: 与std::shared_ptr配合使用,用于避免循环引用。std::weak_ptr不会增加引用计数。

cpp
std::shared_ptr<Foo> ptr1 = ...
std::weak_ptr<Foo> ptr2 = ptr1;  // 不增加引用计数
...
if (std::shared_ptr<Foo> ptr3 = ptr2.lock()) { 
    // 成功获得ptr1的共享所有权
}

使用智能指针的主要好处是:1. 简化内存管理。不需要手动delete内存,智能指针会在离开作用域时自动释放内存。2. 避免内存泄漏和野指针问题。3. 方便资源共享与传递。4. 线程安全。std::shared_ptr内部使用原子操作来管理引用计数,可以在多线程中安全使用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

୧⍢⃝୨૧(●´৺`●)૭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值