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内部使用原子操作来管理引用计数,可以在多线程中安全使用。