
15 C++语言技术晋升
文章平均质量分 83
15 C++语言技术晋升
隨意的風
从事10+年的技术开发,结交天下软件研发朋友,共同探讨技术、共同进步。
展开
-
C++语言之重载运算符()/[]/++/->等运算符
operator操作符一文包括两种用法,一种是operatoroverloading(操作符重载),一种是operatorcasting(操作隐式转换)。这是C++和pascal扩展运算符功能的方法,虽然样子古怪,但也可以理解一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。为什么使用操作符重载?上面注意说明了利用operator关键字进行一些操作符的重新定义,使之更加满足自己业务的需要。httpshttpshttps。...原创 2018-07-04 11:11:17 · 2741 阅读 · 3 评论 -
__STL_TRY和__STL_UNWIND这两个宏的意思
void fill_initialize(size_type n, const T& value) { empty_initialize(); __STL_TRY { insert(begin(), n, value); } __STL_UNWIND(clear(); put_node(node)); }这是stl中fill_initialize的源代码...原创 2018-07-04 10:57:09 · 1035 阅读 · 0 评论 -
C ++ 拷贝构造函数和赋值构造函数 非常经典
C++ 拷贝构造函数 赋值构造函数拷贝构造函数和赋值构造函数的异同由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了...原创 2018-07-03 15:55:19 · 3738 阅读 · 0 评论 -
std::string源码探秘和性能分析
std::string源码探秘和性能分析2016年05月05日 22:15:15阅读数:6613 std::string源码探秘和性能分析本文主要讲c++标准库的string的内部实现,以及对象拷贝的性能分析。文中采用的源码版本为gcc-4.9,测试环境为centos7, x86_64,涉及到指针等数据类型的大小也假定是在64环...原创 2018-07-03 14:42:49 · 819 阅读 · 0 评论 -
C++11之多线程: unique_lock详解
目录1.unique_lock取代lock_guard2. unique_lock的第二个参数2.1 std::adopt_lock2.2 std::try_to_lock2.3 std::defer_lock3. unique_lock的成员函数3.1 lock(),加锁3.2 unlock(),解锁3.3 try_lock()3.4 release()4. unique_lock所有权的传递1.unique_lock取代lock_guarduni.原创 2020-11-11 16:16:08 · 6750 阅读 · 2 评论 -
C++11 std::move和std::forward讲解
C++11引入的几个规则,如引用折叠、右值引用的特殊类型推断规则、static_cast的扩展功能说起,然后通过例子解析std::move和std::forward的推导解析过程,说明std::move和std::forward本质就是一个转换函数,std::move执行到右值的无条件转换,std::forward执行到右值的有条件转换,在参数都是右值时,二者就是等价的。其实std::move和s...原创 2020-03-30 11:47:51 · 842 阅读 · 0 评论 -
C++11变长模板解析(深入理解C++11)
参考自:深入理解C++11变长模版:变长函数和变长的模版参数变长函数:double sum(int n, ...)//求n个double数据之和{double sum = 0;va_list args;//接受输入数据的数据结构,需声明stdarg.h,va_start(args, n); //初...原创 2019-07-08 16:44:21 · 566 阅读 · 0 评论 -
C++ 重定义(父子类),(virtual虚)函数重写(覆盖)(父子类)、重载(同一类)
====================================================||欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业)====================================================||一、重定义-父子类重定义是指子类中重新定义了父类中的同名函数。(函数三要素:返回类型,函数名,参...原创 2019-01-19 17:31:21 · 3245 阅读 · 0 评论 -
const成员函数可以修改static成员变量
原创 2018-08-27 17:08:02 · 2543 阅读 · 2 评论 -
STL容器的适用情况和缺点
====================================================||欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业)====================================================||一.各种容器的特性vector 序列容器,C++标准严格要求次容器的实现内存必须是连续的,...原创 2018-08-27 16:53:58 · 1298 阅读 · 0 评论 -
基类和子类中虚函数的参数默认值值不同的情况
====================================================||欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业)====================================================||1.虚函数中的默认值根据输出结果,可以看到最终调用的是子类的fun()函数,并且使用了基类函...原创 2018-08-27 16:41:11 · 2856 阅读 · 0 评论 -
C++类中const, static, reference等类型成员的初始化
有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:a. 常量型成员变量(const)b. 引用型成员变量 (&)c. 静态成员变量 (static)d. 整型静态常量成员变量 static const inte. 非整型静态常量成员变量 static const double1. 常量型成员初始化:只能...原创 2018-07-27 14:53:54 · 3276 阅读 · 0 评论 -
内存寻址:逻辑地址到物理地址转化
我们知道,在计算机里,内存分为虚拟内存和物理内存。 数据是存放在物理内存中的,而程序中使用的是虚拟内存并通过虚拟内存地址来访问数据和代码的,那么操作系统是如何 将虚拟内存地址映射成为实际的物理内存的呢?这是我们这篇文章要详细介绍的问题。以X86的32位系统为例。如下图所示,在目前的32位的系统中,系统的内存虚拟地址范围为4GB。 其中低2GB主要为应用程序使用(Ring3级别),而高2GB...原创 2018-07-21 17:45:47 · 3899 阅读 · 1 评论 -
C/C++中strlen的用法
strlenstrlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。 原型:extern unsigned int strlen(char *s);,在Visual C++ 6.0中,原型为si...原创 2018-07-12 15:13:52 · 3039 阅读 · 0 评论 -
C/C++ 设计模式:关于使用typeid时要注意的问题
typeid可以获取到一个对象或引用的确切类型,这在多态编程下非常有用。要使用typeid,首先确保你的编译器开启了运行时类型检查(RTTI)。在visual studio中打开该项目的"属性页" -> "C/C++" -> "语言"修改"启用运行时类型信息"属性为是即可今天在测试typeid的使用时,写了小段代码测试class Base {}; class Derived : pu...原创 2018-07-06 10:56:10 · 1264 阅读 · 1 评论 -
C++创建类对象时(无参)后不加括号与加括号的区别
在不考虑用new动态创建对象的情况下,用最普通的类名 对象名(参数);的方法创建对象先贴上最正常最普通的代码#include<iostream>using namespace std;class C{public: C(){ cout<<"Hello C++\n"; }; C(int m){ cout<&...原创 2018-07-05 15:01:20 · 10817 阅读 · 3 评论 -
理解C++的链接:C++内链接与外链接的意义
上一篇博客给大家解释了“程序运行链接”的概念与意义,并区分了动态链接库与静态链接库。接下来想和大家谈一下C++的内链接与外链接的区别与意义。看完之后,希望你能理解以下几个问题~1. 为什么不要在头文件中定义具有外部链接的实体?2. 在头文件中定义具有内部链接的实体有什么劣势?3. 内部链接与外部链...原创 2018-07-05 10:49:36 · 371 阅读 · 0 评论 -
Const用法总结(快速区分指针常量与常量指针)
想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助。有时候我们希望定义一种常量,它的值不能被修改,这个常量既可以防止程序其他地方不小心修改这个值,也能让程序员比较方便的调整这个值的大小。以往我们很容易想到#define宏定义,现在使用const是个更为不错的选择,因为它有类型,可以进行类型检查。 第一...原创 2018-07-05 11:08:28 · 555 阅读 · 0 评论 -
C++ 运算符重载讲解与经典实例
C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如: class complex { public: complex(double r=0.0,double I=0.0){real=r;imag=I;} void display(); private: double real; double imag; }; com...原创 2018-07-04 11:13:34 · 381 阅读 · 0 评论 -
C++ operator关键字(重载操作符)
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。 一、为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只支持基本数据类型和...原创 2018-07-04 10:53:52 · 7769 阅读 · 0 评论 -
C++ 堆内存管理
auto_ptr的缺陷在很早的C++98之前,C++用"auto_ptr"智能指针来管理堆分配的内存,它的使用非常简单:auto_ptr<int> ap(new int(1024));即将new操作返回的指针作为auto_ptr的初始值,不用调用delete即可实现堆内存的自动释放(如析构的时候)。由于auto_ptr本身存在一些问题,它在C++11中...原创 2018-06-27 11:06:45 · 500 阅读 · 0 评论 -
c++中string类的源代码
一:回顾(1)c++中的string类是在面试中和笔试中经常考的题目; 工程代码免费下载 string类的自行实现(2)c++中的string类和fstream类合起来是处理外部数据的利器;(3)string类经常用到find find_first_of find_first_not_of find_last_of find_last_not_of substr replace等,以及联合使用来达...原创 2018-06-26 15:58:13 · 6834 阅读 · 3 评论 -
【C++】拷贝构造函数和赋值符函数
在C++中,调用拷贝构造函数有三种情况:1.一个对象作为函数参数,以值传递的方式传入函数体.2.一个对象作为函数返回值,以值传递的方式从函数返回.3.一个对象用于给另外一个对象进行初始化(复制初始化).拷贝构造函数必须以引用的形式传递(参数为引用值).其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的调用来生成函数中的对象.这样会导致无限循环地调用拷贝构造函数,直至栈溢出.以...原创 2018-06-26 15:16:27 · 194 阅读 · 0 评论 -
g++编译支持c++11的方法
//第一种,直接包含在源程序文件中,如第一行代码所示 #pragma GCC diagnostic error "-std=c++11" #include <iostream> using namespace std; int main(int argc,char **argv) { cout<<"hello world!"<<endl; ...原创 2018-06-26 13:26:40 · 507 阅读 · 0 评论 -
头文件的包含以及命名空间的引入尽量写在cpp里
1,头文件尽量包含在cpp文件里,而不是h文件里放在.cpp文件中是比较安全的,文件在多次递归包含后很容易出现一些定义和声明上的问题。放在cpp中可以减小头文件依赖,可以提高编译速度。所以,能放在cpp中的,就不要放在h中。只有头文件必须用到的放到头文件,头文件中可以使用前置声明来代替。或者所有cpp都用到的也可以放到头文件。哪里用到就放哪里,谁用谁包含。一般是默认放在cpp里,之后如果出现.h也...原创 2018-06-21 17:21:36 · 577 阅读 · 0 评论 -
如何防止头文件被重复包含或引用?
#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include "x.h"#include "x.h"显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:#include "a.h"#include "b.h"看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在此也同样被包含了两次,只不过它的形式...原创 2018-06-21 17:17:19 · 1793 阅读 · 1 评论 -
C++/C++11中std::set用法汇总
一个容器就是一些特定类型对象的集合。顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。与之相对的,有序和无序关联容器,则根据关键字的值来存储元素。 标准库还提供了三种容器适配器,分别为容器操作定义了不同的接口,来与容器类型适配:stack、queue和priority_queue。适配器(a...原创 2018-06-21 10:38:08 · 18800 阅读 · 0 评论 -
通过函数的入口地址来调用函数
例程:int i; //定义一个测试变量void test() //定义一个函数{i = 6; //给测试变量赋初值}int main(){int addr; //定义一个保存地址的变量addr = (int)test; //将函数test的函数入口地址存入addr((void(*)(int))addr)(0); //根据函数入口地址调用test函数//((void(*)(void))addr)(...原创 2018-06-12 09:30:27 · 12635 阅读 · 0 评论 -
C语言实现程序跳转到绝对地址0x100000处执行
嵌入式笔试题:想让程序跳转到绝对地址0x100000处执行,该如何做?网上看到有如下答案:*((void(*)(void))0x100000)();经过在VC++6.0和LINUX gcc4.4.3下测试,均不能通过编译。VC++6.0报错:error C2100: illegal indirectionGCC报错:error: void value not ignored as it ought...转载 2018-06-12 09:29:29 · 638 阅读 · 0 评论 -
C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧
1、方法一要对绝对地址0x100000赋值,我们可以用 (unsigned int * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? *((void (*)( ))0x100000 ) ( ); 首先要将0x100000强制转换成函数指针,即: (void (*...原创 2018-06-12 09:27:45 · 9394 阅读 · 2 评论 -
printf如何输出64位整数
关于printf函数输出64位数的问题,其实在window下和linux下是不一样的: linux下是printf("%lld/n",a);printf("%llu/n",a); windows下是printf("%I64d/n",a);printf("%I64u/n",a); 完整程序如下:[cpp] view plain copy [zcm@c #51]$cat a.c // linux平...原创 2018-06-12 09:22:45 · 10828 阅读 · 0 评论 -
怎样将成员函数指针强制转换成void*指针
采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned*,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void*的问题也随之可解,如下示例:/* VS2003下编译运行 */class AbstractMethod{public: virtual void show(){} // = 0; // 可以是纯虚函数,这里为了测...原创 2018-06-12 09:22:10 · 6426 阅读 · 0 评论 -
void*和类成员函数指针的相互转换
linux环境下,强地址转换会在O3的时候出问题正确的代码如下,#include <stdio.h>#include <stdlib.h>#include <new>#include <string.h>class class1{public: class1() { b = 10; } int memfunc1(...原创 2018-06-12 09:20:16 · 2047 阅读 · 0 评论 -
函数指针函数名转换成内存地址调用
1、 (*(void(*) ())0)();这是《C Traps and Pitfalls》这本经典的书中的一个例子。第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。第二步:(void(*) ())0x46EF01,这是将0x0046EF01强制转换为函数指针类型,0x0046EF01是一个地址,也就是说一个函数存在...原创 2018-06-12 09:19:00 · 1332 阅读 · 0 评论 -
可变参数及可变参数宏的使用
我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,这里将介绍可变函数的写法以及原理.* 1. 可变参数的宏一般在调试打印Debug 信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC 也支持可变参数宏, 但是两种在细节上可能存在区别.1. __VA_ARGS____VA_ARGS__ 将"..."...原创 2018-06-12 09:15:19 · 4113 阅读 · 2 评论 -
C语言-函数指针与函数名的区别***
记得大学时老师曾说函数的函数名是函数的入口的指针,之前看block通过clang编译生成的C代码发现很多函数指针,于是想了解函数指针与函数名有什么区别?以及函数指针一般都有些什么作用。函数指针与函数名的区别首先先定义一函数以及一个指向盖函数的函数指针,并分别对他们进行调用。//VS 2017void fun(int& x);//定义函数f...原创 2018-06-11 13:48:46 · 7624 阅读 · 1 评论 -
如何输出类的非静态成员函数地址
首先我们定义一个类Ctest,类里面包含三个不同形式的成员函数,静态成员函数statFunc()、动态成员函数dynFunc()和虚拟函数virtFunc()。在main函数中我们利用cout标准输出流分别输出这三个函数的地址,程序如下所示: [cpp] view plain copy #include <iostream> #include <stdio.h> ...原创 2018-06-11 09:09:53 · 634 阅读 · 0 评论 -
静态方法不能调用非静态变量,非静态方法可以引用静态变量
为什么静态方法不能调用非静态变量,非静态方法可以引用静态变量?理由很简单,静态方法不属于对象,是属于类的,是不需要实例化的,而非静态变量是属于对象的,需要先实例化。在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。相反,非静态方法是可以引用静态变量的。因为静态变量是存储在静态内存单元内,可以直接用类进...原创 2018-06-08 16:36:58 · 2721 阅读 · 0 评论 -
C++11新特性之std::function
博客《吐血整理C++11新特性》描述了一些C++11带来的新的特性,但是不够全面。在实际工作中,用到了std::function来实现回调函数。所以写该博客做一个简要补充。类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函...原创 2018-06-08 15:41:55 · 642 阅读 · 0 评论 -
C++11 新特性: unordered_map 与 map 的对比
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。所以使用时map的key需要定义operator<...原创 2018-06-08 14:42:05 · 5085 阅读 · 1 评论