个人C++知识点查漏补缺

众所周知,随着知识的累积,知识储备会逐渐由广度到深度渐进,很多不常用的知识点会随着时间逐渐遗忘,因此做笔记是一个好习惯。

C++中的四种类型转换

静态转换(static_cast):用于基本数据类型之间的转换,具有判定舍入误差、类型安全性高的特点。可以将指针或引用转换成它们所指的类型,前提是转换过程中涉及的类型具有继承或者派生关系,否则将不能进行转换。

int a = 10;
double b = static_cast<double>(a); // 将 int 类型的 a 转换为 double 类型的 b
  • 动态转换(dynamic_cast):用于在继承层次结构中沿着继承链向下进行转换。在使用动态转换时,会检查指针或引用指向的对象的实际类型,如果要转换的类型与所指对象类型不一致则返回 null 指针。
class Base {};
class Derived : public Base {};
Base* pBase = new Derived(); // 基类指针指向派生类对象
Derived* pDerived = dynamic_cast<Derived*>(pBase); // 将基类指针转换为派生类指针
if(pDerived) // 如果转换成功
{
    // ...
}
  • 重解释转换(reinterpret_cast):强制类型转换,用于不同类型之间的转换,包括指针、整数、浮点数等,但它并不进行类型检查。由于不进行类型检查,因此可能会导致错误的类型转换,使用时要谨慎。
int a = 10;
double b = reinterpret_cast<double&>(a); // 将 int 类型的 a 转换为 double 类型的指针
  • const转换(const_cast):用于将变量的常量属性去除(通过改变属性的类型)或添加(通过增加属性的类型)。
const int a = 10;
int& b = const_cast<int&>(a); // 将 const 类型的 a 转为 int 类型的 b
b = 20; // 可以修改 b 的值

C++与C语言编译区别

C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。
因为C++支持函数重载,C++函数编译后生成的符号带有函数参数类型的信息,而C则没有。

  • C++调用C函数的例子: 引用C的头文件时,需要加extern "C"
#include <iostream>
using namespace std;
//这里引用了extern "C"
extern "C" {
    #include "add.h"
}

int main() {
    std::cout << add(1, 1) << std::endl;
    return 0;
}
  • 而通常为了C代码能够通用,即既能被C调用,又能被C++调用,头文件通常会有如下写法:
//这是CPP的宏变量,如果是cpp文件则编译以c文件方式调用它
#ifdef __cplusplus
extern "C"{
#endif
//函数声明区
int add(int x,int y);

#ifdef __cplusplus
}
#endif

总结:C++之所以能够直接使用C语言标准库的函数,也是如此原因,在所有的C头文件上进行了extern "C"的关键字

枚举和枚举类

  • C语言枚举的用法
    枚举的作用域是全局,且不做类型检查,容易引起其它枚举的冲突
    为了限制其作用域,枚举通常会以下这样写
namespace Color 
{
    enum Type
    {
        RED=15,
        YELLOW,
        BLUE
    };
};
  • C++11枚举类的用法
  1. 新的enum的作用域不在是全局的
  2. 不能隐式转换成其他类型
  3. 可以指定用特定的类型来存储enum
enum class Color3:char //指定一个类型存储,如果不指定默认式整型
{
    RED='r',//作用域在枚举类内
    BLUE
};
char c3 = static_cast<char>(Color3::RED);//不能隐式转换成其他类型,必须显式!

还可以在类中用枚举

class Person{
public:
    typedef enum {
        BOY = 0,
        GIRL
    }SexType;
};//访问的时候通过,Person::BOY或者Person::GIRL来进行访问。

explicit(显式)关键字

  • explicit 修饰构造函数时,可以防止隐式转换和复制初始化
  • explicit 修饰转换函数时,可以防止隐式转换,但按语境转换除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值