
C/C++
文章平均质量分 62
jimofanhua0000
这个作者很懒,什么都没留下…
展开
-
计算数组长度引发的一些问题
今天一个朋友问了我他的程序怎么输出的结果不对,对于一个简单的求数组长度的小问题竟然发现还有那么多门道,程序如下:void merge(int *A, int p, int q, int r){ int n1 = q-p+1; int n2 = r-q; int* L = new int(n1+1); int* R = new int(n2+1); for(int i=0; i<n1原创 2016-03-21 17:16:18 · 586 阅读 · 0 评论 -
C++中智能指针auto_ptr
1. 智能指针auto_ptr的引入auto_ptr是C++标准库中的智能指针模板类,头文件auto_ptr的出现,主要是为了解决“有异常抛出时发生内存泄漏”的问题。如下的简单代码是这类问题的一个简单示例。int* p = new int(100);try{ doSomething(); cout endl; delete p;}cat转载 2017-06-01 09:36:41 · 297 阅读 · 0 评论 -
C++中const用法
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。1.const 修饰成员变量 1 #include 2 using namespace std; 3 int main(){ 4 int a1=3; ///non-cons转载 2017-06-01 11:04:27 · 247 阅读 · 0 评论 -
C++中的static关键字
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:#includeusing namespac转载 2017-06-01 11:47:36 · 492 阅读 · 1 评论 -
C++的单例模式与线程安全单例模式(懒汉/饿汉)
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。class singleton{protected: singleton(){}private:转载 2017-06-07 10:19:19 · 469 阅读 · 0 评论 -
C++11中的delete关键字
C++11 中,可在想要 “禁止使用” 的特殊成员函数声明后加 “= delete”(当然也可以声明为私有函数或者保护函数),而需要保留的加 "= default" 或者不采取操作class LeafOfTree{public: LeafOfTree() = default; ~LeafOfTree() = default; LeafOfTree(const LeafO原创 2017-06-07 10:20:51 · 6304 阅读 · 0 评论 -
C++双重检查锁定模式(DCLP)的风险
多线程其实就是指两个任务一前一后或者同时发生。1 简介当你在网上搜索设计模式的相关资料时,你一定会找到最常被提及的一个模式:单例模式(Singleton)。然而,当你尝试在项目中使用单例模式时,一定会遇到一个很重要的限制:若使用传统的实现方法(我们会在下文解释如何实现),单例模式是非线程安全的。程序员们为了解决这一问题付出了很多努力,其中最流行的一种解决方法是使用一个新的设转载 2017-06-07 10:22:34 · 882 阅读 · 0 评论 -
C++之RAII惯用法
C++中的RAII全称是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。但是这翻译并没有显示出这个惯用法的真正内涵。RAII的好处在于它提供了一种资源自动管理的方式,当产生异常、回滚等现象时,RAII可以正确地释放掉资源。举个常见的例子:void Func(){ FILE *fp; char* filename =转载 2017-06-03 21:56:40 · 691 阅读 · 0 评论 -
关于private继承
在C++的类中有许多种继承方式,而我们在软件设计和编写代码时用得最多的就是public继承,我们很少接触到private继承。但是我们在设计时真的有思考过什么时候应该用public继承,什么时候不该使用public继承,什么时候应该想想那些经常被我们遗忘的知识,让我们从它们被遗忘的角落里重拾它的光芒。例如private继承。As we all know,public继承是塑模出一种is转载 2017-06-04 17:05:50 · 3218 阅读 · 0 评论 -
sort与qsort排序方法整理
qsort排序:一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; //从小到大} qsort(num,100,sizeof(num[0]),cmp); 二、对char类型数组排原创 2017-06-08 17:37:34 · 475 阅读 · 0 评论 -
string与int转换
比较常用的转换方式:string转int:例“123”转换为123:for(int i=0;i{ num=num*10+(str[i]-'0');//如果想转换为其它进制的数,则这里乘对应的进制进制就好。比如转换为16进制,则为*16。}int转string:例将123转换为“原创 2017-06-10 21:07:53 · 1635 阅读 · 0 评论 -
STL中容器相等(equality)和等价(equivalence)的区别
STL中相等(equality)与等价(equivalence)的区别1.相等(equality) 【无序数据】相等关系是以operator ==为基础的。a与b相等: a == b 例子:find,count,count_if等等大部分函数2.等价(equivalence) 【已序数据】等价关系是以“在已排序的空间中对象值得相对顺序”为基础的。也就是说,如果两个值中任何一原创 2017-06-10 22:26:13 · 2090 阅读 · 0 评论 -
内存泄露如何调试
一、动态分配、回收内存是C/C++编程语言一个最强的特点,但是中国哲学家孙(Sun Tzu,我不知道是谁?那位知道?) 指出,最强的同时也是最弱的。这句话对C/C++应用来说非常正确,在内存处理出错的地方通常就是BUGS产生的地方。一个最敏感和难检测的BUG就是内 存泄漏-没有把前边分配的内存成功释放,一个小的内存泄漏可能不需要太注意,但是程序泄漏大块内存,或者渐增式的泄漏内存可能引起的现象是转载 2017-07-20 16:21:12 · 1358 阅读 · 0 评论 -
C++中的explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2017-06-01 09:07:55 · 276 阅读 · 0 评论 -
C++中Template
模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。函数模板在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下:void swap(int&a , int& b) { int temp = a;转载 2017-05-31 22:31:54 · 367 阅读 · 0 评论 -
assert()函数用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badpt转载 2017-06-04 21:35:19 · 1610 阅读 · 0 评论 -
C++中的虚函数、虚函数的作用和使用方法
人们提出这样的设想,能否用同一个调用形式,既能调用派生类又能调用基类的同名函数。在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们。例如,用同一个语句“pt->display( );”可以调用不同派生层次中的display函数,只需在调用前给指针变量 pt 赋以不同的值(使之指向不同的类对象)即可。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以转载 2017-03-19 14:54:43 · 574 阅读 · 0 评论 -
C++四种类型转换的关键字及其特点
C++的四种强制类型转换,所以C++不是类型安全的。关键字分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风转载 2017-03-19 15:34:16 · 512 阅读 · 0 评论 -
C++复制构造函数、const相关总结
1、有关复制构造函数相关点,下面这篇博客解释的很清楚。http://blog.youkuaiyun.com/lwbeyond/article/details/6202256/2、有关C++ const的相关知识点下面博客有比较全面的总结http://blog.youkuaiyun.com/Eric_Jo/article/details/4138548转载 2017-03-19 16:43:32 · 717 阅读 · 0 评论 -
C++重写(覆盖)、重载、重定义、多态
1 重写(覆盖)override override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。重写需要注意:被重写的函数不能是static的,必须是virtual的重写函数必须有相同的类型,名称和参数列表重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为转载 2017-05-23 10:30:46 · 421 阅读 · 0 评论 -
C中不安全的函数以解决办法汇总
C 中大多数缓冲区溢出问题可以直接追溯到标准 C 库。最有害的罪魁祸首是不进行自变量检查的、有问题的字符串操作(strcpy、strcat、sprintf 和 gets)。一般来讲,像“避免使用 strcpy()”和“永远不使用 gets()”这样严格的规则接近于这个要求。 这些函数由于设计的时候比较淳朴,并没有做任何的越界检测,主要容易"被溢出",只需要多设点检查边界,即安转载 2017-05-03 22:03:04 · 11009 阅读 · 0 评论 -
C++中内存分配——静态存储区、栈和堆
一、内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的转载 2017-05-15 22:58:38 · 1135 阅读 · 0 评论 -
C++析构函数为什么要为虚函数
1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 a.第一段代码#includeusing namespace std;class ClxBase{public: ClxBase() {}; ~ClxBase() {cout << "Output from the destruc转载 2017-05-25 23:04:17 · 454 阅读 · 0 评论 -
C++中为什么构造函数不能为虚函数原因
1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身转载 2017-05-25 23:05:27 · 892 阅读 · 0 评论 -
关于C++中的友元函数的总结
1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有下面两种情况需要使用友元转载 2017-05-25 23:06:42 · 427 阅读 · 0 评论 -
C++中虚函数和纯虚函数的区别
首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。1、简介假设我们有下面的类层次:class A { public: virtual转载 2017-05-25 23:02:19 · 358 阅读 · 0 评论 -
C++中GetMemory问题
题目一:void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str );}【运行错误】//该函数做的工作是 p=str, p=转载 2017-05-16 22:59:49 · 1387 阅读 · 0 评论 -
C++中i++和++i的区别
答:理论上++i更快,实际与编译器优化有关,通常几乎无差别。 i++实现的代码为://i++实现代码为: int operator++(int) { int temp = *this;转载 2017-05-30 22:11:03 · 28920 阅读 · 5 评论 -
C++常用字符串分割方法
字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可以使用stl提供的封装进行实现或者通过c函数strtok()函数实现。1、通过stl实现涉及到string类的两个函数find和substr: 1、find函数 原型:size_t find ( const string& str, size_t pos = 0 ) const; 功能:查找子字符串转载 2017-07-11 16:21:06 · 1151 阅读 · 0 评论