C++
神游天外
这个作者很懒,什么都没留下…
展开
-
C++中的四种转换:static_cast、const_cast、reinterpret_cast、dynamic_cast
一.静态转换(static_cast)全部用于明确定义达到转换,包括编译器允许我们所做的://即转换的双方类型明确1.不用强制转换的安全变化:int --> float //可以隐式转换,并且安全2.以及不太安全但清楚定义的转换float --> int //存在精度丢失,不太安全可以发生隐式转换的就可以调用static_cast用来原创 2016-08-13 20:49:54 · 573 阅读 · 0 评论 -
动态库的编写和使用
一、动态库的编写:1.Test_Dll.h#pragma once////函数申明extern "C" int __declspec(dllexport) Add(int a, int b); int Sub(int a, int b);//__declspec(dllexport) 申明指定这个函数为动态库的导出函数//extern "C" 申明为C原创 2016-08-13 20:41:50 · 477 阅读 · 0 评论 -
静态库的编写与使用
一.静态库的编写:1.Test_Lib.h#pragma once////函数申明int Add(int a, int b);int Sub(int a, int b);int Mul(int a, int b);////类申明#define STACK_INIT_SIZE 10class Stack{public: Stack(int sz = STACK_原创 2016-08-13 20:33:17 · 454 阅读 · 0 评论 -
map的详细用法
map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有转载 2016-08-15 12:51:39 · 362 阅读 · 0 评论 -
由深拷贝与浅拷贝引发的引用计数、写时拷贝技术
一、理解深拷贝和浅拷贝:#include using namespace std;class String{public: String(const char *str = "") { if(str == NULL) { data = new char[1]; data[0] = '\0'; } else { data = new char[原创 2016-08-13 21:14:58 · 857 阅读 · 0 评论 -
C++基础:#define宏定义和inline,const,enum的区别
#defind 宏定义函数 和 inline 函数的区别:宏看起来像函数,但不会招致函数调用带了的额外开销。1.inline函数可运行调式,宏定义函数不能调试2.inline函数进行参数类型安全检查,宏定义不可以3.宏定义定义的函数可能发生错误,因为其是整体的替换,就算是带上括号也可能发生错误:#define max(a,b) f((a) >原创 2016-08-04 13:58:40 · 1024 阅读 · 0 评论 -
类模板的特化,偏特化
本文来自C++ Templates:Class Templates 的特化(Specializations)你可以针对某些特殊的模板参数,对一个类模板进行特化。类模板的特化与函数模板的重載类似,使你得以针对某些特类型进行代码优化,或修正某個特定类型在函数模板具现化中的错误行为。然而如果你对一个类模板进行特化,就必須特化其所有成元函式。虽然你可以特化某個单独的成员函式,但原创 2016-08-06 18:50:21 · 377 阅读 · 0 评论 -
重载原理分析
重载原理分析:C++函数底层实现:int max(int a,int b) ==》 _max_int_intint max(int a,int b,int c) ==》 _max_int_int_intdouble max(double a,doub原创 2016-08-05 20:38:33 · 268 阅读 · 0 评论 -
多维数组的动态开辟与释放
多维数组的动态开辟与释放:C方式:#include #include #define ROW 3#define COL 4void main(){ //申请空间 int **p = (int **)malloc(sizeof(int*)*ROW); assert(p != NULL); for(i = 0; i < ROW; ++i){ p[i] =原创 2016-08-05 18:57:50 · 219 阅读 · 0 评论 -
C++内存管理:new的实现以及模拟set_new_handler机制
内存管理:1.set_new_handler机制的运行原理:#include using namespace std;void out_of_memory(){ cout<<"out of memory!"<<endl;}int main(){ set_new_handler(out_of_memory); int *p = new int[536870911原创 2016-08-13 20:54:50 · 556 阅读 · 0 评论 -
继承与多态的应用:通用链表的实现
继承与多态的应用:通用链表的实现1.掌握继承与多态2.掌握纯虚函数与抽象类以及接口的含义3.通过多态的形式,建立与类型无关的通用链表#include #include using namespace std;class Object{public: Object() {} virtual ~Object() {}public: v原创 2016-08-13 20:57:08 · 653 阅读 · 0 评论 -
C++:Boost库_weak_ptr
【1】boost::weak_ptr:boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include便可以使用。【2】boost::weak_ptr详解:智能指针boost::scope_ptr和智能指针boost::shared_ptr就完全可以解决所有单个对象内存的管理问题。这儿咋还多出一个boo转载 2016-08-13 22:08:56 · 335 阅读 · 0 评论 -
C++:Boost库智能指针_shared_array
智能指针_shared_array: 共享智能指针(数组)shared_array 类似 shared_ptr,它包装了new[]操作符在堆上分配的动态数组,同样使用引用计数机制为动态数组提供了一个代理,可以在程序的生命周期里长期存在,知道没有任何引用后才释放内存。主要特点如下:1.构造函数接收的指针p必须是new[]的结果,而不是new表达式的结果;2原创 2016-08-13 22:00:54 · 1460 阅读 · 0 评论 -
C++:Boost库智能指针_删除器
智能指针_删除器:可以针对特殊的对象进行特殊释放#include #include using namespace std;using namespace boost;//删除器//函数对象 operator()void My_Delete(int *p) //特别定制的删除器{ delete p;}int main(){ int *p = new int(1原创 2016-08-13 21:55:28 · 1093 阅读 · 0 评论 -
C++:Boost库智能指针_shared_ptr
智能指针_shared_ptr: 共享智能指针shared_ptr 是最像指针的智能指针,是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的,Boost库的许多组件——甚至还包括其他一些领域的智能指针都使用了shared_ptr.shared_ptr与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以原创 2016-08-13 21:50:33 · 812 阅读 · 0 评论 -
C++:Boost库智能指针_scoped_array
智能指针_scoped_array:scoped_array 很像scoped_ptr,它包装了new[]操作符(不是单纯的new)在堆上分配的动态数组,为动态数组提供了一个代理,保证可以正确地释放内存。scoped_array 弥补了标准库中没有指向数组的智能指针的缺憾。scoped_array 的接口和功能几乎是与scoped_ptr是相同的(甚至还要少一些),原创 2016-08-13 21:44:26 · 1400 阅读 · 0 评论 -
C++:Boost库智能指针_scoped_ptr
智能指针_scoped_ptr:Boost库:scoped_ptr:局部智能指针智能指针可以在退出作用域时——不管是正常流程离开或是因异常离开——总调用delete来析构在堆上动态分配的对象,std::auto_ptr部分地解决了获取资源自动释放的问题,即不能对数组进行指向,更不能进行下标引用scoped_ptr 是一个很类似auto_ptr的指原创 2016-08-13 21:40:39 · 298 阅读 · 0 评论 -
C++:智能指针_auto_ptr_vs版本
智能指针_auto_ptr_vs版本:#include #include using namespace std;template class auto_ptr{public: auto_ptr(_Ty *_P = 0):_ptr(_P) {} auto_ptr(auto_ptr& _Y):_ptr(_Y.release()) //让新的指针指向原来的空间,原来原创 2016-08-13 21:35:23 · 353 阅读 · 0 评论 -
C++:智能指针_auto_ptr_vc版本
智能指针_auto_ptr_vc版本:拥有权管理和转移:当一个智能指针给另一个智能指针初始化的时候,两个智能指针将会同时指向一个空间,这样在对象析构的时候,会导致一块空间释放多次的问题,所以一个对象从始至终只能拥有一个智能指针,这样就保证不会一个对象多次释放的问题.我们让指针给指针初始化的时候将拥有权进行转移,即指针1被指针2初始化后,指针1拥有了管理该对象的权利,原创 2016-08-13 21:31:56 · 361 阅读 · 0 评论 -
C++:初识智能指针
初识智能指针:8种:auto_ptr(VC版)auto_ptr(VS版或Linux版,符合标准C++)Boost (Boost程序库完全开发指南.pdf):scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr、intrusive_ptr智能指针:拿对象模拟指针,还负责内存的自动释放;原创 2016-08-13 21:27:49 · 259 阅读 · 0 评论 -
c++中string类的详解
本文来自:http://blog.csdn.net/yzl_rex/article/details/7839379通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类的函数有哪一些,然后再罗列出函数的原型,最后到代码的实现标准C转载 2016-08-16 16:24:26 · 293 阅读 · 0 评论 -
C++基础:string和vector操作
C++中的字符串操作: 字符串的输入: string s; cin>>s; //输入一个字符串 cout string s1,s2; cin>>s1>>s2; //接连输入两个字符串 cout string s; while(cin>>s){原创 2016-08-04 11:10:49 · 430 阅读 · 0 评论 -
C++基础:共享方法如何识别对象,*this
编译器对类的识别顺序:1.识别类名;2.识别数据成员; 3.识别函数,改写函数;什么是*this: 1.代表当前对象; 2.当函数被调用时,this指针会被隐藏插入;改写方法: 1.函数改写:改写前:void RegisterGoods(char name[],int amount,float p原创 2016-07-17 19:43:31 · 254 阅读 · 0 评论 -
C++基础:派生类的构造函数与析构函数调用顺序
派生类的构造函数与析构函数调用顺序:派生类的构造函数的定义形式为:派生类名::派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),成员对象名1(成员对象参数表1),成员对象名2(成员对象参数表2){ …… //派生类新增成员的初始化;} //所列出的成员对象名全部为新增成员对象的名字在构造函数的声明中,冒号及冒号以后部分必须略去。原创 2016-07-20 22:34:43 · 569 阅读 · 0 评论 -
C++基础:钻石继承与虚基类
钻石继承与虚基类当发生钻石继承时,使用虚基类;B1和B2共同继承B0类,D继承B1和B2类,类似这种继承称为钻石继承;钻石继承会发生D类继承来自B1和B2共同继承自B0中的成员;区分方法:1.子类区分不同父类的相同成员名,可以加上父类的作用域;2.B1和B2都有BO的拷贝,而D只需要一份,可以让B1和B2虚拟继承B0,这样B1和B2就不会真实的开原创 2016-07-23 18:30:00 · 342 阅读 · 0 评论 -
C++基础:同名隐藏与赋值兼容规则
同名隐藏与赋值兼容规则:编制派生类时可分四步 :1.吸收基类的成员。不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收2.改造基类成员。声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override) 3.发展新成员。派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展。 4.重写构造函数与原创 2016-07-23 18:36:22 · 466 阅读 · 0 评论 -
C++基础:多态的实现原理分析
多态的实现原理分析:虚函数执行速度要稍慢一些。为了实现多态性,*每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现。所以多态性总是要付出一定代价,但通用性是一个更高的目标。空间:需要保存虚函数表时间:需要查表_vfptrvirtual fun ptr //虚函数表指针一个类里面不管有几个虚函数,只有一个虚函数表原创 2016-07-23 18:58:58 · 290 阅读 · 0 评论 -
C++基础:多态和虚函数的使用
多态与虚函数的使用:多态性是面向对象程序设计的关键技术之一。若程序设计语言不支持多态性,不能称为面向对象的语言。利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。1.函数名相同2.参数列表相同3.返回值相同在C++中有两种多态性 :1.编译时的多态性:程序可以根据函数名和参数来确定该调用哪一个函数,它是通过函数的重载和运算符的重原创 2016-07-23 18:51:20 · 337 阅读 · 0 评论 -
C++基础:纯虚函数
纯虚函数:纯虚函数是指被标明为不具体实现的虚拟成员函数。它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。定义纯虚函数的一般格式为:virtual 返回类型 函数名(参数表)=0;含有纯虚函数的基类是不能用来定义对象的。纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。抽象类原创 2016-07-23 19:03:19 · 405 阅读 · 0 评论 -
C++基础:输入输出的格式控制
输入输出的格式控制:C++在类ios中提供格式化输入输出。这些格式是对所有文本方式的输入输出流均适用。格式控制符定义为公有的无名的枚举类型:enum{ skipws=0x0001,//跳过输入中的空白字符 left=0x0002, //输出左对齐 right=0x0004, //输出右对齐 internal=0x0008,原创 2016-07-23 19:06:13 · 450 阅读 · 0 评论 -
C++基础:文件读写
C++文件读写:文件的使用步骤如下:1.说明一个文件流对象,这又被称为内部文件:ifstream ifile;//只输入用ofstream ofile;//只输出用fstream iofile;//既输入又输出用 2.使用文件流对象的成员函数打开一个磁盘文件。这样在文件流对象和磁盘文件名之间建立联系。文件流中说明了三个打开文件的成员函数。 v原创 2016-07-23 19:16:03 · 1294 阅读 · 0 评论 -
C++基础:文件与对象
文件与对象:在面向对象的程序设计中,信息总是放在对象的数据成员里。这些信息最终应该保存到文件中。当程序开始运行时,就要由打开的文件重新创建对象。在运行过程中,放在对象的数据成员里的信息得到利用和修改。运行结束时必须把这些信息重新保存到文件中,然后关闭文件。磁盘文件打开时建立的内部文件流是在运行时动态分配的资源。在面向对象的C++程原创 2016-07-23 19:18:10 · 359 阅读 · 0 评论 -
C++基础:继承访问属性
继承访问属性:继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。层次概念是计算机的重要概念。通过继承的机制可对类分层,提供类型/子类型的关系。C++通过类派生的机制来支持继承。被继承的类称为基类或超类,新产生的类为派生类或子原创 2016-07-20 22:30:32 · 486 阅读 · 0 评论 -
C++基础:new的三种形式详解
new的三种形式详解:1.new operator : new操作符 《=====》 ( operator new 开辟空间 ) + (调动构造函数 )2.operator new : 操作符new 只开辟空间3.placement new : 定位new例子:#include using namaespace原创 2016-07-19 22:06:13 · 1680 阅读 · 0 评论 -
C++基础:引用
函数中参数的传递方式:传值:在函数域中为参数重新分配内存,而把实参的数值传递到新分配的内存中。 优点:不会改变实参的值;引用:引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是C++系统不为引用类型变量 分配内存空间。引用主要用于函数之间的数据传递。 优点:如果实参是一个复杂的对象,重新分配内存会引起程序执行效率大大下降,而引用原创 2016-07-17 19:49:42 · 230 阅读 · 0 评论 -
C++基础:四大基本函数,构造,析构,拷贝构造,赋值函数
1.构造函数:构造函数是特殊的公有成员函数,其特征如下:1.函数名与类名相同。2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void!实际上构造函数有返回值,返回的就是构造函数所创建的对象。3.在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次。4.构造函数可以重载。严格地讲,说明中可以有多个原创 2016-07-17 19:59:49 · 712 阅读 · 0 评论 -
C++基础:函数的调用优化
函数的调用优化:优化前:函数:Test (Test x) //1.实参传值形参,调动拷贝构造函数{int value = x.GetData();Test tmp(value); //2.创建一个局部对象,调用构造函数return tmp; //3.创建一个临时对象返回,调用拷贝构造函数原创 2016-07-18 22:16:31 · 390 阅读 · 0 评论 -
C++基础:C++类中默认的6个函数,及深拷贝和浅拷贝
一个类里面有6个默认的函数:1.构造函数: Test t;2.拷贝构造函数: Test t1 = t;3.赋值函数: Test t2; t2 = t1;4.析构函数;5.对一般对象的取地址函数: Test t3; Test *pt = &t3; //Test原创 2016-07-18 22:27:45 · 447 阅读 · 0 评论 -
C++基础:运算符重载
运算符重载返回值类型 类名::operator重载运算符(参数列表){.......}#include using namespce std;class Complex;ostream& operator<<(ostream &out, const Complex &c); //重载输出流class Complex{ friend ostream& o原创 2016-07-18 22:32:29 · 301 阅读 · 0 评论 -
C++基础:友元
友元一个常规的成员函数声明描述了三件在逻辑上相互不同的事情1.该函数能访问类声明的私用部分2.该函数位于类的作用域之中3.该函数必须经由一个对象去激活(有一个this指针)通过将一个函数声明为友元可以使它只具有第一种性质在C++中友元(friend)函数允许在类外访问该类中的任何成员,就象成员函数一样。例子:void Show原创 2016-07-19 21:44:07 · 232 阅读 · 0 评论