细节补充
这个系列主要是针对本人记忆不深刻的知识点进行整理,后期持续更新
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 ——> u8 strcpy((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});
-
-