随笔分类 - C++
摘要:const 指针与指向const的指针 当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。 先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。 const int* p; (推荐) int const* p; 第一种可以理解为...
阅读全文
摘要:一、C语言中的malloc/calloc/realloc/valloc/alloca/memalign函数: 这样的内存分配函数在内存分配失败时都返回空指针,因此,在调用返回时,检查返回值的方法比较简单,只需要与空指针比较即可; 如: char* p = (char*)malloc(1204); if(p == NULL) { ...
阅读全文
摘要:正确使用stl map的erase方法 STL的map表里有一个erase方法用来从一个map中删除掉指令的节点 eg: map<string,string> mapTest; typedef map<string,string>::iterator ITER; ITER iter=mapTest.find(key); mapTest.erase(iter...
阅读全文
摘要:vector由于key是顺序增长的整数,所以无法提供高效的按value查找的函数。使用vector进行查找时,要借助find. vector<int>::iterator p; p=find(v.begin(),v.end(),a); if(p!=v.end())cout<<"we find the number: "<<*p<<endl; elsecout<<"...
阅读全文
摘要:1、用一个已存在的对象去构造一个不存在的对象(构造之前不存在),就是拷贝构造。用一个已存在的对象去覆盖另一个已存在的对象,就是赋值运算。 String(const char *str = NULL);// 普通构造函数 String(const String &other); // 拷贝构造函数 拷贝构造函数将在对象传值,返回值,抛出异常中被调用。 2、“引用”不可能...
阅读全文
摘要:已知类String的原型为: class String { public: String(const char *str = NULL);// 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operator =(const String &...
阅读全文
摘要:1、首先将vector排序。sort(vecSrc.begin(), vecSrc.end() );2、然后使用unique算法。vecSrc.erase(unique(vecSrc.begin(), vecSrc.end() ), vecSrc.end() );unique返回值是重复元素的开始位置。如果vector中存储的元素是自定义的结构或者是类,那么就需要重载操作符。3、根据类的某一个成员变量排序或者比较。sort算法需要重载"<"操作符。unique算法需要重载"=="操作符。操作符重载的示例如下:View Code class CTes
阅读全文
摘要:string类的push_back的应用-按字符存储数据示例View Code #include <iostream>#include <fstream>#include <string>using namespace std;int main (){ string str; ifstream file("F:\\log.txt",ios::in); while (!file.eof()) { str.push_back(file.get()); } cout << str; return 0;}
阅读全文
摘要:c_str()返回的指针保证指向一个size()+1长的空间,而且最后一个字符肯定'\0'。而data返回的指针则保证指向一个size()长度的空间,有没有null-terminate不保证,可能有,可能没有,看库的实现了。 c_str()返回的是C风格的字符串的首地址,而data()返回的是字符数组的首地址。 程序中,只在需要时才使用c_str()或者data()得到字...
阅读全文
摘要:数字与字符的相互转换,通常情况下atoi,itoa,但是,这有两个问题,一是: (1)只能是int与char的转换,也就是说,数据最大值应当小于2G。 (2)在linux中,没有itoa。 那么如何解决数据最大值大于2G,及大于2G后数值型数据与字符间的转换呢? (1)从数值数据转换成字符型数据,sprintf unsigned int low = 4294967295; sprintf(lin...
阅读全文
摘要:首先要明确一点:当我们调用new表达式时,做两件事:使用operator new()分配内存,然后调用构造函数。在delete中调用析构函数,然后用operator delete()释放内存。大家都知道new对应于delete,new[]对应于delete[]。可以实际应用中,倒底有什么区别?现在作一说明。1、内置类型如char *pc = new[10];对于内置类型来说,可以认为delete与delete[]没有区别。使用new[]分配的内存,同样可以通过delete来释放。这是因为,pc 指针所指的前一个字节保存了分配数据的大小,如下所示:[10][0][0][0][0][0][0][.
阅读全文
摘要:1、标准库还提供了丰富的支持未格式化IO的低级操作,这些操作使我们能够将流作为未解释的字节序列处理,而不是作为数据类型(如char,int,string等)的序列处理。2、单字节操作几个未格式化的操作一次一个字节地处理流,它们不忽略空白地读。示例代码#include <iostream>#include "string"#include "cmath"#include "iomanip"using namespace std;int main(){ //默认情况下,输入操作符忽略空白 while(cin >>
阅读全文
摘要:1、除了条件状态之外,每个iostream对象还维持一个控制IO格式化细节的状态。如整形值的基数,浮点值的精度,输出元素的宽度等。标准库还定义了一组操纵符来修改对象的格式状态。操纵符(manipulator)是可用作输入或输出运算符的操作数,它是一个函数或对象(a manipulator is a function or object that can be used as an operand([计]操作数;运算对象) to an input or output operator(运算符).)。操纵符返回其应用于的流对象,所以可以在一个语句中输出多个操纵符和数据。2、操纵符罗列表1 iost
阅读全文
摘要:1、程序可以从一个机器容易得移植到其他机器,则称此程序是可移植的。C语言是可移植的。当然,C语言也定义了一些固有的不可移植的特性:1)算术类型的大小随机器不同而变化。C++另外两个从C语言继承来的不可移植的特性:位域和volatile限定符(这两个特性使与硬件的直接通信更容易),链接批示(使得可以链接到用其他语言编写的程序)。2、位域 位域(bit-field):来保存选定的位数。当程序需要将二进制数据传递给另一个程序或硬件设备的时候,通常使用位域。位域在内存中的布局是机器相关的。位域必须是整形数据类型,可以是signed或unsigned。http://www.cnblogs.com/myd
阅读全文
摘要:1、联合(union)是一种特殊的类。一个union对象可以有多个数据成员,但是任何时刻,只有一个成员可以有值。当将一个值赋给union对象的一个成员的时候,其他所有成员都变为未定义的。每个 union 对象的大小在编译时是固定的:至少与最大数据成员的一样大。2、union不能作为基类使用,所以成员函数不能为虚函数。union不能具有静态数据成员或引用成员,而且,union不能具有定义了构造函数,析构函数或赋值操作符的类类型的成员。3、默认情况下,union对象是未初始化的。可以用与显式初始化、简单类对象一样的方法显式初始化union对象。但是,只能为第一个成员提供初始化式,通过一对花括号。通
阅读全文
摘要:1、在一个类内部再定义另外一个类,这样的类称为嵌套类(nested class),也称为嵌套类型(nested type)。嵌套类最常用于执行类。嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的。嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员。示例代码template <class Type> class Queue{ //interface functions to Queue are unchangedprivate: //public members are ok: QueueItem is a pri
阅读全文
摘要:1、成员指针(pointer to member)包含类的类型以及成员的类型。成员指针只应用于类的非static成员。static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针。通过指定函数的返回类型,形参表(类型和数目,是否为const)和所属类来定义成员函数的指针。2、使用类成员的指针 类似于成员访问操作符 . 和 ->,.* 和 -> 是两个新的操作符,它们使我们能够将成员指针绑定到实际对象。这两个操作符的左操作数必须是类类型的对象或类类型的指针,右操作数是该类型的成员指针。• 成员指针解引用操作符(.*)从对象或引用获
阅读全文
摘要:1、通过运行时类型识别,程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。通过以下两种操作符提供RTTI:1)typeid操作符,返回指针或引用所指对象的实际类型。2)dynamic_cast操作符,将基类类型的引用或指针安全地转换为派生类型的指针或引用。这些操作符只为带有一个或多个虚函数的类返回动态类型信息,对于其他类型,返回静态(即编译时)类型的信息。对于带虚函数的类,在运行时执行RTTI操作符,但对于其他类型,在编译时计算RTTI操作符。2、使用动态强制类型转换要小心,只要有可能,定义和使用虚函数比直接接管类型管理好得多。3、dynamic_cast操作符1)可以使
阅读全文
摘要:9、正如定位new(placement new expression)表达式是使用allocator类的construct成员的低级选择,可以使用析构函数的显式调用作为调用destroy函数的低级选择。示例代码 for (T *p = first_free; p != elements; /*empty*/) alloc.destroy(--p); //上式表达与下式表达等价 p->~T();10、显式调用析构函数是清除对象本身,并没有释放对象所占的内存;调用operator delete函数不会运行析构函数,它只释放指定的内存。11、类通过定义自己的名为operator new和ope
阅读全文
摘要:1、C++的内存分配是一种类型操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象。new表达式自动运行合适的构造函数来初始化动态分配的类类型对象。2、在每种情况下(预先分配内存以保存用户级(user-level objects)对象或者保存类的内部数据)都需要将内存分配与对象构造分离开。3、对未构造的内存中的对象进行赋值而不是初始化,其行为是未定义的。对许多类而言,这样做引起运行时崩溃。4、C++提供下面两种方法分配和释放未构造的原始内存。1)allocator 类,它提供可感知类型(type-aware)的内存分配。这个类支持一个抽象接口,以分配内存并随后使用该内存保存对
阅读全文