C++动态申请二维数组
摘要:动态申请数组,在C/C++编程之中也算是比较常见的操作,动态申请一维数组相信列位也都能从书中找到,但对于动态申请二维数组,似乎书中甚少提及,不过没关系,看完本文之后我们对于这个操作也就能有个清晰的认识了。下面我们进入正文:动态申请一维数组的方法很简单,我们都知道数组是一段连续的内存空间,所以只要我们拥有数组首地址,那我们就能对数组元素逐个访问,而数组名有时是被解释为数组首地址(指针)的,基于这个事实,我们就可以得到:int*p_arr=newint[10];//如此,我们就成功地动态申请得到了一维数组//new操作返回数组首地址,用一个指针保存有了上述的解释,或许有人就会进行以下的操作:int
阅读全文
命名的强制类型转换
摘要:有些时候,我们需要在代码中执行与此类似的操作: int i, j; double k = i / j;但我们都知道,这样的操作得来的结果是不正确的,根据隐式类型转换规则,它得到的结果将是舍弃小数点后的部分再转换为double类型的值。由此,难道我们的代码中需要做相除操作的地方只能统一定义为浮点类型么?答案是否定的,我们还可以通过显式类型转换得到预期的结果!比如: int i, j; double k = (double)i / j;对i进行显式类型转换之后,若要进行计算,则需要i,j类型一致,j就将被隐式转换为double类型,如此,计算就得到正确结果。 或许,很多人都习惯了这种强制转换的用.
阅读全文
sizeof运算符
摘要:sizeof运算符,我们在很多地方都能看到它的身影,或许我们看到的更多的是诸如sizeof(int)这样的形式,但有时,我们也会看到sizeof p; 这样的形式,对于第一种,我们从字面都理解了它的意思,但第二种或许会让你有些犯迷糊,它是获取p的大小,还是p的类型的大小呢?对于这个问题,我们还是先对sizeof先有个清楚的认识吧,下面就开始对sizeof进行简单介绍: sizeof运算符,用于计算并返回一个类型名或一个表达式大小,其返回值类型为size_t(一种机器相关的无符号整型,其值被设计得足以表示内存中任意对象的大小)。sizeof有两种形式: 1.sizeof (type);2.siz
阅读全文
C++11特性——基于范围的for语句
摘要:在使用标准库容器时,我们常常需要进行遍历操作,而我们用以遍历的方法一般就是使用迭代器(对于某些特殊容器,我们还可以使用索引进行遍历)。在C++11标准推出之前,或许这些办法都还比较方便,但现在,C++11赋予了我们一种更简单的遍历方法——范围for(range for),范围for主要用于对某种序列进行遍历操作。 范围for,是一种基于“范围”的for语句,所谓范围:即是我们能够明确指出起始点和终点,位于起始点与终点之间的区域就是范围。比如vector,它具有begin和end,而在begin和end之间的区域,则是它所包含的元素。范围for的形式如下: for (declaration :.
阅读全文
指针与const
摘要:指针,在C/C++中无疑是个老生常谈的问题,也是个非常复杂的问题,其复杂程度我们可以从《征服C指针》和《C和指针》这两本专门介绍指针的好书中了解。本文主要是对指针与const的用法、联系做个简单介绍,更多深入的内容还是需要参考上述两书。好了,下面转入正题: 指针,与引用类型一般,都属于复合类型(基于其他类型定义的类型,此处的其他类型不仅仅指内建类型,也指类类型)。指针与引用也有某些相似点:1.都依托于其他类型的对象才具有实际意义(空指针与未明确指向或指向无效数据的指针不能进行操作,此处的实际意义指可以进行操作);2.对两者的某些操作,都可以直接反映到两者所指对象之上。当然,两者是有一点明显区.
阅读全文
引用与const(二)
摘要:因为有了const,所以当我们的程序中有多处需要一个常量时,我们可以使用const定义常量,而舍弃不好追踪的#define。而使用const定义的变量,它仍然是变量,只是不允许对其修改了。既然它是一个变量,一个实体,那我们就能够定义它的引用。好的,我们用如下代码对它及其引用进行定义: const int value = 0; int &refValue = value; 编译一下,我们发现,编译器报错了!编译器告诉我们,用const int类型来初始化int&是无效的。为何?我们来做个简单的分析吧:我们将value定义为const int,旨在防止代码中无意的修改造成某些不可预
阅读全文
引用与const(一)
摘要:翻看了几天李普曼大师的书后,不得不说,大师就是大师,对于细节的理解及解释都非常人可比。看完有关引用的一小部分知识,从前对引用的理解盲区渐渐被填补,现在本文中对一些简单的引用知识进行梳理记录。下面转入正题: 引用,即是为一个对象起了另一个名字,引用类型则是引用另一种类型。从定义,我们就可以了解到某些性质:1.既然是为对象起了另一个名字,那引用从某个角度上来看,就能够代表其所指的那个对象,如此,我们对引用执行的它能够执行的合法操作,都将反映到其所指对象之上; 2.引用类型是用来引用另一种类型,没有指向引用的引用。 使用引用,我们当然需要先定义它,定义方法很简单。首先,我们需要先明确我们是要定义指.
阅读全文
来自沉思录的深思——复制构造函数默认、深浅复制之谈
摘要:我曾经小觑复制构造函数,认为它简单得和赋值一般,今天看完沉思录第四章,我沉默了。我现在只能说,它确实充满了太多我不曾了解的东西。 首先,我们需要知道的是,我们什么时候需要写一个复制构造函数呢?或许有人会说,不用写,不写不是也照样可以执行直接初始化么。对的,这是可行的。我们可以通过一段代码来观察这个现象: 1 class Test 2 { 3 private: 4 protected: 5 public: 6 int _num; 7 8 Test() 9 {10 this->_num = 0;11 }12 13 Test...
阅读全文
来自沉思录的深思——引用之利
摘要:C++程序设计中,我们总是需要根据各种需要去设计各种不同的接口、类等,因此数据成员也就成了我们的常客,同时这也引发了这样的一个问题:私有or公有。对于这个问题,或许没有十分具有说服力的答案,各有各理,但这并不是今日讨论的焦点。今日主题在于:如何更好地处理私有与公有。 在使用STL中的vector时,我们能够清楚地感受到它的便利,也了解了它类似一个可变长的动态数组。vector提供了一个方法size(),通过它,我们可以清楚地知道当前vector对象的具体大小(含有多少个数据元素)。由此,我们不难发现,vector内部实现将表示具体大小的数据成员设为了私有,而通过一个公有方法去获取它的值。这是一
阅读全文
善用虚析构函数
摘要:一个好的C++程序,应有一套谨慎的逻辑结构,一套严密的资源管理方法。其中资源管理总是最容易出现纰漏的地方,很多时候我们会忽略一个或多个delete/operator delete,或者我们写了清理代码,却没意识到它可能不会被执行。第一种情况自不必多说,而第二种情况可能就让人有些疑惑了。既然我写了它用来清理不需要的资源,那我必然会显式调用它或者编译器会自动调用它,怎么还能说不会被执行呢?对于这种情况,我能想到的有两种可能: 1.使用多态性操作时,它被忽略了; 2.异常影响了调用。 对于第一点,我们可以先来分析一段代码: 1 class base 2 { 3 private: 4 protecte
阅读全文
STL六大组件 功能及其运用
摘要:STL作为C++标准程序库的大脉系,在C++中使用频率较高,使用方便,也因其实现的高效性、普适性,越来越多人已经不满足于简单的运用了,更多的是想去学习、研究其实现的内部原理。对此,我们就需要对STL的大体结构有一个简单的了解,了解基本结构之后,我们将可以针对各个结构进行一定学习、研究。下面就开始介绍STL的基本结构: STL提供了六大组件,彼此可以组合套用: 1.容器(Containers): 各种数据结构,如vector, list, deque, set, map等,可以用来存放数据。从实现角度来看,STL容器其实就是一种模版类。2.算法(algorithms): 包含各种常用算法,如s.
阅读全文