
C/C++ Learn
文章平均质量分 57
fzzjoy
Code Change World
展开
-
C/C++逻辑操作
按位操作按位与运算符(&):例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。按位或运算符(|):例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。按位异或运算符(^):参加运算的两个数据,按二进制位进行“异或”运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;即:参加运算的两个对象,如果两个相应位为“异原创 2021-10-19 23:44:25 · 552 阅读 · 0 评论 -
C++11_4种类型转换
* 去掉const/volatile属性用const_cast* 多态中的向下转换用dynamic_cast* 除去上两种的转换,其他转换都可以用static_cast* 针对static_cast无法转换(编译报错的)则可以使用reinterpret_cast强制底层二进制位的转换。原创 2021-10-04 22:26:16 · 366 阅读 · 0 评论 -
虚函数和虚继承
虚函数表指针:vfptr -> 指向一个虚函数表。虚基类指针:vbptr -> 指向一个虚基类表。带虚函数的多重继承的内存布局#include <iostream>using namespace std;class Base1{public: //三个虚函数 virtual void f() { cout << "Base1::f" << endl; } virtual void g() { cout << .原创 2021-10-03 12:34:29 · 251 阅读 · 0 评论 -
STL-容器
STL容器:顺序容器 && 容器适配器 && 关联容器 && 无序关联容器原创 2021-09-14 22:32:03 · 173 阅读 · 0 评论 -
虚析构函数和纯虚析构函数
虚析构函数就是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。之所以可以这样是因为虚析构函数会被记录在虚函数表中,如果派生类继承了基类,则派生类的析构函数也会隐式成为虚函数,并且会替换掉父类的析构函数指针。原创 2021-09-13 21:07:31 · 911 阅读 · 0 评论 -
C++类变量构造和析构顺序
继承关系上构造析构顺序C++类成员变量初始化顺序:基类的静态变量派生类的静态变量基类的成员变量派生类的成员变量类变量按照列出的顺序初始化,然后以相反的顺序销毁多重继承的构造顺序:基类→子对象→派生类多重继承的析构顺序:派生类→子对象→基类针对一个类而言:先初始化成员变量,再进行类的构造,析构则相反。#include<iostream>using namespace std;class A{ int a; int b = -1;原创 2021-09-06 22:50:05 · 1698 阅读 · 0 评论 -
STL学习—STL六大组件
STL六大组件STL主要提供6大组件:1、容器(container):各种数据结构,如map、vector、list、deque、set等,用来存放数据;2、算法(algorithm):各种常用算法,如sort、search、copy等;3、迭代器(iterators):通过迭代器连接容器和算法,组合使用;是所谓的泛型指针;4、仿函数(functors):类似函数,可以作为算法原创 2016-07-18 00:03:38 · 602 阅读 · 0 评论 -
C++11 - 无锁队列
无锁操作的本质依赖的原子操作,C++11提供了atomic的原子操作支持CAS原子操作CAS即Compare and Swap,是所有CPU指令都支持CAS的原子操作(X86中CMPXCHG汇编指令),用于实现实现各种无锁(lock free)数据结构。CAS用于检查一个内存位置是否包含预期值,如果包含,则把新值复赋值到内存位置。成功返回true,失败返回false。示例代码如下:bool compare_and_swap ( int *memory_location, int expected_v原创 2021-08-10 22:05:35 · 3790 阅读 · 2 评论 -
C++11新特性 - shared_from_this
shared_from_this利用shared_from_this安全捕获this指针#include <iostream>#include <fstream>#include <vector>#include <map>#include <algorithm>#include <functional>#include <mutex>#include <thread>#include <原创 2021-06-29 21:45:27 · 607 阅读 · 1 评论 -
std::async异步编程
传入线程函数eg:#include <iostream>#include <string.h>#include <thread>#include <future>using namespace std;int func(int user_data){ cout << "child thread start, i...原创 2021-01-31 16:25:01 · 142 阅读 · 0 评论 -
C语言:内存泄露与越界读写
在C程序中使用malloc和free时,如若使用不慎,堆会出现两种类型的问题:1、内存损坏:释放或改写仍在使用的内存。2、内存泄露:未释放不再使用的内存。解决内存泄露的一种简单办法:根据需求使用alloca来分配动态内存,当离开调用alloca的函数时,它所分配的内存会被自动释放。注:alloca是在栈(stack)上申请空间,该变量离开其作用域之后被自动释放,无需手动调用释放...原创 2021-01-31 15:33:04 · 591 阅读 · 0 评论 -
C++_const使用大全
在同一个类中是不能定义两个名字相同、参数个数和类型都相同的函数,但是在类的继承层次结构中,在不同的的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数,此时就会发生函数覆盖现象,默认调用的是本类中的成员函数,若派生类对象想调用基类的继承的覆盖函数,则需如此调用:派生类对象.基类::成员函数。如:#includeusing namespace std;class A{pub原创 2015-04-15 10:12:57 · 648 阅读 · 0 评论 -
关于typedef的用法总结
参考文章:关于typedef的用法总结转载 2017-09-29 15:48:40 · 254 阅读 · 0 评论 -
头文件包含的两点原则
两点原则第一个原则如果可以不包含头文件,那就不要包含了,这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。第二个原则尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中原创 2017-10-06 22:21:24 · 874 阅读 · 0 评论 -
char*、char[]及string的区别及相互转换
区别:char *s1:s1是一个指向字符串的指针;char s2[]:s2是一个字符数组;string s3:s3是一个string类的对象.【内存模型】例如:char *s1 = "hello";char s2[] = "hello";内存模型如下 +-----+ +---+---+---+---+---+---+ s原创 2017-08-24 00:01:37 · 3795 阅读 · 0 评论 -
尾递归
相信很对人对递归函数并不陌生,而滥用递往往容易造成栈溢出。那么有什么好的方法可以避免而同时又保证程序的效率呢?其实在递归中存在着一种尾递归的形式,尾递归函数的特点是在回归过程中不用做任何操作(只保留一个调用记录),这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。定义尾调用的概念非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。尾递归则是调用函数本身...原创 2019-08-28 17:27:24 · 172 阅读 · 0 评论 -
sizeof的用法全
1、统计数组: int a[10]; char b[10]; cout << sizeof(a) << endl;//40 cout原创 2017-07-18 00:30:41 · 291 阅读 · 0 评论 -
函数出参的运用
一般来说,函数出参采用指针形式和引用形式。注:&多用于参数传入,对于传出参数还是用*的比较好。用*可以设计缺省值,而&确不能。#include using namespace std;void SwapByPoint(int* x, int* y) //指针传参函数的声明{ *x = *y = 1;}void SwapByReference(int &x,原创 2017-10-16 22:56:48 · 2144 阅读 · 0 评论 -
虚函数_纯虚函数_抽象类
1、只要含有纯虚函数的类就是抽象类,不能实例化对象;2、关于多态,简而言之,就是用父类类型的指针指向其子类实例,然后通过父类的指针调用实际子类的成员函数。※需要和虚函数表结合理解(参考文章:C++进阶之虚函数表)例程:#include <iostream>using namespace std;class A // 抽象类{public: virtual...原创 2018-03-04 16:32:42 · 261 阅读 · 0 评论 -
C/C++类型提升
#include #include using namespace std;int main(){ char a = -1; unsigned char b = 255; printf("a = 0x%x b = 0x%x \n", a, b); system("pause"); return 0;}运行结原创 2018-04-06 23:05:15 · 1048 阅读 · 0 评论 -
C/C++ static 关键字使用
在C语言中在.c中(为什么是.c,后面注意事项会说明)定义全局静态变量,控制访问范围,仅仅局限在本文件中才能访问,即便是 extern 外部声明也不可以;这样一来就允许在多个源文件中定义相同的变量,且不受干扰。否则编译会报重复定义。同理修饰于函数。在C++中注意事项在C/C++中,不推荐在头文件中定义static全局变量,如果在头文件中定义了static变量,被多个文件引用,编译可以...原创 2019-08-22 10:57:02 · 401 阅读 · 0 评论 -
Modern C++ 新特性
智能指针weak_ptr一般配合shared_ptr使用,当某个地方需要用到shared_ptr时,但不确定shared_ptr指向的对象是否已经销毁,可以利用weak_ptr来判断是否过期,并且构造出一个shared_ptr,该操作是原子的。eg1:std::shared_ptr<Widget> spw1 = wpw.lock(); //如果wpw已经过期 //spw1的...原创 2019-08-22 14:57:14 · 319 阅读 · 0 评论 -
C++名词解析
左值:右值:左值引用:右值引用:万能引用:提领(dereference):获取指针地址或引用地址上的值;类型提升:可以理解为对数据类型进行扩展(参考:【C/C++】类型提升)...原创 2019-08-22 20:21:13 · 284 阅读 · 0 评论 -
C++11 6个特种函数
6个特种函数,以class A为例:默认构造函数:A();析构函数:~A();复制构造函数:A(const A& a);复制赋值运算符:A& operator=(const A& a);移动构造函数:A(A&& a);移动赋值运算符:A& operator=(A&& a);生成默认移动操作的条件:如果一个类定义了...原创 2019-08-22 21:29:42 · 299 阅读 · 0 评论 -
C++ 11 中的几种锁
互斥锁(mutex)可以避免多个线程在某一时刻同时操作一个共享资源,标准C++库提供了std::unique_lock类模板,实现了互斥锁的RAII惯用语法:eg:std::unique_lock<std::mutex> lk(mtx_sync_);条件锁(condition_variable)条件锁就是所谓的条件变量,某一个线程因为某个条件未满足时可以使用条件变量使该程序...原创 2019-08-27 23:16:50 · 24043 阅读 · 0 评论 -
内存字节对齐原则——总结
似乎每一家企业在招聘的时候都很关注这个问题,无论在笔试还是面试都会提及。ZZ最近找工作就经常遇到这样的问题,尽管之前有去了解过,但自己没有总结过,还是回答错了这才想起来总结了,为时不晚吧。字节对齐的原则主要有俩条:在没有#pragma pack的情况下1、sizeof的最终结果必然是结构内部最大成员的整数倍,不够补齐。结构内部最大成员包含子成员结构体内部的成员,可以这么理解:t...原创 2015-04-08 20:37:43 · 3086 阅读 · 2 评论 -
如何制作DLL接口及使用
lib(英文全称:library)分为两种:静态库:这种lib中有函数的实现代码,一般用在静态链接上,它是将lib中的代码加入目标模块(exe或者dll)文件中,所以链接好了之后,lib文件就没有用了。一种LIB是和DLL配合使用的,包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library原创 2016-12-19 17:25:07 · 9481 阅读 · 0 评论 -
char *与char []类型的区别
参考文章:char *s 和 char s[] 的区别小结char *s1 = "hello";char s2[] = "hello"; 【区别所在】char *s1 的s1是指针变量,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,但当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。char s2[]的s2 是数组对应原创 2016-11-10 16:28:18 · 12783 阅读 · 0 评论 -
复合类型的声明
符合类型的声明两种方式:int* p; //p是指向int型的指针,合法但这种写法可能产生误导,因为将*和int放在一起,容易误导基本数据类型为int*,而不是int,事实上基本类型为int,*是修饰符,修饰变量p;因此一般来说我们更推荐以下这种写法:int *p; //p是指向int型的指针,*修饰了变量p,基本数据类型为int;原创 2016-11-10 17:17:58 · 447 阅读 · 0 评论 -
C++_重载、重写和重定义的区别
参考博客:http://blog.sina.com.cn/s/blog_8ddc5c2e01013hbd.html相信看到这个标题头就晕了,其实将他们彼此放到一起来看,就会比较清晰辨认了。重载:函数名相同,函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同。函数返回值的类型可以相同,也可以不相同。发生在一个类内部。重定义:也叫做隐藏,子类重新定义父类中有相同名称的非虚函数( ...原创 2015-05-08 18:37:06 · 26209 阅读 · 4 评论 -
printf中%p的输出应用
最近在printf遇到一个偏冷的格式控制字符%p,其实它表示的含义可以理解成和%d %x的应用是一样的。具体来说,%p表示输出以内存中实际存储一个变量格式(十六进制、32位(视机器而定))的值。即如:#include<stdio.h>int main(){ int a=10; int *p=&a; printf("%d %p\n",...原创 2015-03-22 18:32:46 · 8651 阅读 · 1 评论 -
assert断言的使用说明
assert,中文意思是断言,在C语言中是一种宏,不是函数,常用于调试,含于头文件中。使用语法:assert(judgement),括号内加入判断表达,表明此处断言表达式成立。若事实上成立的话,则断言为真,程序照常运行。若事实上表达式不成立,断言失败,则程序崩溃,无法正常运行。若要禁用断言,使其无效,需在#include前加上#define NDEBUG 。这样断言语句即使未被删除,效果等同于被注原创 2015-05-19 15:03:07 · 3547 阅读 · 0 评论 -
C_volatile的使用
参考:百度百科 博客:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止原创 2015-05-20 21:21:49 · 417 阅读 · 0 评论 -
复合赋值运算总结
规律:复合赋值运算的一般形式变量 双目运算符=表达式;等价于:变量=变量 双目运算符 (表达式) (注:即等号右侧表达式为一整体先运算,再与左侧变量相运算)例:#includeint main(){ int a=5,b=4,c=3; a+=b;//等价于 a=a+b printf("a=%d\n",a); a=5; a*=b原创 2015-10-23 21:30:19 · 6471 阅读 · 0 评论 -
关于++i与i++的总结
大牛的总结(详见《C专家编程》一书附录A):++X和X++的区别与编译器的中间代码有关,例如:“++X”表示取X的地址,增加它的内容,然后把值放在寄存器中;(先加)“X++”表示取X的地址,把它的值装入寄存器中,然后增加内存中X的值;(后加)测试代码如下:#include<stdio.h>int main( ){ int a=1,b=3; ...原创 2015-04-14 13:58:37 · 1030 阅读 · 1 评论 -
关于sizeof与strlen在字符串应用的区别
sizeof是计算数据类型占用内存的大小。当计算字符串占存大小时。strlen的函数原型: std::size_tstrlen(constchar*str); sizeof是个运算符。sizeof(string)=strlen(string)+1;原因很简单,字符串常量会在存储为char数组时补上最末位的‘\0’结束符。举个...原创 2015-04-06 19:47:50 · 631 阅读 · 0 评论 -
c中的const使用大全
参考:百度百科Case1 :const int n=5;int a[n];不能这样使用,即使编译通过,对数组a大小的声明也是无效的。因为const修饰的是只读变量,而ANSI C规定数组定义时长度必须是“常量”,在ANSI C中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。Case 2:例:下面的代码编译器会报一个错误,请问原创 2015-04-15 11:02:04 · 862 阅读 · 0 评论 -
C++_基类成员在派生类中的访问属性——总结
首先回顾一下三种成员访问限定符:public(公用的):既可以被本类中的成员函数所引用,也可以被类的作用域内的其他函数(即类外)引用。private(私有的):只能被本类中的成员函数引用,类外不能调用(友元类除外)protected(受保护的):不能被类外访问,但可以在派生类的成员函数访问。接下来就用一张表总结一下基类成员在派生类中的访问属性:可以这么简单的认为:...原创 2015-04-08 16:08:42 · 5486 阅读 · 0 评论 -
C++_类模板的使用
类模板是类的抽象,类是类模板的实例。声明类模板:template<class T1,class T2...>//可声明多个类型参数关于类模板的使用谨记一点。用类模板实例化的类中实参数类型去代替声明时的类型参数名。如声明:template <class T1,class T2>class Compare{public: Compare(T1 a,T...原创 2015-04-04 13:14:20 · 658 阅读 · 0 评论 -
指针变量的类型及含义——小结
参考书籍《C程序设计(第四版)》谭浩强把变量名抹去就是他们的类型了当指针遇上二维数组时,就常常老鼠,老虎,傻傻分不清楚了。小zz根据教材总结了以下几点:例如:int a[3][4]={.......}1. a[i] :指向i行0列元素地址; a[i]+j:指向i行j列元素地址;2. &a[i]:指向i行首地址; &a[i]+j:指向i+j...原创 2015-04-17 14:40:56 · 3038 阅读 · 0 评论