一步步学习C++
C++作为一门较为成熟重量级的语言,吸引了许许多多编程学习者,它广泛应用于网络、通讯、图像、游戏、硬件驱动、嵌入式等行业。C/C++入门虽难,但知识更新速度远没有Java、.Net快,是一门“一朝学习,受用终生”的技术。
Mike江
A goal is not always meant to be reached, it often serves simply as something to aim at. ──Bruce Lee
目标不一定是需要达到的,目标往往只是用来帮助你瞄准方向。──李小龙
展开
-
C++11新特性学习
1、什么是C+11C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages -- C++成为C++语言...原创 2017-09-03 15:07:50 · 136182 阅读 · 4 评论 -
C++11:std::move和std::forward
标准库函数 std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。int a;int &&r1 = a; // 编译失原创 2017-08-14 11:15:12 · 7290 阅读 · 0 评论 -
C++11:移动语义
为什么需要移动语义#include <iostream>using namespace std;class Test{public: Test(int a = 0) {//普通构造函数 d = new int(a); cout << "构造函数\n"; } Test(const Test & tmp) {//拷贝构造函数原创 2017-08-14 10:58:42 · 10825 阅读 · 0 评论 -
C++11:右值引用
左值、右值在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右值”。如:int b = 1;int c = 2;int a = a + b;在这个赋值表达式中,a就是一个左值,而b + c则是一个右值。不过C++中还有一个被广泛认同的说法,那就是可以取地址的、有名字的就原创 2017-08-14 10:36:09 · 4538 阅读 · 0 评论 -
VS开发人员命令界面查看C++类内存布局
基本使用方法VS 编译器(这里使用的是:VS 2013)可以通过”开发人员命令提示“查看 C++ 类的内存布局,非常有用。双击”VS2013 开发人员命令提示“,出现如下界面: 进入测试代码所在的目录: 测试代码如下:#include <iostream>using namespace std;class Tmp{public: static int fun() {原创 2016-07-28 14:16:19 · 17293 阅读 · 2 评论 -
C++11 中defaulted 和 deleted 函数
defaulted 函数背景问题C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。示例 1: class X { private: int a;转载 2016-05-22 21:27:35 · 2080 阅读 · 1 评论 -
C++进阶学习——单向链表的实现
示例代码如下:#include using namespace std;class Node //节点类{public: //普通构造函数:无参数,带1个参数,带2个参数 Node(){} Node(int n){ num = n; next = NULL; } Node(int n, Node *p){ num = n; next = p; } void setNum(i原创 2015-11-06 17:00:07 · 3409 阅读 · 0 评论 -
C++入门学习——虚函数表介绍
C++动态多态性是通过虚函数来实现的,虚函数允许子类(派生类)重新定义父类(基类)成员函数,而子类(派生类)重新定义父类(基类)虚函数的做法称为覆盖(override),或者称为重写。C++ 中的虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的,简称为V-Table。每个含有虚函数的类有一张虚函数表,表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针。 没有虚函数的C++类,是不会有虚函数表的。原创 2015-10-19 18:02:58 · 16128 阅读 · 2 评论 -
C++入门学习——explicit关键字的作用
C++语言定义了内置类型之间的几个自动转换。也可以定义如何将其他类型的对象隐式转换为我们的类类型, 或将我们的类类型的对象隐式转换为其他类型。C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。通常,除非有明显的理由想要定义隐式转换,否则,单形参构造函数应该为 explicit。将构造函数设置为explicit可以避免错误,并且当转换有用时原创 2015-10-13 12:46:19 · 2371 阅读 · 3 评论 -
C++通过jsoncpp类库读写JSON文件
JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择。JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/。本教程选择第三方库jsoncpp来解析json, jsoncpp是比较出名的c++解析库,在...转载 2015-09-29 19:08:28 · 71111 阅读 · 5 评论 -
C++进阶学习——线程基类的设计(Linux)
此示例是在Linux环境下(使用Linux系统编程线程相关函数)测试,文件说明如下:ThreadBase.cpp, ThreadBase.h为线程基类ThreadDerive.cpp, ThreadDerive.h为测试派生类main.cpp为测试程序ThreadBase.h内容如下:#ifndef __THREADBASE_H__#define __THREADBASE_H__#includ原创 2015-09-29 18:37:14 · 21604 阅读 · 3 评论 -
C++进阶学习——单例模式的实现
单例模式也称为单件模式、单子模式,是使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做In原创 2015-09-29 18:19:29 · 10614 阅读 · 1 评论 -
浅谈C++多态性
那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。原创 2015-09-29 17:57:42 · 1708 阅读 · 1 评论 -
C++通过TinyXML类库读写XML文件
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。原创 2015-09-21 18:28:06 · 23559 阅读 · 2 评论 -
C++入门学习——标准模板库之map
map 是 STL 的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在 map 中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里简单说一下 map 内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有原创 2015-09-16 18:59:35 · 4018 阅读 · 1 评论 -
C++入门学习——标准库 string 类的使用
在 C++ 中,为了方便处理字符串,引入了 string 类。string 类型支持长度可变的字符串。使用 string 之前,必须包含相应的头文件,string 属于 std 命名域的,因此需要通过命名限定:#include using std::string; //using namespace std;string 类提供了向前和向后遍历的迭代器 iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。用 string::iterator 或 string::c原创 2015-07-13 23:01:12 · 1881 阅读 · 0 评论 -
C++入门学习——标准模板库之vector
vector(向量容器),是 C++ 中十分有用一个容器。vector 之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector 是一个能够存放任意类型的动态数组,能够增加和压缩数据。使用 vector 之前,必须包含相应的头文件,vector 属于 std 命名域的,因此需要通过命名限定:#include using std::vect原创 2015-06-25 16:21:38 · 4134 阅读 · 0 评论 -
C++入门学习——模板
现在,我们再重新审视上述的 max() 函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不全面而带来的调用错误(如,我们分别定义了 char a,b; 那么在执行 max(a,b) 时 程序就会出错,因为我们没有定义char 类型的重载版本)。为解决上述问题 C++ 引入模板机制:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。原创 2015-06-24 20:33:51 · 1531 阅读 · 0 评论 -
从面向过程到面向对象
从 IBM 公司的约翰·巴库斯在 1957 年开发出世界上第一个高级程序设计语言 Fortran 至今,高级程序设计语言的发展已经经历了整整半个世纪。在这期间,程序设计语言主要经历了从面向过程(如 C 和 Pascal 语言)到面向对象(如:C++、Java、Objective-C),再到面向组件编程(如 .NET 平台下的 C# 语言),以及正在快速发展的面向服务架构技术(如 SOA 和 WebService)。翻译 2015-05-27 14:12:02 · 36989 阅读 · 1 评论 -
delete p和delete[] p的区别
operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式: void* operator new (size_t); // allocate an object void* operator new [] (size_t); // allocate an array原创 2012-12-13 15:54:38 · 1461 阅读 · 0 评论 -
重载、隐藏和重写(有的书叫“覆盖”)的区别?
1) 重载的特征: a) 相同的范围(在同一个类中) b) 函数名字必须相同 c) 参数不同(指参数类型不同,或参数个数不同,或两者皆有) d) virtual关键字可有可无 例子如下:class Base{public:void fun(void);int fun(int a);int fun(double b原创 2012-12-06 11:51:54 · 1602 阅读 · 1 评论 -
为什么要学习C++
语言之争是程序员永远不会疲倦的闲暇话题,初学者的语言选择也是大家所津津乐道的。回望这几年,随着Android, ios的来势汹汹,不少初学者都喜欢以Java, Objective-C作为自己的第一门语言。在这样的大环境之下,讨论 C++ 还有什么意义么?在瞎扯这个问题之前,我们先来看看为啥初学者都选择Java, Objective-C。估计原因很简单,就是入门容易。当然,这容易是相对于转载 2015-01-28 20:21:50 · 2270 阅读 · 1 评论 -
C语言与C++不得不说的那点事
说到C语言,就不得不说它的继承者——C++语言。众所周知,C++语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。虽然因为天然的血缘关系,导致两者非常相似,就像父亲与儿子相貌相似一样,但是,父亲和儿子毕竟是两个不同的各自独立的个体,而C语言和C++语言也同样转载 2015-01-29 13:55:49 · 1933 阅读 · 2 评论 -
C语言入门学习——函数的使用
程序就像公司,公司是由部门组成的,这个部门就类似于C程序的函数。默认情况下,公司就是一个大部门( 只有一个部门的情况下 ),相当于C程序的main()函数。如果公司比较小( 程序比较小 ),因为任务少而简单,一个部门即可( main()函数 )胜任。但是,如果这个公司很大( 大型应用程序 ),任务多而杂,如果只是一个部门管理( 相当于没有部门,没有分工 ),我们可想而知,公司管理、运营起来会有多混乱,不是说这样不可以运营,只是这样不完美而已,如果根据公司要求分成一个个部门( 根据功能封装一个一个函数原创 2015-03-10 17:11:45 · 3353 阅读 · 0 评论 -
C++入门学习——标准模板库( STL )概述
一、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码从广义上讲分为三类:algorithm(转载 2015-02-05 12:07:55 · 1535 阅读 · 0 评论 -
C++著名程序库的比较和学习经验
在 C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论。现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重 量级的都有。不少都是让人眼界大开,亦或是望而生叹的思维杰作。由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解。所以文中所提的一些库都是比 较著名的大型库。 1、C++各大有名转载 2015-02-05 11:29:23 · 2110 阅读 · 1 评论 -
如何学好c++
昨天写了一篇如何学好C语言,就有人回复问我如何学好C++,所以,我把我个人的一些学习经验写在这里,希望对大家有用。首先,因为如何学好C语言中谈到了算法和系统,所以这里就只谈C++语言。C++是最难的语言。这个世界上最难的编程语言可能非C++莫属了。你千万不要以为几天就可以学好C++,C++的学习曲线是相当BT的,你可以看看这篇文章。C++是一门很自由的语言,自由到了有点BT和恐怖的地步转载 2012-12-06 11:48:49 · 2848 阅读 · 3 评论