C++
文章平均质量分 70
吴正伟的博客
这个作者很懒,什么都没留下…
展开
-
C++的反思(知乎精华)
转载地址:c++的反思最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?咱们要有点娱乐精神,关于 C++的笑话数都数不清:笑话:C++是一门不吉祥的语言,据说波音公司之前用ADA为飞机硬件编程,一直用的好好的,后来招聘了一伙大学生,学生们说我靠还在用这么落后的语言,然后换成C++重构后飞机就坠毁了原创 2015-07-21 11:23:01 · 7793 阅读 · 8 评论 -
lambda表达式详解
表达式定义:[ capture-list ] ( params ) mutable(optional) exception attribute -> ret { body } (1) [ capture-list ] ( params ) -> ret { body } (2) [ capture-list ] ( params ) { body } (3)原创 2015-04-17 17:02:05 · 720 阅读 · 0 评论 -
function对象使用使用详解
模板类function是一个通用的多态函数包装器,它的实例可以存储、拷贝并调用任何可调用对象- 函数、lambda表达式、bind表达式等其他函数对象。还可以是成员函数指针或数据成员的指针。对空的function实例调用将会抛出std::bad_function_call异常。#include <iostream>#include <functional>int main(){ std:原创 2015-04-16 21:01:17 · 825 阅读 · 0 评论 -
STL 中的 set 使用自定义比较运算符
set 容器模版需要3个泛型参数,如下:template<class T, class C, class A> class set;第一个T 是元素类型,必选; 第二个C 指定元素比较方式,缺省为 Less<T>, 即使用 < 符号比较; 第三个A 指定空间分配对象,一般使用默认类型。因此: (1) 如果第2个泛型参数你使用默认值的话,你的自定义元素类型需要重载 < 运算操作; (2) 如果原创 2015-04-15 20:34:09 · 1717 阅读 · 0 评论 -
STL 之 set 使用详解
使用set和multiset前包含头文件<set>set、multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素。他们都是有序集合。 std::set is an associative container(关联容器) that contains a sorted set of unique objects of type Key. Sorting is原创 2015-04-15 19:57:56 · 1431 阅读 · 0 评论 -
教你怎样知道C++类库中,各种各样的类的功能和用法
cppreference.com涉及主流编译器对C++11和C++14新特性的支持分析,各种语言特性、各种头文件,概念、容器、类库、STL、原子操作、线程库和正则等。重度推荐 — cppreference.comcplusplus.com这个主要偏重与对示例代码的展示,上面的偏重库的说明,这里注重实用。cplusplue.com对不熟悉的库或者函数,有这两个网站,应该足够了。标准库头文件(中文)原创 2015-04-08 23:27:40 · 1424 阅读 · 0 评论 -
bind-函数调用包装器-详解
在头文件functional中定义,函数模板生成函数调用包装器。template< class F, class... Args >/*unspecified*/ bind( F&& f, Args&&... args ); (1) (since C++11)template< class R, class F, class... Args >/*unspecified*/ bind( F&&原创 2015-04-18 09:35:03 · 864 阅读 · 0 评论 -
RAII(资源获取即初始化)详解
概念使用局部对象管理资源的技术通常称为“资源获取就是初始化”Resource Acquisition Is Initialization 机制是Bjarne Stroustrup首先提出的。要解决的是这样一个问题:在C++中,如果在这个程序段结束时需要完成一些资源释放工作,那么正常情况下自然是没有什么问题,但是当一个异常抛出时,释放资源的语句就不会被执行。于是Bjarne Stroustrup就想到原创 2015-04-10 16:05:42 · 1981 阅读 · 0 评论 -
C++ 新标准下的强制类型转换详解
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。static_cast用法:static_cast<type_id> (expression)该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:用于类层次结构中基类和派生类之间指针或引用的转换 进行原创 2015-04-01 16:33:28 · 746 阅读 · 0 评论 -
详解C++ 类的前置声明的使用
刚开始学习c++的人都会遇到这样的问题: 定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样://a.h #include "b.h" class A { .... private: B b; }; //另一个头文件 b.h #include "a.h" class B {原创 2015-03-20 16:15:30 · 940 阅读 · 0 评论 -
C++ 中 strcpy、strcpy_s、strncpy、strlcpy的异同
strncpy的用法:它与strcpy的不同之处就在于复制n个字符,而不是把所有字符拷贝(包括结尾'\0')。函数原型:char * strncpy(char *dst,const char * src, int n)当src的长度小于n时,dst内的未复制空间用'\0'填充。否则,复制n个字符到dst,没有加'\0'。这里就要注意在字符串dst结尾处理加'\0'的情况了strcpy ,strncp原创 2015-04-25 14:53:44 · 1670 阅读 · 1 评论 -
typedef和typename关键字
类型说明typedef类型说明的格式为:typedef 类型 定义名;类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。例如: 用下面语句定义整型数的新名字:typedef int SIGNED_INT;使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定义整型变量。例如: SIGNED_INT i, j;(与i原创 2015-05-03 11:06:05 · 739 阅读 · 0 评论 -
#详解C++中的指针与引用
指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此介绍一下指针和引用,力争将最真实的一面展现给大家。1、指针和引用的定义在深入介绍之前我们首先来看一下指针和引用的定义、指针和引用的区别,然后分别针对指针和引用展开讨论,深入细节为何有这些差异。指针的权威定义: In a declaration原创 2015-05-14 10:31:29 · 652 阅读 · 0 评论 -
g++ 编译选项
g++ 编译参数详解介绍代码编译过程分为:预处理,生成.i文件编译,转换成汇编语言, 生成.s文件将汇编代码转换成机器码,生成.o文件链接目标代码,生成可执行程序总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello wo原创 2015-08-26 14:06:53 · 2347 阅读 · 0 评论 -
构造函数为什么不能是虚函数
从存储空间角度看虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角度虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用原创 2015-06-08 23:00:30 · 975 阅读 · 0 评论 -
C++中的虚析构函数、纯虚析构函数详解
C++中析构函数可以为纯虚函数吗?众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?class CBase{ public: CBase() { printf("CBase()\n"); } virtual ~CBase原创 2015-06-08 22:03:48 · 3549 阅读 · 0 评论 -
C++11并发编程-条件变量(condition_variable)详解
<condition_variable >头文件主要包含了与条件变量相关的类和函数。相关的类包括 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。std::condition_variabl原创 2015-06-25 16:34:22 · 3027 阅读 · 0 评论 -
STL-map中的插入操作详解
首先,我们可以如下使用map://#include <map>map<string, int> simap;map[string("hou")] = 1;map[string("hou")] = 2;pair<string, int> value(string("ha"), 5);simap.insert(value);先看insert操作的源码: pair<iterator,bool> i原创 2015-05-22 10:40:40 · 1394 阅读 · 0 评论 -
笔记(const)
常量#include <iostream>using namespace std;int main(){ int i = 12; const int ci = 12; const volatile int *ip2 = &i; cout << *ip2 << endl; i = 14; cout << *ip2 << endl; retu原创 2015-05-31 11:24:54 · 654 阅读 · 0 评论 -
重载,重写(覆盖)和隐藏的区别
重载重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。class A{public: void test(int i); void test(double i); void test(int i, double j); void test(dou原创 2015-05-31 15:36:31 · 898 阅读 · 1 评论 -
原始字符串字面量
原始字符串字面量(raw string literal)是可以横跨多行代码的字符串字面量,不需要转义嵌入的双引号,像\t和\n这种转义序列不按照转义序列的方式处理,而是按照普通文本的方式处理。如果像下面这样编写普通的字符串字面量,那么会收到一个编译器错误,因为字符串包含了未转义的引号:string str = "Hello "World"!"; // Error! 对于普通的字符串,必须转义双原创 2015-06-17 08:53:26 · 1311 阅读 · 0 评论 -
使用C++11中的遍历工具
处理日期和时间的chromo库duration表示一段时间间隔,表示几秒、几分钟等。typedef duration<Rep, ratio<60,1>> minutes;typedef duration<Rep, ratio<1,1>> seconeds;typedef duration<Rep, ratio<1,1000>> milliseconds;Rep表示时间数值,ratio表示时原创 2015-06-16 11:14:49 · 870 阅读 · 0 评论 -
减少C++代码编译时间的方法
c++ 的代码包含头文件和实现文件两部分, 头文件一般是提供给别人(也叫客户)使用的, 但是一旦头文件发生改变,不管多小的变化,所有引用他的文件就必须重新编译,编译就要花时间,假如你做的工程比较大(比如二次封装chrome这类的开发),重新编译一次的时间就会浪费上班的大部分时间,这样干了一天挺累的, 但是你的老板说你没有产出,结果你被fired, 是不是很怨啊, 如果你早点看到这段文章,你就会比你的原创 2015-03-20 16:01:59 · 737 阅读 · 0 评论 -
std::sort源码剖析
文章参考:源码这篇文章在一个偶然的机会看到,我原先也是知道sort函数效率高,但终究没有去了解原因,读了这篇文章更加钦佩C++大师积年累月智慧的结晶和对效率的极致追求,看到很多地方不禁暗暗称奇。也还是感慨原文作者对技术的追求和细致的讲解,下面的内容大多来自作者的文章,其中加入了自己的理解,也不枉费大半个下午的时间。从事程序设计行业的朋友一定对排序不陌生,它从我们刚刚接触数据结构课程开始便伴随我们左右原创 2015-03-04 15:44:38 · 1164 阅读 · 0 评论 -
为什么c++中函数指针是16字节
当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小。例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录:Pushes and pops on the stack are always in 8-byte strides, and pointers are 8 bytes wide.从 CPU 的角度来看,指针无非就是内存原创 2015-02-16 18:46:44 · 745 阅读 · 0 评论 -
C/C++中变量的分配和在内存中的存储方式
操作系统与C语言中的堆栈及其区别CSDNC/C++一个由C/C++编译的程序占用的内存分为以下几个部分 1. 栈区(stack)— 由编译器自动分配释放,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。 2. 堆区(heap)— 由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似原创 2015-01-15 14:01:07 · 1607 阅读 · 0 评论 -
(每日算法)LeetCode --- Decode Ways
A message containing letters from A-Z is being encoded to numbers using the following mapping:'A' -> 1'B' -> 2...'Z' -> 26Given an encoded message containing digits, determine the total nu原创 2015-01-13 21:31:06 · 599 阅读 · 0 评论 -
宏定义的优缺点
其实在用VC编程的时候就会遇到很多宏定义,尤其是类似LONG,LPCTSTR等等之类的,它们属于微软的自定义类型,但其本质上还是属于C/C++里面的那几个标准类型。那用宏定义到底有什么好处呢?先来看一下宏的定义:用#define命令将一个指定的标识符(即宏名)来代表一个字符串。它的一般型式为:#define 表示符 字符串#define命令属于“预处理命令”中的一种。它是由C原创 2015-02-02 10:23:56 · 1500 阅读 · 0 评论 -
(每日算法)LeetCode -- Merge Sorted Array (合并有序数组)
Given two sorted integer arrays A and B, merge B into A as one sorted array.Note:You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from原创 2015-01-12 20:42:13 · 816 阅读 · 0 评论 -
Effective C++ (笔记) : 条款01 -- 条款04
条款01:视C++为一个语言联邦条款02:尽量以const,enum,inline替换#define"宁可以编译器替换预处理器",使用#define那么在编译器之前预处理器已经完成了替换,记号名称没有进入记号表(symbol table),所以在调试或者编译错误的时候会莫名其妙。以常量替换宏是个好主意:const double AspectRatio = 1.653替换原创 2015-01-09 11:11:57 · 685 阅读 · 0 评论 -
为什么 构造函数、内联函数、静态函数和友元函数不能是虚函数
构造函数为什么不能是虚函数C++从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。简单来说就是:虚函数的执行依赖于虚函数表。而虚函数表在原创 2015-01-08 21:33:31 · 2411 阅读 · 0 评论 -
为什么基类指针和引用可以指向派生类对象,但是反过来不行?
详细解释了基类指针和引用指向派生类的原理和内存布局的结构。对动态调用和静态调用详细说明,对虚函数的实现原理和多态的关键以及final、override的使用环境进行了说明。原创 2015-01-06 16:30:04 · 2211 阅读 · 3 评论 -
C++ static 、extern以及全局变量之间的相关逻辑
全局变量,就是指那些定义在函数之外的变量,当然也是定义在类之外的变量。(1)全局变量会被自动初始化,函数中的变量不会被自动初始化,类中定义的那些成员变量(内建)也不会自动初始化。那么这里有一个疑问,为什么要这样设置?并且为什么,在进程内存区中,分为初始化了的全局变量、静态变量,和未初始化的全局、静态变量。(2)全局变量如果加上static关键字,事情将会变得很奇妙。原创 2014-11-06 19:44:34 · 822 阅读 · 0 评论 -
(每日算法)leetcode--Text Justification(格式化字符串)
给定一组字符串,按照给定长度(eg.16)格式化显示,使每一行尽可能多的单词,单词之间的空格均衡-最左侧可以稍多左右对齐。最后一行靠左对齐,即最右侧可以没有但系。Given an array of words and a length L, format the text such that each line has exactly L characters and is ful原创 2014-11-11 21:22:40 · 1009 阅读 · 0 评论 -
关于typedef的用法总结
typedef 声明,简称typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。定义类型别名定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。char* pa, pb; // 这原创 2015-01-16 13:52:24 · 652 阅读 · 0 评论 -
Effective C++ (笔记) : 条款05 -- 条款10
条款05:了解C++默默编写并调用哪些函数编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。只有这些函数需要(被调用)时,它们才会被编译器创建出来。在编译器产生的复制构造函数和赋值运算符执行的都是浅拷贝。当数据成员是引用或者常量的时候,编译器不知道该怎么处理,两手一摊,无能为力。当某个基类将cop原创 2015-01-17 11:01:18 · 736 阅读 · 0 评论 -
const、volatile、mutable的用法
const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如:const int nValue;原创 2015-01-20 15:49:19 · 795 阅读 · 0 评论 -
存储中的大端模式和小端模式详解
什么是大端,什么是小端:所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。为什么会有大小端:为什么会有大小端模式之分呢?这是因为在计算机存储系统中,我们是以字节为单位进行管理的,每个内存中的地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,原创 2015-02-28 16:21:14 · 1322 阅读 · 0 评论 -
Effective C++ (笔记) : 条款18 -- 条款23
条款18:让接口容易被正确使用,不易被误用在(参数)类型上客户不知道怎么使用的时候,可以导入简单的“外覆”类型来区别参数。也就是,自定义数据类型,使客户明确调用相关的类型,防止误用。尽量让自定义类型的行为和内置类型的行为相同,因为客户会想当然的和使用内置类型一样使用自定义类型,这也就是上面说的让接口容易被正确的使用。STL容器的接口十分一致,这也是他们非常容易使用的一个原因。原创 2015-01-25 15:31:02 · 707 阅读 · 0 评论 -
C++ 虚函数表解析
转自陈浩的博客前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里原创 2015-02-16 23:09:46 · 664 阅读 · 0 评论