代码改变世界

随笔分类 -  c++

[转]C++中头文件相互包含的几点问题

2013-05-31 10:53 by Ball Cactus, 345 阅读, 收藏,
摘要: 转自:http://www.sf.org.cn/article/base/200808/21170.html一、类嵌套的疑问C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和 B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:class B;class A{public:B b;};class B{public:A a;};因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的。在这里我们只需要把其中的一个A类中的B类. 阅读全文

[转]在头文件里避免使用using namespace XXX;

2013-05-31 09:45 by Ball Cactus, 234 阅读, 收藏,
摘要: 转自:http://yongkai.blog.51cto.com/1290440/551999作为一个C++的最佳实践(Best Practice),我们可以说尽量避免在头文件中使用C++的using namespace XXX;为什么呢?因为头文件经常被包含在其他的头文件和cpp文件中。C++的编译器直接就把头文件字符串拷贝过来,这样就强制让另外的头文件和cpp也using namespace XXX; 这有时候可能会造成麻烦。比如说:在A.h中using namespace std;在B.h中,我们自己定义了一个类vector,class vector本想这个类是纯粹我们自己定义的,不是s 阅读全文

C++运算符重载

2012-11-30 16:40 by Ball Cactus, 172 阅读, 收藏,
摘要: 百度:?=、[]、()、->以及所有的类型转换运算符只能作为成员函数重载。如果允许第一操作数不是同类对象,而是其他数据类型,则只能作为非成员函数重载(如输入输出流运算符>>和<<就是这样的情况)。重载双目运算符可以用友元或者成员函数,但是两者有区别例如用成员函数重载了 + 之后(假设赋值运算符 = 已经被重载)ob = ob + 100是被支持的,而ob = 100 + ob就是不被允许的这种情况下就要使用友元函数来对运算符重载以避免不必要的麻烦C++ 操作符重载 类成员 非类成员友元 左值 右值 阅读全文

[转]C++智能指针

2012-11-30 09:46 by Ball Cactus, 165 阅读, 收藏,
摘要: 摘自:http://www.cnblogs.com/HappyXie/archive/2011/01/17/1937130.htmlC++智能指针zero 坐在餐桌前,机械的重复“夹菜 -> 咀嚼 -> 吞咽”的动作序列,脸上用无形的大字写着:我心不在焉。在他的对面坐着 Solmyr ,慢条斯理的吃着他那份午餐,维持着他一贯很有修养的形象 ——— 或者按照 zero 这些熟悉他本质的人的说法:假象。“怎么了 zero ?胃口不好么?”,基本填饱肚子之后,Solmyr 觉得似乎应该关心一下他的学徒了。“呃,没什么,只是 …… Solmyr ,C++ 为什么不支持垃圾收集呢?(注:垃圾 阅读全文

C++小问题

2012-11-29 17:00 by Ball Cactus, 131 阅读, 收藏,
摘要: sizeofchar c = 'a';int *p = &c;cout<<sizeof(c)<<' '<<sizeof(p)<<' '<<sizeof(*p)<<endl;//输出是1 4 1//sizeof(*p)求得p指向的数据区域的大小getchar(); 与getch(); 什么区别getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出 阅读全文

C运行时库

2012-11-28 11:05 by Ball Cactus, 272 阅读, 收藏,
摘要: C运行时库函数和API函数有什么区别和联系呢? C运行时库函数是指 C语言本身支持的一些基本函数,通常是汇编直接实现的。。。。 API函数是操作系统提供给用户方便设计应用程序的函数,实现一些特定的功能,API函数也是C语言的函数实现的。 他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的。 =========================================================== 1)运行时库就是 C run-time library,是C而非C++语言世界的概念:取这个名字就是因为你的C程序运行时需要这些库中的函数. 2)C语言是所谓 阅读全文

[转]C++命名空间

2012-11-28 09:16 by Ball Cactus, 219 阅读, 收藏,
摘要: 转自:http://hi.baidu.com/soulshape/item/c269eab131301874244b09e6* 掌握:命名空间的作用及定义;如何使用命名空间。* 了解:使用早期的函数库 重点、难点◆命名空间的作用及定义;如何使用命名空间。在学习本书前面各章时,读者已经多次看到在程序中用了以下语句:using namespace std;这就是使用了命名空间std。在本讲中将对它作较详细的介绍。一、 为什么需要命名空间(问题提出)命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。在C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句 阅读全文

