细解C++
文章平均质量分 55
iaccepted
爱生活,爱算法!
展开
-
关注C++细节——写头文件注意
在C++中我们写头文件时经常需要#include来包含其他头文件。头文件定义的实体经常使用其他头文件的设施。包含其他头文件是如此的司空见惯,甚至一个头文件被多次包含进同一源文件中也不是什么稀奇的事。例如一个头文件中用到string类型的变量,而包含这个头文件的源文件中也用原创 2011-08-30 21:47:05 · 3023 阅读 · 4 评论 -
关注C++细节——含有本类对象指针的类的构造函数、析构函数、拷贝构造函数、赋值运算符的例子
本例只是对含有本类对象指针的类的构造函数、析构函数、拷贝构造函数、复制运算符使用方法的一个简单示例,以加深对构造函数和拷贝控制成员的理解。读C++ primer 5th 第13章后加上自己的理解,完整的写了下课后习题的代码。第一版:#include #include using namespace std;class TreeNode{private: stri原创 2014-06-27 16:07:21 · 4378 阅读 · 5 评论 -
类继承时函数掩盖盖问题
正常情况下我们可以通过使用相同的函数名而不同的参数或者返回值类型等因素来实现函数重载。但是在le原创 2014-09-17 21:26:41 · 2121 阅读 · 1 评论 -
有序容器自主定义排序器
STL中的set和map是有序容器,使用时如果希望根据自己的需要来设定排序器,通常有一下两种方式。1.如果容器中直接存储对象的话,那么我们可以在对象类中重载2.如果存储的不是直接对象的话比如对象的指针(通常为智能指针),这个时候我们就要定义自己的比较器。而比较器的写法一般有两种。 ->1.类内重载函数调用运算符的方法。 ->2.以函数的方式提供比较器。对于第一种方法是非原创 2014-08-07 20:58:52 · 2864 阅读 · 1 评论 -
在重载运算符时,类的对象可以直接访问私有成员解惑
以前对这里确实有点疑惑,但是最近在看原创 2014-06-26 16:47:47 · 5185 阅读 · 4 评论 -
关注C++细节——动态生成对象初始化细节
①T *p =new T;②T *p =new T();这两类用法不同点的总结。 1.若T为类类型,且用户定义了构造函数,则两种形式的效果完全相同,都会调用这个定义了的构造函数来初始化内部成员变量,但是如果此构造函数中并未对成员变量初始化,则这个时候内部的成员变量进行默认初始化——值是未定义的。2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道编译器会为该类合成一原创 2014-08-16 14:27:33 · 3399 阅读 · 6 评论 -
关注C++细节——C++11新标准之decltype的使用注意
c++11新特性——decltype decltype是C++11添加的一个新的关键字,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值。对于内置类型的对象,使用decltype很直观,但当参数为复合类型的时候就应该注意一些使用细节问题。原创 2014-05-31 13:17:21 · 19534 阅读 · 1 评论 -
关注C++细节——字面值初始化字符数组及字符串拷贝注意
char carr[] = "author:CSDN-iaccepted"; 此时,carr数组中元素的个数为21,最后一个位置用来存放空字符'\0'。所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的。int clen = strlen(carr);int size = sizeof(carr);这时候得到的clen =原创 2014-05-23 10:59:56 · 3875 阅读 · 1 评论 -
关注C++细节——抽象的理解
#include using namespace std; class A{public: void a(){ cout << "func_a" << endl; }}; int main(){ A * p = NULL; p -> a(); return 0;}该程序输出func_a,试分析其背后的原理原创 2014-01-27 21:54:33 · 2123 阅读 · 1 评论 -
关注C++细节——产生随机数
c/c++中产生随机数使用rand()函数,但是这样每次启动程序时产生的随机数序列都是相同的,所以,这样产生的并不是真正的随机数列。这里我们可以使用srand函数对随机数产生器进行初始化,而使用srand初始化的时候,需要给其提供一个种子,不同的种子就可以对应不同的随机数序列,但是如果种子相同,rand()产生的随机数序列还是相同的,所以,srand(1)进行初始化,显然不符合我们产生随机数的原创 2012-03-02 20:22:24 · 2035 阅读 · 3 评论 -
关注C++细节——static类成员使用注意
对于某一特定类类型的全体对象我们需要访问一个共同的变量,这个时候我们通常是在类的声明中声明一个静态变量即static变量。当然可以用一个全局变量来代替,但是用全局变量是一个很不好的习惯,重要的一点就是全局变量会破坏类的封装。然而类中static变量不像普通变量,它独立与该类的任意对象而存在,每个static数据成员与一个特定的类相关连,而非与该类的对象相关连。http://blog.csdn.ne原创 2011-11-20 16:01:15 · 2901 阅读 · 2 评论 -
sprintf用法详解
printf可能是许多程序员在开始学习C语言时接触到的第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类型的数据构造成字符串时,sprintf的强大功能很少会让你失望。由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sp转载 2014-01-17 12:49:38 · 24545 阅读 · 0 评论 -
sort和qsort用法总结
sort()函数是C++中的排序函数其头文件为:#include头文件;qsort()是C中的排序函数,其头文件为:#include1、qsort()----六类qsort排序方法qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等。函数原型:void qsort(void *base, size_t nelem, size_twidth, int转载 2014-01-17 17:44:56 · 999 阅读 · 0 评论 -
关注C++细节——标准库string类型
一. 首先作为一种标准库类型,string存在四种基本的构造函数。如下:string s; //默认构造函数,s为空串string s(s1);//用s1来初始化sstring s("My Blog http://blog.csdn.net/IAccepted");原创 2011-08-31 18:05:39 · 1857 阅读 · 0 评论 -
关注C++细节——使用内置算术类型
C++中整型数有点令人迷惑不解。就像C语言一样,C++被设计成允许程序在必要的时候直接处理硬件,因此整型被定义成满足各种各样硬件的特性。大多数程序员可以(应该)通过限制实际使用的类型来忽略这些复杂性。 实际上,许多人用整型进行计数。例如:程序经常计算像vecto原创 2011-08-30 08:27:52 · 2332 阅读 · 2 评论 -
关注C++细节——你能直接写出多少个C++关键字?
一次性写出C++中的所有关键字,有人会问了,到底有几个呢? 下面来数数吧!asm do if return tryauto doub原创 2011-08-29 21:45:09 · 2718 阅读 · 8 评论 -
关注C++细节——万能const限定符与指针
不记得谁说过,能用const的时候尽量用const。确实,const为增加程序的健壮性做出了很大贡献,但是const修饰指针的时候还是值得注意的。一.指向const对象的指针;如果指针指向const对象,那么很显然不能通过指针改变其所指向的const值。为了保证这个特性,原创 2011-09-06 21:55:13 · 1827 阅读 · 0 评论 -
关注C++细节——strcpy
题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。解说: 1.strcpy的实现代码 char * strcpy(char * strDest,const原创 2011-10-15 19:37:08 · 1906 阅读 · 2 评论 -
关注C++细节——标准IO库
IO操作需要支持不同类型的设备和不同类型数据的接口。所以IO标准库使用了继承来定义一组面向对象的类。1. 首先IO类型在三个头文件中定义iostream定义控制窗口读写的类型,fstream定义读写已命名文件的类型,sstring定义读写存储在内存中string对象(这个在做ACM的很多题目的时候很方便,这个在后面会提一下)。由于集成关系加上多态的特性(动态绑定)我们可以用ist原创 2011-11-28 17:08:02 · 3098 阅读 · 3 评论 -
关注C++细节——类中的几个特殊函数
C++是面向对象的编程语言,编程中我们不可避免的需要自定义的类,在定义自己的类时我们应该关注类中的几个基本函数的定义——构造函数,复制构造函数,析构函数,赋值操作函数。现在简单介绍一下以上几个函数,由于水平有限,不足之处欢迎大家指正,以便互相学习,本人博客http://blog.csdn.net/IAccepted。一.构造函数我们在定义类时必须存在构造函数,但这里的必须存在并不是说程序员原创 2011-12-02 21:41:27 · 3429 阅读 · 0 评论 -
关注C++细节--宏展开出错
当我们在分析有关宏定义的问题时,最简单的办法就是先把宏的内容进行替代,然后在进行分析。如:#define sqr(x) x+x #define fun(x) x*x则分析如下表达式的结果sqr(3) //第一个很简单就是x+x即3+3=6fun(3+3) //第二个先用宏替代则为 3+3*3+3则为15!sqr(3)原创 2011-10-22 20:30:40 · 1683 阅读 · 2 评论 -
关注C++细节——STL中map学习小结
map常用的方法主要有:insert,erease,size,count,begin,end,find,clear,emptyinsert方法: 在map中插入一个元素,map中记录的元素通常为键值对,所以,在存储时会把,键和值封装成pair然后进行插入,例如:phone.insert(pair(name,number));其中name和number为string类型的变量。原创 2013-01-29 22:08:55 · 16642 阅读 · 1 评论 -
关注C++细节——变参数函数的参数获取问题
va_listva_startva_endva_arg变参数函数问题中主要是靠这几个函数来获取参数,这四个函数都在cstdarg 或 stdarg.h包中,可以百度下,很简单下面直接举个例子:#include #include using namespace std;int print(char *start, ...){ va_list原创 2013-03-04 11:11:30 · 2055 阅读 · 0 评论 -
关注C++细节——浅谈指针使用中注意事项
相信大家对指针的用法已经很熟了,这里也不多说些定义性的东西了,只说一下指针使用中的注意事项吧。一.在定义指针的时候注意连续声明多个指针时容易犯的错误,例如int * a,b;这种声明是声明了一个指向int类型变量的指针a和一个int型的变量b,这时候要清醒的记着,而不要混淆成是声明了两个int型指针。二.要避免使用未初始化的指针。很多运行时错误都是由未初始化的指针导致的,而且这种错误又不能原创 2011-09-02 09:52:08 · 6499 阅读 · 8 评论