随笔分类 - C++ 知识锦集
1
摘要:1. 变量命名规则 C++命名规则: 在名称中只能使用字母字符、 数字和下划线(_)。 名称的第一个字符不能是数字。 区分大写字符与小写字符。不能将C++关键字用作名称。 如果想用两个或更多的单词组成一个名称, 通常的做法是用下划线字符将单词分开, 如my_onions; 或者从第二个单词开始将每个
阅读全文
摘要:1. 静态变量的初始化线程安全问题 C++的局部static变量,是预先在静态存储区分配了内存,然后在第一次执行到这里的时候进行初始化。 C++11 规定了局部static变量的线程安全,实现上应该是类似std::call_once的实现,我估计基本上就是基于cas的spin-lock,这里当然可以
阅读全文
摘要:extern有两个作用: 当它与”C”一起连用时,如: extern “C” void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的。 C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称
阅读全文
摘要:1. 引用的底层原理解析 引用被称为变量的别名,它不能脱离被引用对象独立存在,这是在高级语言层面的概念和理解,并未揭示引用的实现方式。常见错误说法是“引用“自身不是一个变量,甚至编译器可以不为引用分配空间。 引用地址空间存放的是被引用对象的地址。 实际上,引用本身是一个变量,只不过这个变量的定义和使
阅读全文
摘要:静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)。静态成员变量是在程序编译时分配空间,而在程序结束时释放空间。 静态成员的定义和声明要加个关键static。静态成员可以通过双冒号来使用,即<类名>::<静态成
阅读全文
摘要:事实上,我们的重载运算符返回void、返回对象本身、返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值。 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进行连续赋值; 防止返回对象(返回对象也可以进行连续赋值(常规的情况,如a = b = c,而不是(a
阅读全文
摘要:拷贝构造函数的参数为什么必须使用引用类型? 如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参
阅读全文
摘要:一组函数,函数名相同。函数的参数类型或参数个数不同,那么这一组函数就称作函数重载。 C++ 为什么支持函数重载? C++代码产生函数符号的时候,是由函数名+参数列表组成的; C代码产生函数符号的时候,是由函数名来决定; 函数重载需要注意什么? 一组函数如果是重载函数,一定是处于同一作用域。否则函数调
阅读全文
摘要:1. 函数模板 假设我们设计一个交换两个整型变量的值的函数,代码如下: // 交换两个整型变量的值的Swap函数: void Swap(int & x,int & y) { int tmp = x; x = y; y = tmp; } 如果是浮点类型的变量的值交换,则替换 int 类型为 doubl
阅读全文
摘要:1. C风格字符串 在C语言中,字符串表示为字符的数组。字符串中的最后一个字符是空字符(\0’)。 C 和 C++中的 sizeof 操作符可用于获得给定数据类型或变量的大小。例如,sizeof(char) 返回 1,因为 char 的大小是 1 字节。但是,在 C 风格的字符串中,sizeof()
阅读全文
摘要:两种方式的函数声明如下: void func(const char* s); void func(const std::string& s); 当实参是string时: void funcstr(const std::string& s) { std::cout << s; } void funcc
阅读全文
摘要:1. 申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。 那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,
阅读全文
摘要:1. 浮点型的原理介绍及在内存中的存储形式 C语言提供了浮点数据类型,单精度浮点数float和双精度浮点数double。浮点数属于不精确的数据类型,本文将通过float类型的原理和在内存中的存储形式来介绍浮点型不精确的原因。以float类型为例,来展示C语言中浮点型的神秘之处。 2. float类型
阅读全文
摘要:1. 函数返回机制 函数返回值的传递分为两种情况: 当返回的对象大小不超过8字节时,通过寄存器(eax edx)返回。 当返回的对象大小大于8字节时,通过栈返回。此处需要注意的时候,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。 在通过栈返回的时候,栈上会有一
阅读全文
摘要:1. volatile关键字 C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrie。 volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。 遇到这个
阅读全文
摘要:1. 隐藏(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 如果加了static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数
阅读全文
摘要:const 定义的常量在超出其作用域之后其空间会被释放; static 定义的静态常量在函数执行后不会释放其存储空间; 1. static static 表示的是静态的。 类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一
阅读全文
摘要:函数原型: void *memcpy(void *dest, const void* src, size_t count ); void *memmove(void *dest, const void* src, size_t count ); memcpy和memmove相同点: 都是用于从src
阅读全文
摘要:1. malloc 函数原型: extern void *malloc(unsigned int num_bytes); 如果分配成功:则返回指向被分配内存空间的指针,不然返回指针NULL 。同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。 malloc分配的内存大小至少为参数所指
阅读全文
摘要:1. kmalloc 函数原型: void *kmalloc(size_t size, gfp_t flags); kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128
阅读全文
1