
c++
文章平均质量分 56
语法
泡泡茶壶Wending
男
展开
-
C++11 thread_local
这意味着每个线程都有其自己的变量实例,每个线程都可以独立地访问和修改该变量,而不会影响其他线程的同名变量。的场景通常涉及到需要在每个线程中保持状态的情况,同时又不希望这些状态被其他线程共享。每个线程都有自己的单例实例,不需要额外的同步机制来保护共享状态。变量可以轻松地跟踪每个线程的日志信息,而无需在日志记录期间进行同步。变量提供了一种简单的方法,在不同的函数调用之间保持线程特定的状态。变量可以让每个线程拥有自己的配置,而不会相互干扰。:有时候,不同的线程可能需要不同的配置参数。原创 2024-02-14 15:01:17 · 655 阅读 · 0 评论 -
Lua和C++交互
先总结: Lua和C++是通过一个虚拟栈来交互的。 C++调用Lua实际上是:由C++获取函数,压入栈中先把数据放入栈中,由Lua去栈中取数据,然后返回数据对应的值到栈顶,再由栈顶返回C++。 Lua调C++也一样:先编写自己的C模块,然后注册函数到Lua解释器中,然后由Lua去调用这个模块的函数。 C++和Lua如何通信:1.Lua调用C++:先一句话概括:根据规定好的函数类型(返回int,参数是Lua_State*(共享栈))编写C++函数,然后调用lua_re原创 2022-01-08 11:01:45 · 2224 阅读 · 0 评论 -
C++ const 和 #define 区别
1、const (1)C++对 const 常量的处理过程:当编译器碰到常量声明时,在符号表中放入常量,编译时发现使用常量,则直接以符号表中的值替换。 (2)如果,编译中发现,对 const 使用 extern 或者 & 操作符时,则会给对应变量分配新的存储空间。 符号表保存的内容: key value a 10 在程序运行时,符号表是不变的。 (3)const 是在编译器编译期间,分配内存。...转载 2020-08-13 14:53:26 · 224 阅读 · 0 评论 -
C++堆和栈区别
C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C转载 2020-06-01 20:51:40 · 618 阅读 · 0 评论 -
1. 转换构造函数 2. explicit关键字 3. 类型转换函数
1. 转换构造函数类的构造函数可以定义不同类型的参数,当参数满足下列条件时,就可称其为转换构造函数。函数仅有一个参数 参数是基本类型或者其他类类型其中,有一种特殊情形,也可构成转换构造函数。函数有多个参数,但除了第一个参数外,其余都是默认参数 第一个参数是基本类型或者其他类类型 函数调用时只使用一个参数C++编译器在进行编译工作时,会尽力尝试让源码通过编译,因此如果碰到了这样的代码Test t = 100,编译器不会立即报错,而是进行以下尝试:查找类中是否有定义转换构造函数 如果转载 2020-05-30 23:58:43 · 262 阅读 · 0 评论 -
C++函数传值和传引用
如果参数类型是自定义类型推荐使用传引用而不是传值,因为传值的时候会调用构造和析构,还会拷贝一份实参的副本,造成一些开销。还有一个原因是传值在传派生类对象的时候,如果函数的参数是基类类型。会造成对象切割问题,对象切割不会触发多态。C++底层对引用的实现,实际是用指针实现出来的,对于C++内置类型,比如int、char这些,传值往往比传引用更高效一些。同样适用的还有stl的迭代器和函数对象,这些设计时候被设计为传值。c++对象切割的情况:1.当把一个派生类对象赋给一个基类对象时,会发生对...原创 2020-05-30 23:41:21 · 747 阅读 · 0 评论 -
.static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
static的作用:对变量:1.局部变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。1)内存中的位置:静态存储区2)初始化:局部的静态变量只能被初始化一次,且C中不可以用变量对其初始化,而C++可以用变量对其初始化。(详见:http://www.cnblogs.com/novice-dxx/p/7094690.html)3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。注:当static用来修饰局...原创 2020-05-26 22:47:07 · 531 阅读 · 1 评论 -
C++ 四个智能指针shared_ptr, weak_ptr, unique_ptr, auto_ptr
C++中的四个智能指针shared_ptr, weak_ptr, unique_ptr, auto_ptr 其中前面三个是C++11支持并且最后一个已经被C++11抛弃。智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄露。使用智能指针可以很大程度上的避免这个问题。因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间。不需要手动释放内存空间。1). auto_ptr.原创 2020-05-26 22:30:52 · 291 阅读 · 0 评论 -
C++ 之 多态
静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,函数重载就是一个简单的静态多态动态多态:它是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。即: 在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。动态多态的条件:●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。●通过基类对象的指针或者引用调用虚函数。重写:(a)基类中将被重写的函数必...转载 2020-05-20 13:01:30 · 129 阅读 · 0 评论 -
C++ map,set内部数据结构
1)Set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变。【重点】内部结构采用红黑树的平衡二叉树。multiset 跟set 类似,唯一的区别是允许键值重复!!!如: 为何map和set的插入删除效率比用其他序列容器高? 为何每次insert之后,以前保存的it转载 2016-03-11 00:59:26 · 4999 阅读 · 1 评论 -
c语言'\0' 意思
在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节。第一个ASCII码,对是0,对应的字符是(Null),其实就是‘\0’,即空字符。原创 2015-10-06 16:59:54 · 941 阅读 · 0 评论 -
深入理解C++浮点数(float、double)类型数据比较、相等判断
浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。所以浮点数在运算过程中通常伴随着因为无法精确表示而进行的近似或舍入。但是这种设计的好处是可以在固定的长度上存储更大范围的数。1、将字符串转换为float、double过程存在转载 2016-03-09 15:32:27 · 8301 阅读 · 1 评论 -
c语言指针占几个字节
内存是由字节组成的,每个字节都有一个编号。指针变量主要是存放相同数据类型的变量的首地址。这里的这个地址其实就是内存的某个字节的编号。而这个编号的确定是与地址总线有关。如果地址总线是32位,则它的寻址范围是0~2^32(0~4G)。那么为一个字节的编址就会由32个0或者1组成。例如第一个字节的编址是32个0,最后一个的编址是32个1。一个字节有8位,32位则需要4个字节。简单的说32位的操...转载 2016-03-11 11:43:48 · 21536 阅读 · 1 评论 -
C++虚基类
虚基类的作用 当一个基类被声明为虚基类后,即使它成为了多继承链路上的公共基类,最后的派生类中也只有它的一个备份。例如:class CBase { };class CDerive1:virtual public CBase{ };class CDerive2:virtual public CBase{ };class CDerive12:public CDerive1转载 2016-02-16 11:38:29 · 441 阅读 · 0 评论 -
C++继承中构造函数、析构函数调用顺序及虚析构函数
C++继承中构造函数、析构函数调用顺序及虚析构函数首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先调用基类的构造函数然后再调用自己的构造函数。通俗点说,你要用某些转载 2016-02-16 11:29:48 · 5505 阅读 · 2 评论 -
C++ 为什么设置基类的析构函数为虚函数
对象的析构函数调用顺序是从派生类到基类那么如果基类的指针指向派生类的对象 还能正常的执行析构顺序吗下面看一个类的声明[cpp] view plain copyclass Subject { public: ~Subject(); Subject(); }转载 2016-02-16 11:25:28 · 762 阅读 · 0 评论 -
new/delete和malloc/free的区别
还是先说说区别吧: 1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。 2. new/delet转载 2016-03-01 23:00:37 · 335 阅读 · 0 评论 -
C++ using关键字作用总结
C++ using关键字作用总结1.在当前文件中引入命名空间这是我们最熟悉的用法,例如:using namespace std;2.在子类中使用 using 声明引入基类成员名称(参见C++ primer)在private或者protected继承时,基类成员的访问级别在派生类中更受限:class Base {public:std::size_t siz转载 2015-12-21 16:49:02 · 371 阅读 · 0 评论 -
C++自定义时间格式
自定义时间格式我们可以使用strftime()函数将时间格式化为我们想要的格式。它的原型如下:size_t strftime( char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strD转载 2015-12-29 14:44:13 · 1566 阅读 · 1 评论 -
C++命名规则
类/结构除了异常类等个别情况(不希望用户把该类看作一个普通的、正常的类之情况)外,C++类/结构 的命名应该遵循以下准则:C++类/结构的命名类的名称都要以大写字母“C”开头,后跟一个或多个单词。为便于界定,每个单词的首字母要大写。推荐的组成形式类的命名推荐用"名词"或"形容词+名词"的形式,例如:"CAnal转载 2015-11-10 11:28:29 · 432 阅读 · 0 评论 -
详细介绍C/C++数组名与指针区别
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。想必这种误解的根源在于国内某著转载 2015-08-10 22:46:25 · 297 阅读 · 0 评论 -
位操作基础篇
位操作篇共分为基础篇和提高篇,基础篇主要对位操作进行全面总结,帮助大家梳理知识。提高篇则针对各大IT公司如微软、腾讯、百度、360等公司的笔试面试题作详细的解答,使大家能熟练应对在笔试面试中位操作题目。 下面就先来对位操作作个全面总结,欢迎大家补充。在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。转载 2015-09-16 14:55:52 · 447 阅读 · 0 评论 -
[C/C++]如何解读返回函数指针的函数声明
int (*(*pf())())() { return nullptr; } 从来没有见过这样的函数声明。那么它究竟是一个怎样的函数呢?我努力回忆起《C专家编程》一书的内容,把其中解读变量声明的方法应用于该函数上,最终读懂了该函数。下面是大致的解读过程。 首先,要确定声明中出现的操作符的优先级。显然,函数调用操作符()的优先级是高于指针解引用操作符*的转载 2015-09-12 09:43:12 · 2076 阅读 · 0 评论 -
std::map与std::set
MAP的节点是一对数据. SET的节点是一个数据.Map使用关键值Key来唯一标识每一个成员 map可以重复。set是集合 都属于关联容器 只不过,map的形式 map mymap; set的形式 set myset; set(集合)——包转载 2016-03-13 12:28:56 · 4949 阅读 · 0 评论 -
C++静态库与动态库
C++静态库与动态库这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非转载 2016-03-13 16:19:25 · 290 阅读 · 0 评论 -
vector的内存释放与swap()
原型:#include void clear();函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素则应使用一个类转载 2015-08-11 19:47:42 · 5767 阅读 · 0 评论 -
C/C++ 中的0长数组(柔性数组)
转自:http://blog.youkuaiyun.com/yby4769250/article/details/7294696在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的。但是,GUN中却允许使用,而且,很多时候,应用在了变长结构体中,如: 1 2 3 4 5 6 s...转载 2019-05-22 17:41:44 · 874 阅读 · 1 评论 -
C++11右值和右值引用相关的笔记
对于形参是右值引用的函数,如: void process(int&& x),调用时候重点关注的是实参的属性是不是右值,而不是实参的数据类型。右值引用类型的变量的属性是左值,只要是变量都是左值。原创 2018-08-08 14:49:51 · 171 阅读 · 0 评论 -
Effective C++
https://blog.youkuaiyun.com/xufeilong520xu/article/details/73740945转载 2018-07-20 15:12:27 · 548 阅读 · 0 评论 -
深度探索C++对象模型
https://blog.youkuaiyun.com/draco_mystack/article/details/70233709转载 2018-07-20 15:04:55 · 117 阅读 · 0 评论 -
C++虚表,你搞懂了吗?
http://blog.jobbole.com/103102/转载 2018-07-20 14:51:58 · 258 阅读 · 0 评论 -
深入理解extern和static用法
一、 extern做变量声明l 声明extern关键字的全局变量和函数可以使得它们能够跨文件被访问。我们一般把所有的全局变量和全局函数的实现都放在一个*.cpp文件里面,然后用一个同名的*.h文件包含所有的函数和变量的声明。如:/*Demo.h*/ #pragma once extern int a; extern int b; int ad原创 2017-10-20 10:40:08 · 2447 阅读 · 1 评论 -
C++拷贝构造函数和赋值运算符根本的不同
首先要说明的是,若用户没有定义,C++隐式声明一个拷贝构造函数和一个赋值运算符(完成按数据成员复制的动作)。二者很像,但是在下边这点上有很大的不同:拷贝构造函数是只在对象实例化时才会被调用,也就是说,在拷贝构造函数调用期间,这个对象处于一个未决状态(直到拷贝构造函数被成功调用),另外拷贝构造函数不返回任何值,void都没有。而赋值运算符则在一个现存的对象被赋予新的值时被调用,并且它有返回值。原创 2017-07-10 15:46:36 · 920 阅读 · 0 评论 -
C/C++:函数的编译方式与调用约定以及extern “C”的使用
C/C++:函数的编译方式与调用约定以及extern “C”的使用原文地址:http://www.cnblogs.com/qinfengxiaoyue/archive/2013/02/04/2891908.htmlc++之所以可以重载函数是因为它编译的时候生成的函数名会格外加上它的类型和参数等信息。这样,不同参数列表的函数就不同名了。函数在C++编译方式与C编译方式下的转载 2016-11-14 21:34:58 · 853 阅读 · 0 评论 -
char*与char[]
char* str = "resource"; str[6] = 'k'; //这句报内存写入错误 *(str+6) = 'k'; //这样写同样报错 但是这样就没问题: char* str = new char[12]; strcpy(str, "resource"); str[6] = k; //没问题 *(str+6) = 'k'; //原创 2015-09-04 00:22:06 · 499 阅读 · 0 评论 -
C++的指针类型转换
在C++中,指针的类型转换是经常发生的事情,比如将派生类指针转换为基类指针,将基类指针转换为派生类指针。指针的本质其实就是一个整数,用以记录进程虚拟内存空间中的地址编号,而指针的类型决定了编译器对其指向的内存空间的解释方式。基于上面的理解,我们似乎可以得出一个结论,C++中对指针进行类型转换,不会改变指针的值,只会改变指针的类型(即改变编译器对该指针指向内存的解释方式),但是这个结论在C+转载 2016-10-29 15:24:52 · 1276 阅读 · 0 评论 -
sizeof()用法汇总
sizeof()用法汇总sizeof()功能:计算数据空间的字节数1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。 而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。2.指针与静态数组的sizeof操作 指针均可看为变量类型转载 2014-10-23 18:05:42 · 382 阅读 · 0 评论 -
C++中的friend详细解析
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。友元函数的实现可以在类外定义,但必须在类内部声明友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友转载 2016-08-02 17:16:44 · 37998 阅读 · 1 评论 -
从std::vector中移除指定元素的方法
#include #include #include typedef int MyType;using namespace std;int main(){ std::vector vec1; //假设这里永远不会存放-1 std::vector vec2; for(int i=0;i<10;i++) { vec1.push_back(i原创 2016-04-22 16:40:04 · 12706 阅读 · 0 评论 -
new (nothrow) T() 的原理
查看中对new的声明.void* operator new(std::size_t) throw (std::bad_alloc);void* operator new(std::size_t, const std::nothrow_t&) throw();void* operator new[](std::size_t) throw (std::bad_alloc);转载 2016-05-12 11:25:58 · 655 阅读 · 0 评论