C++基础知识
文章平均质量分 75
Caroline0071
这个作者很懒,什么都没留下…
展开
-
面向对象的知识要点
1、面向对象技术的基本概念对象、类和继承2原创 2014-06-03 11:01:28 · 1207 阅读 · 0 评论 -
explicit constructor(显示构造函数)
按照默认规定,只有一个参数的构造函数也定义le转载 2014-07-09 11:37:21 · 3324 阅读 · 0 评论 -
动态数组索引越界问题
1、在C++中,可以采用几种不同的方法创建一个某种类型T的对象的数组。3种常用的方法如下:#define N 10 //数组的长度N在编译时已知 T static_array[10]; int n = 20; //数组的长度n是在运行时计算的 T* dynamic_array = new T[n]; std::vector vector_array; //数组的长度可以在运原创 2014-07-10 21:11:14 · 2992 阅读 · 0 评论 -
无效的指针、引用和迭代器
首先以示例代码为例:vector v;//添加一些元素fir(int i=0; i<10; ++i) v.push_back(i);int* my_favorite_element_ptr = &v[3];cout<<"My favorite element = "<<(*my_favorite_element_ptr)<<endl;cout<<"Its address = "原创 2014-07-11 17:40:55 · 1653 阅读 · 0 评论 -
C语言中连接器介绍
在C语言中,一个重要的思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合到一起。但是连接器一般是与C编译器分离的,连接器如何做到把若干个C源程序合并成一个整体呢?原创 2014-06-22 11:14:45 · 6666 阅读 · 0 评论 -
C语言中的声明与定义的区别
1、对于下面的声明语句int a; 如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0)。2、又如下面的声明语原创 2014-06-23 08:54:55 · 4449 阅读 · 0 评论 -
作用域指针(三)
作用域指针当我们并不打算复制智能指针,只是想保证被分配的资源将被正确地回收,可以采用一种简单得多的解决方案:作用域指针。如下示例代码:template class ScopedPtr{public: explicit ScopedPtr(T* p = NULL) :ptr_(p) { } ScopedPtr& operator=(T* p) { if(ptr_ !原创 2014-07-15 11:47:32 · 1815 阅读 · 0 评论 -
内存泄露(一)
内存泄露原创 2014-07-14 10:14:16 · 897 阅读 · 0 评论 -
用智能指针实行所有权
现在我们讨论下使用返回指针的函数的潜在错误。假设有一个函数返回一个指向某个MyClass类型的对象的指针。MyClass* MyFactoryClass::Create(const Inputs& inputs);这个函数的一个非常显而易见的问题是,它的调用者是否负责删除这个对象?或者说这个指针所指向的MyClass类的实例是MyFactoryClass所拥有的实例?这个问题显然应该在声明原创 2014-07-16 08:28:30 · 1757 阅读 · 1 评论 -
引用计数指针(二)
如前面内存泄露中所讲的,引用计数指针可以被复制。因此,一个智能指针的几份拷贝可以指向同一个对象。这就产生了由哪份拷贝负责删除它们共同指向的对象这个问题。答案是这组智能指针中最后消亡的那个将删除它所指向的对象。这类似于家居规则:“最后一个离开屋子的人负责关灯。”为了实现这个算法,这些指针共享一个计数器,记录有多少个智能指针引用同一个对象,即“引用计数”这个术语的由来。引用计数的应用范围很广:这个术语原创 2014-07-14 17:07:55 · 1613 阅读 · 0 评论 -
静态数组的索引越界问题
1、静态数组处理静态数组:#define N 10 //数组的长度N在编译时已知 T static_array[N];这里,数组的长度在编译时是已知的并且不会改变。当然,为了使用具有边界检查的安全数组,也可以vector模板,并在一个构造函数中指定它的长度:scpp::vector vect(N);它的效果与静态数组完全相同,但问题在于效率。静态数组是在堆栈上分配内存,而vec原创 2014-07-08 22:28:41 · 2119 阅读 · 0 评论 -
多维数组的索引越界问题
1、我们大都知道可以使用vector或array模板作为线性数组的实现,那么对于需要二维矩阵、三维数组(或者N维数组)时应该怎么解决。由于N维数组的基本情况中的所有问题都可以用一个二维矩阵举例说明,因此以下的讨论仅限于此,并简单的称为矩阵。如果矩阵的大小在编译时是已知的,可以很方便的把它实现为数组的数组,这个很简单。这里,我们主要把注意力集中在当矩阵的大小是在运行时计算产生,对于这种复杂的原创 2014-07-09 09:03:46 · 2239 阅读 · 0 评论 -
函数声明和运算符优先级详解
1、函数声明原创 2014-06-08 09:58:21 · 2703 阅读 · 0 评论 -
解引用NULL指针
一般导致程序崩溃的最重要原因之一就是试图解引用NULL指针。正如上几篇文章中所说的,智能指针RefCountPtr和ScopedPtr提供了运行时的诊断。但是,并不是所有的指针都是拥有某个对象所有的智能指针。因此为了对试图解引用一个不具有对象所有权的指针的行为进行诊断,引入一种并不删除它所指向的对象的“半智能”指针。例如,如下代码示例:template class Ptr{ public原创 2014-07-18 11:21:44 · 8537 阅读 · 0 评论 -
初始化的数值(int、double等)(一)
首先考虑一个具有几个构造函数的MyClass类。假设我们决定在这个类的私有部分添加一个新的数据成员,称为int_data_:class MyClass{public: MyClass() : int_data_(0) {} explicit MyClass(const Apple& apple) : int_data_(0) {} MyClass(const stri原创 2014-07-12 21:10:47 · 6827 阅读 · 0 评论 -
避免在析构函数中编写代码
上篇文章中,我们介绍了为什么应该彻底避免编写拷贝构造函数和赋值操作符。今天这篇我们讨论下为什么应该避免在析构函数中编写代码。即让析构函数为空。例如:virtual ~MyClass(){}我们用空析构函数这个术语表示花括号内没有代码的析构函数。需要编写析构函数可能有如下几个原因:在基类中,可能需要声明虚拟析构函数,这样就可以使用一个指向基类的指针指向一个派生类的实例原创 2014-07-21 11:55:57 · 2436 阅读 · 0 评论 -
未初始化的布尔值(二)
在C++中所特有的另一种内置类型bool。它只是一种特殊情况,因为对于布尔值,我们并不需要像++这样的操作符。反之,我们需要特定的布尔操作符,例如&=和|=,因此,这个类型是单独定义的:class Bool{public: Bool(bool x=false) : data_(x) { } operator bool () const { return data_; }原创 2014-07-20 10:43:18 · 2642 阅读 · 0 评论 -
C语言中的边界计算与不对称边界(一)
C语言中的边界计算与不对称边界(一)原创 2014-06-30 21:55:12 · 2058 阅读 · 0 评论 -
拷贝构造函数和赋值操作符
假设有一个如下的MyClass类:class MyClass{public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 M原创 2014-07-19 19:29:34 · 1830 阅读 · 0 评论 -
指针和引用的差别
指针和引用d原创 2014-05-30 21:52:06 · 790 阅读 · 0 评论 -
C语言中的边界计算与不对称边界(二)
尽管C语言的数组会让新手感到麻烦,然而C语言中数组的这种特别的设计正是其最大优势所在。要理解这一点,以下是一些简单解释。 在所有常见的程序设计错误中,最难于察觉的一类是“栏杆错误”,也常被称为“差一错误”(off-by-one error)。例如这个问题:100英尺长的围栏每隔10英尺需要一根支撑用的栏杆,一共需要多少根栏杆呢?如果不加思索,大家会容易以为是100除以10,即为10原创 2014-07-06 19:03:02 · 2429 阅读 · 0 评论 -
内存分配方法与策略
在C语言中,内存被分成5个区,它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。堆:是那些由new分配的内存块,它们的释放编译器不用管,由应用程序去控制,一般一个new就要对应一个delete。加入此程序员没有释放掉,那么程序结束后,操作系统会自动回收。栈:是那些由编译器在需要的时候分配,在无须的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。自由存储区:是原创 2014-09-22 20:18:28 · 1558 阅读 · 0 评论