C++学习笔记
文章平均质量分 91
主要内容是本人在学习C++编程的一些读书笔记,包括了C++中一些重要知识点的总结和个人的心得体会,希望能和大家一起交流,共同进步!
神奕
这个作者很懒,什么都没留下…
展开
-
C++学习之构造函数中的异常处理
构造函数中可不可以抛出异常?当然可以。从语法上来说,是可以的;从实际情况来看,现在的软件系统日渐庞大和复杂,很难保证 Constructor 在执行过程中完全不发生一点异常。那么,如果构造函数中抛出异常,会发生什么情况呢?一、构造函数中抛出异常将导致对象的析构函数不被执行。C++仅能 delete 被完全构造的对象(fully constructed objects),只有原创 2015-03-15 13:36:42 · 7022 阅读 · 2 评论 -
C/C++内存对齐
一、什么是内存对齐内存对齐(Memory alignment),也叫字节对齐。现代计算机中内存空间都是按照 byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。举一个简单的例子,uint32_t所占内存空间为 4原创 2014-09-23 10:02:00 · 1490 阅读 · 2 评论 -
C++进阶之虚函数表
C++通过继承(inheritance)和虚函数(virtual function)来实现多态性。所谓多态,简单地说就是,将基类的指针或引用绑定到子类的实例,然后通过基类的指针或引用调用实际子类的成员函数(虚函数)。本文将介绍单继承、多重继承下虚函数的实现机制。一、虚函数表为了支持虚函数机制,编译器为每一个拥有虚函数的类的实例创建了一个虚函数表(virtual table),这个表中有许多原创 2014-09-02 08:30:02 · 1381 阅读 · 1 评论 -
C++学习之普通函数指针与成员函数指针
函数指针(function pointer)是通过指向函数的指针间接调用函数。相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生。我最近也被问到了这方面的问题,心中却也没有清晰的答案。故决定去查阅资料,并按照自己的思路写下这篇学习总结。一、普通函数指针通常我们所说的函数指针指的是指向一般普通函数的指针。和其他指针一样,函数指针指向某种特定类型,所有被原创 2014-08-03 01:10:28 · 3387 阅读 · 0 评论 -
C++学习之动态数组类的封装
动态数组(Dynamic Array)是指动态分配的、可以根据需求动态增长占用内存的数组。为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用、内存分配策略、类的四大函数(构造函数、拷贝构造函数、拷贝赋值运算符、析构函数)、运算符的重载。涉及到的知识点很多,鉴于本人水平有限,在这里只做简单的介绍。一、内存分配策略当用new为一个动态数组申请一块内存时,数组中的元素原创 2014-07-29 17:03:25 · 9376 阅读 · 2 评论 -
C++学习之new与delete、malloc与free
在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。这篇文章仅仅是浅显的讲一下,仅供参考。一、new和deletenew和delete是C++的运算符,用于动态分配内存和释放内存。new表达式标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内原创 2014-07-26 01:55:41 · 2660 阅读 · 0 评论 -
C++学习之命名空间
在C++中,命名空间(namespace)的目的是为了防止名字冲突。每个命名空间是一个作用域,在所有命名空间之外,还存在一个全局命名空间(global namespace),全局命名空间以隐式的方式声明,它并没有名字。在命名空间机制中,原来的全局变量,就是位于全局命名空间中(可以用::member的形式表示)。一、定义命名空间1、每个命名空间都是一个作用域和其他作用域类似,在命名空间中原创 2014-07-25 19:04:58 · 1452 阅读 · 0 评论 -
C++学习之模板特例化
模板是C++中一个很重要的特性,写一份代码能用于多种数据类型(包括用户自定义类型)。例如,STL的sort()函数可以用于多种数据类型的排序,类stack可以用作多种数据类型的栈。但是,如果我们想对特定的数据类型执行不同的代码(而不是通用模板)呢?这种情况下就可以使用模板特例化(template specialization)。一、函数模板特例化当特例化一个函数模板时,必须为原模板中的原创 2014-07-23 08:52:12 · 10614 阅读 · 4 评论 -
C++学习之可变参数的函数与模板
所谓可变参数指的是函数的参数个数可变,参数类型不定的函数。为了编写能处理不同数量实参的函数,C++11提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标准库类型;如果实参的类型不同,我们可以编写可变参数模板。另外,C++还有一种特殊的省略符形参,可以用它传递可变数量的实参,不过这种一般只用于与C函数交互的接口程序。一、可变参数函数1、init原创 2014-07-22 16:29:44 · 2186 阅读 · 0 评论 -
C++学习之函数模板与类模板
泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思。泛型编程最初诞生于C++中,目的是为了实现C++的STL(标准模板库)。模板(template)是泛型编程的基础,一个模板就是一个创建类或函数的蓝图或公式。例如,当使用一个vector这样的泛型类型或者find这样的泛型函数时,我们提供足够的信原创 2014-07-18 23:40:31 · 1545 阅读 · 0 评论 -
C++学习之多重继承与虚继承
一、多重继承我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分。同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义成员的子对象。下面是一个多重继承关系:原创 2014-07-17 22:40:11 · 1525 阅读 · 1 评论 -
C++学习之继承中的访问控制
我们通常认为一个类有两种不同的用户:普通用户 和 类的实现者。其中,普通用户编写的代码使用类的对象,这部分代码只能访问类的公有(接口)成员;实现者则负责编写类的成员和友元的代码,成员和友元既能访问类的公有部分,也能访问类的私有部分。如果进一步考虑继承的话就会出现第三种用户,即派生类。派生类可以访问基类的公有(public)成员和受保护(protected)成员,但不能访问基类的私有(private原创 2014-07-16 21:15:57 · 1464 阅读 · 0 评论 -
C++学习之虚函数与纯虚函数
面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象。虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体原创 2014-07-16 02:05:19 · 3172 阅读 · 0 评论 -
C++学习之extern "C"
我们知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。另外,extern还可以与”C”连用,作为链接指示。一、C++名字修饰(Name Mangling)这就要从C++的重载说起了,在C++中函数重载指的是几个函数的函数名相同,参数列表不同。那么当生成obj中间文件/目标原创 2014-07-04 23:39:51 · 1256 阅读 · 0 评论 -
C++与C的那些差异
虽说C++是向后兼容C的,但C++与C还是存在许多差异。这里举了几个例子,也是我们很容易忽略的地方。如果你还知道其他的更多的Differences,或者发现什么错误,可以评论告诉我,大家一起学习进步。另外,随着学习的进行,本文会持续更新……C编译通过但C++编译不通过原创 2014-07-04 19:56:55 · 1205 阅读 · 0 评论 -
Ubuntu安装新版GCC并启用C++11
C++11,(即ISO/IEC 14882:2011),是目前的C++编程语言的最新正式标准。它取代了第二版标准(第一版公开于1998年,第二版于2003年更新,分别通称C++98以及C++03,两者差异很小)。新的标准包含核心语言的新机能,而且扩展C++标准程序库。C++11新标准由C++标准委员会于2011年8月12日公布,并于2011年9月出版。此次标准为C++98发布后13年来第一次重大修原创 2014-03-24 13:39:24 · 41041 阅读 · 5 评论