
C++
花熊
毕业于西安交通大学
展开
-
8.c++-#pragma once与 #ifndef的区别
为了避免同一个文件被include多次<br />1 #ifndef方式<br />2 #pragma once方式<br />在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。<br /> 方式一:<br /> #ifndef __SOMEFILE_H__<br /> #define __SOMEFILE_H__<br /> ... ... // 一些声明语句<br /> #endif<br /> 方式二:<br />原创 2010-12-01 16:55:00 · 791 阅读 · 0 评论 -
9.c++-尽量用const和inline而不用#define,类静态成员变量和函数
要点1.静态成员变量只能在类外初始化要点2.静态成员函数可以在类中定义,但不含this指针,因为它不属于任何特定对象要点3.尽量用const和inline而不用#define因为类的静态成员变量是所有实例共用的.所以得在类外初始化.如原创 2010-12-12 19:27:00 · 1576 阅读 · 0 评论 -
12.c++-返回引用的函数
最近用得比较多,总结了下:1.返回引用的函数 return 对象一定不能是局部变量,不然挂掉程序。2.如果1不成立,那么加上&可以直接操作返回对象本身,不加上&和普通函数(不返回引用)无区别.原创 2011-03-29 11:11:00 · 1011 阅读 · 0 评论 -
19.c++-const
1.函数名前加const对于内置类型,如int int fun()const int fun()int const fun()一个东东.,没区别对于自定义类型,或指针,如class A , int *pconst int* fun()int* const fun()意思都是返回的int指针是const的,所以 int a = *fun();//原创 2011-12-01 17:07:51 · 752 阅读 · 0 评论 -
22.c++-替换字符串中指定的字符(随手源码)
void WReplace(wchar_t* pDstOut, wchar_t* pSrcIn, wchar_t* pSrcRpl, wchar_t* pDstRpl){ wchar_t* pi = pSrcIn; wchar_t* po = pDstOut; int nSrcRplLen = wcslen( pSrcRpl ); int nDstRplLen = wcslen(原创 2013-07-05 14:46:39 · 1334 阅读 · 0 评论 -
6.c++-do-while流程控制方式
<br />do{ if ( x ) break; if ( y ) break;//..... if ( z ) break;}while(0);<br />用 do{}while(0)的形式,使得{}中的代码必须且仅走一次,但又可以随时用break退出整个流程,一举两得,并且流程清晰易懂。<br />习惯性的从各位好友那偷点代码,学习之,占为已有,笔记之,共享。原创 2010-11-24 20:29:00 · 773 阅读 · 0 评论 -
11.c++-初始化列表中初始化顺序和它们在类中声明的顺序保持一致
随手写的程序:原创 2010-12-14 21:31:00 · 1086 阅读 · 0 评论 -
16.c++-std::Set(有序集合)
C++标准库:std_set作为一个有序集合摘要:std::set作为标准库的一个关联容器,实现内部元素进行了排序,使用这特性可以对一组元素进行插入排序。std::set最初的设计是完成数学中“集合”的概念,它提供的接口也是如此。本文简单地介绍一下这一个标准库容器。原创 2011-08-22 20:58:38 · 7318 阅读 · 0 评论 -
18.c++-#pragma init_seg对象的初始化和析构顺序
先进后出原则,最先初始化的最后析构!1.C++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器2.C++总是按成员变量在类声明中出现的顺序来初始化成员变量的,为什么C++不按初始化列表的顺序来初始化成员变量呢?因为我们知道初始化的顺序应该与析构的顺序相反,而对一个类来原创 2011-10-15 17:35:24 · 2673 阅读 · 0 评论 -
5.c++-拷贝构造函数(深拷贝,浅拷贝)
规则:在 C++ 中,赋值和拷贝是不同的,拷贝构造函数是对未初始化的内存进行初始化操作而赋值是对现有的已经初始化的对象进行操作。(对“已经初始化”的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可)如 CIcon a = b ;这是拷贝构造函数被设用如CIcon a ;a = b ; 这是赋值操作符被调用对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种原创 2010-11-23 15:50:00 · 690 阅读 · 0 评论 -
24.c++-lib文件简述
1.LIB可以链接其他LIB,比如:lib2依赖于lib1,libTest.exe依赖于lib2,这样肯定是OK的2.lib文件其实就是obj文件的打包而已,所以使用lib.exe可以组合它们:比如下面就是直接把lib1和lib组合成liball原创 2015-09-14 19:18:38 · 696 阅读 · 0 评论 -
0.c++-static_cast、reinterpret_cast、dynamic_cast、等转换
static_cast:可以实现C++中内置基本数据类型之间的相互转换。如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数class A{};class B:public A{};class C{};int main(){ A* a=new A; B* b; C* c; b=static_cast(a); // 编译不会报错,原创 2012-05-10 19:36:16 · 1599 阅读 · 0 评论 -
4.c++-对C++多态性的一点理解
多态性 虚函数 纯虚函数 早绑定 晚绑定原创 2010-11-23 10:27:00 · 1253 阅读 · 0 评论 -
3.c++-/MD、/MDd 和 /MT、/MTd
C++ 常见编译错误原创 2010-08-27 22:25:00 · 1285 阅读 · 0 评论 -
2.c++-重载运算符operator
c++ operator 重载 赋值运算符 运算符原创 2010-08-25 08:59:00 · 4910 阅读 · 0 评论 -
7.c++-内存对齐的一点个人理解(#pragma pack(k))
内存对齐原创 2010-12-01 10:43:00 · 879 阅读 · 0 评论 -
13.c++-stl::vector删除重复元素
STL提供了很多实用的算法,这里主要讲解sort和unique算法。删除重复元素,首先将vector排序。sort( vecSrc.begin(), vecSrc.end() );然后使用unique算法。 vecSrc.erase( unique( vecSrc.begin(), vecSrc.end() ), vecSrc.end() );unique返回值是重复元素的开始位置。如果vector中存储的元素是自定义的结构或者是类,那么就需要重载操作符。根据类的某一个成员变量排序或者比较。sort算法需要原创 2011-04-29 11:18:00 · 10585 阅读 · 1 评论 -
15.c++-类的静态成量变量必须初始化
因为类的静态成员变量是所有实例共用的.所以得在类外初始化.调用的时候可以通过对象调用,也可以通过类直接调用class A{public: int i; //有默认值};class B{public: static int n; static A Aobj;原创 2011-07-25 22:20:41 · 1277 阅读 · 0 评论 -
23.c++-16进制转换成字符串(随手源码)
inline int hex_to_str(const unsigned char *hex, int hexlen, char *str, int &strlen){ int outhexlen = hexlen * 2 + 1; if (strlen < outhexlen) { return -1; } strlen = outhexlen; for (int i =原创 2014-02-20 16:56:26 · 1541 阅读 · 0 评论 -
0.c++-打印函数时间
自己随手写的,方便测试绘制代码用。class CFunTime{public: CFunTime() { TimeStart=GetTickCount(); } ~CFunTime() { TimeEnd=GetTickCount(); TRACE("time:%d\n", TimeEnd-TimeStart); }pri原创 2011-11-16 23:05:19 · 1371 阅读 · 0 评论 -
17.c++-谁分配谁释放HEAP
在linux下跑得一直很好的程序,到了windows下面就跑不起来了。内存异常,检查了一下,很快发现是因为在主程序中释放了一块在DLL中分配的内存,这种问题虽然早就知道了,但是一直没有仔细考虑过,所以今天就深入研究了一下。在linux下,每个进程只有一个heap,在任原创 2011-08-24 21:27:05 · 1985 阅读 · 0 评论 -
10.c++-new/delete和malloc/free读书笔记
以前对这两者的认识是停留在以下表面:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。new会自动调用构造函数,delete会自动调用析构函数,malloc和free不会。malloc是个分配内存的函数,供你调用的。new是保留字,不需要头文件支持。malloc需要头文件库函数支持。new 建立的是一个对象,malloc分配的是一块内存。原创 2010-12-13 21:29:00 · 874 阅读 · 0 评论 -
14.c++-类模板不能让声明和实现分离
我们习惯是.h中放类的函数声明,在.cpp中放类的函数定义,但在类模板中不能这样做,如随手写了个demo测试了下.h中代码#pragma oncetemplate class CTemplate{public: CTemplate(void); ~CTemplate(void); void Fun(T a) ;};.cpp中代码#include "StdAfx.h"#include "Template.h"templateCTemplate::CTemplate(原创 2011-05-24 10:11:00 · 1992 阅读 · 0 评论 -
20.c++-FILE详解
DWORD MyGetFileSize(const char* FileName){ FILE *fp = fopen(FileName, "rb"); if (NULL == fp) { return 0; } DWORD pos = ftell(fp);// 返回当前值,pos保存当前值 fseek(fp, 0, SEEK_END);// 定位到最后原创 2012-07-27 09:25:16 · 1449 阅读 · 0 评论 -
21.c++-cmd命令中的-argc argv
argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数argv: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数argv[0] 指向程序运行的全路径名argv[1] 指向在DOS命令行中执行程序名后的第一个字符串argv[2] 指向执行程序名后的第二个字符串如:int _tmain(int argc, _TCHAR原创 2012-08-11 09:53:36 · 1117 阅读 · 0 评论 -
1.c++-stl map详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。<br />下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映原创 2010-08-13 09:33:00 · 968 阅读 · 0 评论 -
0.c++-显式打印、改变lib库加载顺序(/verbose:lib)
今天编译了下代码:提示以下错误,因为nafxcw.lib是MFC的,所以必须首先被编译1>正在链接…1>nafxcw.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已经在 LIBCMT.lib(new.obj) 中定义测试下,在Link–>cmd中加原创 2012-05-10 19:35:09 · 1584 阅读 · 1 评论