
C++语言
文章平均质量分 84
C++基础,C++面向对象程序设计,C++设计模式
haozlee
多年linux开发经验,熟悉c++,python。个人主页:https://leehao.me
展开
-
CMake 入门教程
文章 CMake 语言 15 分钟入门教程 介绍了 CMake 语言的基础知识,本文在此基础上,进一步说明说明如何利用 CMake 生成 Makefile,并实现编译安装功能。CMake 除了可以生成 Makefile 外,还可以生成以下 IDE 的编译文件:XcodeVisual StudioCodeBlocksEclipseCMake 生成可执行文件先来看如何利用 CMake 编译单个 .cpp 源文件。需要编译的 main.cpp#include <iostream>原创 2020-11-29 10:18:32 · 2681 阅读 · 0 评论 -
CMake 语言 15 分钟入门教程
cmake 是一个跨平台的编译安装工具,可以用简单的语句来描述所有平台的编译安装过程。本文介绍 cmake 的基础语法。第一个例子使用任意的文本编辑器,输入:message("Hello world!") 然后保存为 hello.txt 文本文件,执行:cmake -P hello.txt输出:Hello world!所有变量都是字符串在 cmake 中,所有变量都是字符串。可以使用 ${} 来引用一个变量。例如,修改 hello.txt :message("Hello $原创 2020-11-18 13:35:56 · 1787 阅读 · 0 评论 -
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 评论 -
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 评论 -
make命令与makefile文件
一、多个源文件带来的问题在编写c/c++测试程序时,我们习惯每次修改一处代码,然后就马上编译运行来查看运行的结果。这种编译方式对于小程序来说是没有多大问题的,可对于大型程序来说,由于包含了大量的源文件,如果每次改动一个地方都需要编译所有的源文件,这个简单的直接编译所有源文件方式对程序员来说简直是噩耗。 我们看一个例子:// main.c#include "a.h"// 2.c#include原创 2017-03-29 21:30:05 · 2828 阅读 · 0 评论 -
记一次程序优化记录
忙了几个月的项目终于在生产环境上上线,虽然接下来还有不少工作需要跟进,但终究不像上段时间那么忙了,因此也就能利用周末的时间,对之前优化程序性能的过程作下记录,也当是个小小的经验总结。程序的应用场景是往 Redis 写入具有大量记录的二维表,或者从 Redis 读取具有大量记录的二维表数据。由于二维表的记录数量巨大,比如有些二维表的记录数达几十万条,因此对于程序的性能有较高的要求。程序使用 hired原创 2017-08-13 13:35:31 · 898 阅读 · 0 评论 -
C++ Pointer-Like Classes,C++的指针类
所谓pointer-like class(指针类),是指一个类被设计成像指针一样,可以当成指针来使用。为什么有了传统的指针还需要指针类?这是由于我们想在指针的基础上多做一点东西,或者说,我们想对指针有更多的控制。下面介绍两类常见的指针类:智能指针和迭代器。智能指针对于传统的指针,我们可以使用两个操作符,即*解引用操作符,->调用成员操作符。一个类要设计成智能指针类,则也要提供这两个操作。这可以通过对原创 2016-02-15 23:13:52 · 3688 阅读 · 0 评论 -
C++转换函数
一、conversion function, 转换函数转换函数(conversion function)是一种特殊类型的类成员函数。它定义了一个由用户定义的转换,以便把一个类对象转换成某种其他的类型。 在类的声明中,通过指定关键字operator,并在其后加上转换的目标类型后,我们就可以声明转换函数。1. 特点转换函数采用如下的一般形式: operator type() 这里的type原创 2017-01-05 21:21:53 · 11187 阅读 · 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 · 21685 阅读 · 8 评论 -
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 · 15877 阅读 · 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 评论 -
漫谈C++里的“引用”
引用“&”是C++新增的概念,注意这里的“&”并不是“取地址”的含义。引用(reference)简单的说就是一个对象的别名。用对象来初始化引用后,那么对象的名字或引用的名字都指向(refer to)该对象,如:int a=10;int& ra=a; //ra是a的别名人们常常会将引用和指针混淆,原因大概是因为C++编译器通常是采用指针的方式去实现引用的。但引用并不是指针。引用与指针的比较如下:1原创 2008-02-15 11:54:00 · 1263 阅读 · 0 评论 -
C++虚函数表解析(转)
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的转载 2010-06-26 16:38:00 · 970 阅读 · 1 评论 -
C++ STL set::find的用法
上次面阿里巴巴。面试官问了我这样一个问题,“C++ STL中的set是如何实现的”。当时只答了二叉树,回来查下书,原来一般是红黑树,后悔没好好记住啊。。。接着,面试官又考了我一道这样的编程题:定义一个Student结构体,包括name和age等数据,要求编程实习在set中查找一个name == "张三", age == 13的操作。本来set自己用得不多,当时一下懵了。回来查阅《C++原创 2011-04-04 23:06:00 · 103237 阅读 · 11 评论 -
C/C++使用心得:enum与int的相互转换
如何正确理解enum类型?例如:enum Color { red, white, blue}; Color x;我们应说x是Color类型的,而不应将x理解成enumeration类型,更不应将其理解成int类型。 我们再看enumeration类原创 2011-09-27 13:03:38 · 137883 阅读 · 2 评论 -
C++的const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如,const char blank = ‘’;blank = ‘\n’; // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。为了保证const对象的常量性,编译器须区分不安全与安全的成员函数原创 2013-03-04 18:00:42 · 101448 阅读 · 17 评论 -
以对象管理资源——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 评论 -
C++转型操作符
在C语言里面,使用括号加类型这种方式进行类型转换,我们将此转型操作符为旧式转型操作符。旧式转型操作符具有不少缺点。首先是职责不明确。旧式转型操作符几乎允许你将任何类型转换为任何其他类型,出错的概率也相应增加。其次是旧式转型操作符难以辨识。旧式转型操作符使用小括号进行类型转换,而小括号在C++的任何其他地方都可能使用,这导致人们难以辨识某个程序是否使用了转型操作。C++则提供了四种职责明确的新型原创 2013-07-27 18:52:02 · 1443 阅读 · 0 评论 -
删除STL容器元素的方法
STL中,要删除容器内的一个元素,其方法会随着容器类型的不同而不同。一、删除特定值的元素1. 序列容器2. 关联容器二、删除满足特定条件的元素1. 序列容器2. 关联容器原创 2014-04-05 17:17:00 · 2780 阅读 · 1 评论 -
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++的Pimpl惯用法解析
Pimpl(pointer to implementation, 指向实现的指针)是一种常用的,用来对“类的接口与实现”进行解耦的方法。这个技巧可以避免在头文件中暴露私有细节(见下图1),因此是促进API接口与实现保持完全分离的重要机制。但是Pimpl并不是严格意义上的设计模式(它是受制于C++特定限制的变通方案),这种惯用法可以看作桥接设计模式的一种特例。图1: Pimpl惯用法,这里的公有类拥有原创 2015-08-30 19:55:06 · 18603 阅读 · 8 评论