error LNK2005 & error C2086

2012-11-27 16:37 by Ball Cactus, 558 阅读, 收藏,
摘要: error C2086: 'id' : redefinition#ifndef是条件编译指令,属于预处理,在编译之前做的工作。若有,head1.h,head2.h,head3.h和src.cpp,在head2.h,head3.h中都包含head1.h,src.cpp包含head2.h,head3.h,则编译时出现redefinition错误。这时可以使用#ifndef...#define...#endif保证只编译一次。error LNK2005: "int id" (?id@@3HA) already defined in source.obj若有head 阅读全文

参数传递 强制类型转换 自动类型转换 临时变量

2012-10-26 16:37 by Ball Cactus, 1031 阅读, 收藏,
摘要: 0 关于参数传递类A, 有一个int的数据成员0.1 test1(int i),若A中有一个operator int()的强制类型转换,可以直接传对象。 A a; test1(a);0.2 test2(A b),若A中有一个A(int i)的构造函数,可以直接将int作为参数 int i = 10; test2(i);//这里自动调用A的构造函数,若传的是A的对象,则调用A的拷贝构造函数。如果传入的实参和形参类型不一致时,如果编译器能找到以上两种转换,则自动转换,否则会报类型不一致错误。1 自动类型转换自动转换发生在不同数据类型的变量混合运算时,由编译系统自动完成。2 强制类... 阅读全文

[转]CString, BSTR, LPCTSTR

2012-10-25 20:15 by Ball Cactus, 510 阅读, 收藏,
摘要: CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵)LPCTSTR只是一个常量的TCHAR指针。CString 是一个完全独立的类,动态的TCHAR数组,封装了+等操作符和字符串操作方法。typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;VC++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的A 阅读全文

续行符、宏定义

2012-10-19 16:54 by Ball Cactus, 257 阅读, 收藏,
摘要: 续行符、宏定义(#,...)#define CLASS(ID) class ID{ \public: \ID(int) {out < <#ID " constructor\n ";} \~ID() {out < <#ID " destructor\n ";} \};CLASS(Base)CLASS(Derive)//宏定义中#把参数转换成字符串//连续两个双引号(“”“”)编译时合并成一个,char str[20]="123""abc";#define P printf #define D 阅读全文

回车换行

2012-10-19 15:41 by Ball Cactus, 443 阅读, 收藏,
摘要: 回车换行(\r-13,\n-10)提示符:10是换行。13回车,接着输出是覆盖以前输出的字符。1310与10效果相同文件: b方式打开文件,无论读写,10就是10,13就是13 文本方式打开时: win下写:\r写为\r,\n写为\r\n,\r\n写为\r\r\n 读:\r读为\r,\n读为\n,\r\n读为\n win:文件中只有一个\r或只有一个\n时,用记事本打开都显示为小黑块,只有\r\n才显示为换行(在 windows 的记事本中打开 Unix 格式的文件时, 因为文件中没有 ‘r’, 所以整个文件显示为一行,\n为小黑块)Linux:换行用\n,打开win文件时... 阅读全文

C语言文件操作

2012-10-18 16:15 by Ball Cactus, 207 阅读, 收藏,
摘要: 文件打开方式:r w a r+ w+ a+r只读,fprintf写时返回-1,r+可以写w只写,读不出来 w+可以读出来a不可以读 a+可以//注意文件指针的位置//r+和w+的区别在于当打开的文件不存在时,w+,a+会新建文件,而r+返回空指针//a打开,若不存在,则新建文件详细内容参考文摘 阅读全文

转:C++单例模式

2012-08-30 10:17 by Ball Cactus, 167 阅读, 收藏,
摘要: #include <iostream> using namespace std; //单例类的C++实现 class Singleton { private: Singleton();//注意:构造方法私有 virtual ~Singleton(); static Singleton* instance;//惟一实例 int var;//成员变量(用于测试) public: static Singleton* GetInstance();//工厂方法(用来获得实例) int getVar();//获得var的值 void set... 阅读全文