【C++】知识点细节补充(持续更新)

细节补充

这个系列主要是针对本人记忆不深刻的知识点进行整理,后期持续更新


explict关键字

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的

与之相对应的另一个关键字是implicit, 意思是隐藏的

类构造函数默认情况下即声明为implicit(隐式)

class CxString  // 没有使用explicit关键字的类声明, 即默认为隐式声明  
{  
public:  
    char *_pstr;  
    int _size;  
    CxString(int size)  
    {  
        _size = size;                // string的预设大小  
        _pstr = malloc(size + 1);    // 分配string的内存  
        memset(_pstr, 0, size + 1);  
    }  
    CxString(const char *p)  
    {  
        int size = strlen(p);  
        _pstr = malloc(size + 1);    // 分配string的内存  
        strcpy(_pstr, p);            // 复制字符串  
        _size = strlen(_pstr);  
    }  
    // 析构函数这里不讨论, 省略...  
}; 

// 调用时
CxString string1(24);     // 这样是OK的, 为CxString预分配24字节的大小的内存  
CxString string2 = 10;    // 这样是OK的, 为CxString预分配10字节的大小的内存

在C++中,如果构造函数只有一个参数时,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,也就是说 ”CxString string2 = 10; “ 这段代码,编译器自动将整型转换为CxString类对象(implicit隐式)

在explicit显式情况下【explicit CxString(int size)】,CxString string1(24)可以,但CxString string2 = 10不可以,explicit关键字取消了隐式转换

inline关键字

定义在类中的成员函数默认都是内联的

如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的

inline仅是一个对编译器的建议,最后能否真正内联,看编译器的意思

关于int main(int argc, char* argv[])

第一个参数,用来统计程序运行时发送给main函数的命令行参数的个数

第二个参数,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数

argv[0]指向程序运行的全路径名

argv[1]指向在DOS命令行中执行程序名后的第一个字符串

argv[2]指向执行程序名后的第二个字符串

argv[3]指向执行程序名后的第三个字符串

关于u8,u16,u32,int

u8 无符号char字符类型

u16 无符号short短整数类型

u32 无符号int基本整数类型

int 带符号int基本整数类型

  • 类型转换

    类型转换代码
    int ——> u8{u8} = (unsigned char){int}
    string ——> u8strcpy((char*){u8[]}, {string}.data())

    string转u8的几种特殊情况:

    • MAC

      sscanf({string}.data(), “%hhx-%hhx-%hhx-%hhx-%hhx-%hhx”, &{u8}[0], &{u8}[1], &{u8}[2], &{u8}[3], &{u8}[4], &{u8}[5])

    • IP4

      sscanf({string}.data(), “%hhu.%hhu.%hhu.%hhu”, &{u8}[0], &{u8}[1], &{u8}[2], &{u8}[3])

    • IP6

      • 方法一

        struct in6_addr ip6;

        inet_pton(AF_INET6, {string}.data(), &ip6);

        for (int ip6_index = 0; ip6_index < 16; ip6_index++) {

        ​ {u8}[ip6_index] = ip6.__in6_u.__u6_addr8[ip6_index];

        }

      • 方法二(char转unsigned)

        char ip_addr[132] = {0};

        sprintf(ip_addr, “%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x/%d”, {u8}[0], {u8}[1], {u8}[2], {u8}[3], {u8}[4], {u8}[5], {u8}[6], {u8}[7], {u8}[8], {u8}[9], {u8}[10], {u8}[11], {u8}[12], {u8}[13], {u8}[14], {u8}[15], {int});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值