
C/C++
文章平均质量分 87
haozlee
多年linux开发经验,熟悉c++,python。个人主页:https://leehao.me
展开
-
C++ Lambda 学习笔记
C++ 中,对于一个对象或一个表达式,如果可以对其使用调用运算符(()),则称它是可调用的。即,如果 e 是可调用的,则可以这样使用:e(args)其中,args 是一个逗号分隔的一个或多个参数的列表。C++ 中可调用对象除了我们熟悉的函数或函数指针外,还包括函数对象以及 lambda 表达式。本文重点讲述 lambda 表达式。lambda 表达式表示一个可调用的代码单元,我们可以将...原创 2020-04-26 21:45:59 · 591 阅读 · 0 评论 -
C++ 函数对象学习笔记
函数对象本质上是一个类对象,它重载了函数调用操作符 operator()。调用操作符的函数体实现函数的功能。例如,我们定义类 LessThan:class LessThan {public: bool operator() (const string &s1, const string &s2) { return s1.size() < s2.s...原创 2020-04-26 10:48:17 · 834 阅读 · 0 评论 -
gRPC C++ 入门教程
之前曾经写过 Python 使用 gRPC 收发消息的教程,可以参考文章 《体验 gRPC 那些事儿》。最近计划在 C++ 项目中使用 gRPC,故写一篇文章来记录一下如何使用 C++ 语言来实现一个简单的 gRPC 服务端和客户端程序。本教程需要先安装 gRPC,有关 gRPC 的安装教程可以参考文章 《CentOS 7 安装 gRPC》,《体验 gRPC 那些事儿》。本文涉及的程序包括四部...原创 2020-02-01 20:38:14 · 17681 阅读 · 3 评论 -
C++虚函数表剖析
关键词:虚函数,虚表,虚表指针,动态绑定,多态一、概述为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。二、类的虚表每个包含了虚函数的类都包含一个虚表。 我们知道,当一个类(A)继承另一个类(B)时,类A会继承类B的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包原创 2016-02-18 20:28:23 · 51095 阅读 · 44 评论 -
C++ STL set::find的用法
上次面阿里巴巴。面试官问了我这样一个问题,“C++ STL中的set是如何实现的”。当时只答了二叉树,回来查下书,原来一般是红黑树,后悔没好好记住啊。。。接着,面试官又考了我一道这样的编程题:定义一个Student结构体,包括name和age等数据,要求编程实习在set中查找一个name == "张三", age == 13的操作。本来set自己用得不多,当时一下懵了。回来查阅《C++原创 2011-04-04 23:06:00 · 103230 阅读 · 11 评论 -
C++转换函数
一、conversion function, 转换函数转换函数(conversion function)是一种特殊类型的类成员函数。它定义了一个由用户定义的转换,以便把一个类对象转换成某种其他的类型。 在类的声明中,通过指定关键字operator,并在其后加上转换的目标类型后,我们就可以声明转换函数。1. 特点转换函数采用如下的一般形式: operator type() 这里的type原创 2017-01-05 21:21:53 · 11187 阅读 · 0 评论 -
删除STL容器元素的方法
STL中,要删除容器内的一个元素,其方法会随着容器类型的不同而不同。一、删除特定值的元素1. 序列容器2. 关联容器二、删除满足特定条件的元素1. 序列容器2. 关联容器原创 2014-04-05 17:17:00 · 2780 阅读 · 1 评论 -
C++ Pointer-Like Classes,C++的指针类
所谓pointer-like class(指针类),是指一个类被设计成像指针一样,可以当成指针来使用。为什么有了传统的指针还需要指针类?这是由于我们想在指针的基础上多做一点东西,或者说,我们想对指针有更多的控制。下面介绍两类常见的指针类:智能指针和迭代器。智能指针对于传统的指针,我们可以使用两个操作符,即*解引用操作符,->调用成员操作符。一个类要设计成智能指针类,则也要提供这两个操作。这可以通过对原创 2016-02-15 23:13:52 · 3688 阅读 · 0 评论 -
细说 C++ Traits Classes
最近在看侯捷的《STL源码剖析》,看到第三章有关 traits 的介绍,被搞得一头雾水,看了半天不知所云。为了彻底了解这个技法的原理,硬着头皮上网查了资料,并结合 Scott Meyers 的 《Effective C++》,总算是把 traits 的原理搞明白了:)什么是 traits?我们先来看下 C++ 之父的回答: Think of a trait as a small object w原创 2017-02-13 08:29:38 · 21683 阅读 · 8 评论 -
make命令与makefile文件
一、多个源文件带来的问题在编写c/c++测试程序时,我们习惯每次修改一处代码,然后就马上编译运行来查看运行的结果。这种编译方式对于小程序来说是没有多大问题的,可对于大型程序来说,由于包含了大量的源文件,如果每次改动一个地方都需要编译所有的源文件,这个简单的直接编译所有源文件方式对程序员来说简直是噩耗。 我们看一个例子:// main.c#include "a.h"// 2.c#include原创 2017-03-29 21:30:05 · 2828 阅读 · 0 评论 -
gSOAP 初体验
由于工作调动关系,需要了解 gSOAP 的使用,写个文章记录一下学习的心得,免得以后忘记。安装由于本人使用的是 Mac OS 系统,故以 Mac OS 为例说明如何安装 gSOAP。1)下载 gsoap可以在 https://sourceforge.net/projects/gsoap2 下载最新版本的 gsoap。2)安装 flex, bison, openssl可以使用brew install进原创 2017-04-14 08:56:20 · 5609 阅读 · 0 评论 -
C++空类的大小
C++空类的大小为什么不为0?先来看测试程序的输出。#include <iostream>using namespace std;class NoMembers{};int main(){ NoMembers n; // Object of type NoMembers. cout << "The size of an object of empty class is: "原创 2015-10-04 07:41:19 · 15876 阅读 · 1 评论 -
记一次程序优化记录
忙了几个月的项目终于在生产环境上上线,虽然接下来还有不少工作需要跟进,但终究不像上段时间那么忙了,因此也就能利用周末的时间,对之前优化程序性能的过程作下记录,也当是个小小的经验总结。程序的应用场景是往 Redis 写入具有大量记录的二维表,或者从 Redis 读取具有大量记录的二维表数据。由于二维表的记录数量巨大,比如有些二维表的记录数达几十万条,因此对于程序的性能有较高的要求。程序使用 hired原创 2017-08-13 13:35:31 · 898 阅读 · 0 评论 -
GDB 调试
GDB 是一个功能强大的调试器,也是 Linux 系统中默认的调试器。GDB 主要提供以下四种功能,这些功能可以方便我们定位程序的 BUG。启动程序设置断点检查程序运行状态,例如查看变量的值修改程序运行状态,例如修改变量的值本文简单讲述 GDB 的调试方法。我们需要调试的程序如下所示,该程序只是为了演示 GDB 的用法,并没有实际的意义。#include <iostream>using n原创 2017-10-20 13:50:01 · 1388 阅读 · 0 评论 -
CLion 实现远程调试
CLion 是 JetBrains IDE 全家桶产品之一,可以用来开发 C/C++ 项目,而 GDB 则可以用来对 C/C++ 程序进行调试。作为一款调试器,GDB 为程序开发人员提供了强大的调试功能,但却需要使用命令来执行调试操作,操作起来不是很方便。(有关 GDB 的使用,可以参考文章《GDB 调试》。)为此,CLion 不仅为程序开发人员提供了图形化的调试界面, 还提供了远程调试的功能。...原创 2019-02-16 08:29:10 · 37028 阅读 · 13 评论 -
Unicode和字符串处理
我们熟悉的ASCII码全称是美国国家信息交换标准码,它起源于20世纪50年代末,并于1967年最终定型。ASCIIS码使用7位(bit)的宽度,有26个小写字母,26个大写字母,10个数字,32个符号,33个控制码,一个空格码,共128个代码。 ASCII的使用相当普及,是一种非常可靠的标准。但是,ASCII是一个真正的美国标准,它甚至满足不了其他英语国家的需求,例如,ASCII码并原创 2013-03-19 10:04:47 · 14154 阅读 · 1 评论 -
编译防火墙——C++的Pimpl惯用法解析
Pimpl(pointer to implementation, 指向实现的指针)是一种常用的,用来对“类的接口与实现”进行解耦的方法。这个技巧可以避免在头文件中暴露私有细节(见下图1),因此是促进API接口与实现保持完全分离的重要机制。但是Pimpl并不是严格意义上的设计模式(它是受制于C++特定限制的变通方案),这种惯用法可以看作桥接设计模式的一种特例。图1: Pimpl惯用法,这里的公有类拥有原创 2015-08-30 19:55:06 · 18603 阅读 · 8 评论 -
C/C++使用心得:enum与int的相互转换
如何正确理解enum类型?例如:enum Color { red, white, blue}; Color x;我们应说x是Color类型的,而不应将x理解成enumeration类型,更不应将其理解成int类型。 我们再看enumeration类原创 2011-09-27 13:03:38 · 137870 阅读 · 2 评论 -
scanf(), getchar(), 以及gets()函数注意点
----------------------------------------------------| 问题描述一:(分析scanf()和gets()读取字符) |---------------------------------------------------- scanf(), getchar()等都是标准输入函数,一般人都会觉得这几个函数非常简单,没什么特转载 2010-12-30 11:24:00 · 2447 阅读 · 2 评论 -
动态规划求解最大字段和及其变种问题
作者:lihao21版权所有,转载请标明出处。动态规划(DP)为一常用算法思想,本文讲述如何利用DP解决常见的最大字段和及其变种问题。一、 最大字段和问题问题定义设数组为a[k],1≤k≤n,最大字段和X定义为:X直观含义即,求任一连续字数组的最大和。 问题分析不妨设:b[j]的直观含义为,以a[j]为结束元素的连续数组的最大原创 2012-01-28 09:18:30 · 5341 阅读 · 1 评论 -
字符串的全排列
《程序员面试攻略(第二版)》中第七章的一道题目。题目是这样子的:实现一个例程,打印出一个字符串字符的所有可能顺序,即,打印这个字符串中所有字符的全排列。将输入字符串中每个字符作为一个独立的字符,即使它们发生重复。对于字符串”aaa”,您的例程应该打印出6个”aaa”。递归思想可以解决。其算法的主要思路如下:如果超过了最后一个位置 打印这个字符串 返回原创 2011-10-13 10:52:24 · 1539 阅读 · 0 评论 -
C++虚函数表解析(转)
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的转载 2010-06-26 16:38:00 · 970 阅读 · 1 评论 -
构造、析构、赋值
个人觉得在C++的类中,这三个函数在什么时候调用确实有点难搞清楚。下面通过一个程序的运行结果对这几个函数进行说明。程序如下:#include iostream>using namespace std; class Object //测试类{public: Object(int i);//构造函数 Object(const Object &o原创 2008-01-23 15:31:00 · 1350 阅读 · 0 评论 -
有关虚(virtual)析构函数
记得有一次在面试的时候被问到虚析构函数的作用,当时回答得不是很好,故现在想重新整理下。先看下下面的代码:#include iostream>using namespace std;class Base{public: Base(){cout"Base::constructor is called!"endl;} ~Base(){cout"Ba原创 2007-12-07 12:39:00 · 2071 阅读 · 1 评论 -
[转]linux操作系统下c语言编程入门
linux操作系统下c语言编程入门(一)目录介绍1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 7)Linux程序设计入门--线程操作 8)Linux程序设转载 2007-05-30 01:05:00 · 2300 阅读 · 0 评论 -
C++转型操作符
在C语言里面,使用括号加类型这种方式进行类型转换,我们将此转型操作符为旧式转型操作符。旧式转型操作符具有不少缺点。首先是职责不明确。旧式转型操作符几乎允许你将任何类型转换为任何其他类型,出错的概率也相应增加。其次是旧式转型操作符难以辨识。旧式转型操作符使用小括号进行类型转换,而小括号在C++的任何其他地方都可能使用,这导致人们难以辨识某个程序是否使用了转型操作。C++则提供了四种职责明确的新型原创 2013-07-27 18:52:02 · 1443 阅读 · 0 评论 -
以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象。auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时,动态分配的对象会被自动释放。auto_ptr为动态分配内存提供了大量的便利和安全性。过使用auto_ptr,程序员不再需要关心new出来的对象何时delete,而且在子程序异常跳出时仍能保证动态分配的对象正常析构。原创 2013-09-01 21:05:15 · 2053 阅读 · 0 评论 -
定时执行某项任务 ——MFC程序设计之计时器
使用计时器只需要了解两个函数。CWnd::SetTimer用于产生以指定时间间隔发送消息的计时器,CWnd::KillTimer则消除计时器。 使用计时器的两种方法:方法一 设置计时器最简单的方法是用计时器ID和计时器时间间隔来调用SetTimer,然后WM_TIMER消息映射给OnTimer函数。例如:#define TIMER_ID1 1#define TIME原创 2013-02-24 10:42:16 · 12306 阅读 · 0 评论 -
C++使用之常量的定义
在介绍C++的常前,先看下下面的代码。for (int i = 0; i < 512; ++i) { …;}512是什么,它具有什么含义?在代码中若直接使用类似512这些“魔数”(magic number),这些数字的具体含义就不能体现出来。另外,假如程序中多处包含512这个数,随着时间的推移,发现有些512需要更改为1024,有些512需要保持不变。这种情况下原创 2013-09-15 22:43:23 · 18795 阅读 · 0 评论 -
C++的const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如,const char blank = ‘’;blank = ‘\n’; // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数原创 2013-03-04 18:00:42 · 101443 阅读 · 17 评论 -
漫谈C++里的“引用”
引用“&”是C++新增的概念,注意这里的“&”并不是“取地址”的含义。引用(reference)简单的说就是一个对象的别名。用对象来初始化引用后,那么对象的名字或引用的名字都指向(refer to)该对象,如:int a=10;int& ra=a; //ra是a的别名人们常常会将引用和指针混淆,原因大概是因为C++编译器通常是采用指针的方式去实现引用的。但引用并不是指针。引用与指针的比较如下:1原创 2008-02-15 11:54:00 · 1263 阅读 · 0 评论