c++
文章平均质量分 67
风云来
这个作者很懒,什么都没留下…
展开
-
C++异常处理 set_terminate
1.C++异常处理在MFC中应使用C++的异常处理机制,不推荐使用MFC的宏为了使C++异常处理可用,需要进行如下设置:工程->设置->C/C++ 选项卡->分类 C++语言->允许异常处理。或者使用/GX编译选项,默认情况下是/GX-C++的异常处理结构为:try{//可能引发异常的代码}catch(type_1 e){// type_1类型异常处理}catc转载 2014-05-16 19:57:50 · 5039 阅读 · 0 评论 -
c++模板元编程
#include using namespace std; templateint T> struct factorial { enum { value = T * factorial::value }; }; templatestruct factorial { enum { valu原创 2014-05-17 00:31:14 · 819 阅读 · 0 评论 -
memmove 与memcpy
说下memmove ,简单解释下,如果目标地址dst在源地址src 到src +count 之间的话需要从后面向前拷贝 (不然dst的后部分得不到需要的结果,成了src的前部分了,dst前面可能出现传播效应)如dst = (char *)dst + count - 1;src = (char *)src + count - 1;然后 while (count--) {原创 2013-04-11 17:20:41 · 810 阅读 · 0 评论 -
类型的代理类(c++)
本文主要讲了C++中代理类的使用方法和使用情况。 所谓代理类,即surrogate.为什么要使用它呢,简单的举个例子. 1 class Vehicle 2 { 3 public: 4 Vehicle(){} 5 virtual string getName()= 0; 6 }: 7 8 class Car : public Vehicle 9 {10 pu原创 2013-05-05 06:52:10 · 1488 阅读 · 0 评论 -
c++智能指针
C++ 沉思录也算是C++中的经典书籍,其中介绍OO思想的我觉得很好,但是全书中贯穿了handle,使用引用计数等,也有点不适合现代C++的设计思想。这里使用shared_ptr 智能指针改写了“句柄”这一章的程序,明显使代码量下降,而且管理方便。下面来看代码:#include #include using namespace std;class Point{p原创 2013-05-05 07:53:55 · 907 阅读 · 0 评论 -
share_ptr 实现c++ 句柄引用计数
代码如下#include #include using namespace std;class Point{public:Point() : xval(0),yval(0){};Point(int x, int y): xval(x), yval(y){};Point(const Point & p){if(this == &p)return ;原创 2013-05-13 00:24:21 · 1588 阅读 · 0 评论 -
c++ 调试程序log使用
调试程序使用的:1 #运算符把跟在其后的参数转换成一个字符串2 如果你按下面的方式做#define STRINGIFY(x) #x#define AT __FILE__ ":" STRINGIFY(__LINE__) 你会发现打印的时候只能显示文件名3 如果你在宏上面再嵌套一个宏,变成如下:#include #define STRINGIFY(x) #x#define TOSTR原创 2013-07-09 20:15:22 · 3620 阅读 · 0 评论 -
c++时间函数
(1)使用C标准库localtime 精确到秒级#include <time.h> #include <stdio.h>int main( void ) { time_t t = time( 0 ); char tmp[64]; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) ); puts( tmp ); return 0; }原创 2013-09-08 23:08:19 · 1364 阅读 · 0 评论 -
互斥锁常用方式
几个比较实用的锁。互斥锁nMutex ,互斥锁nMutex的封装 auto_mutex_lock 自动互斥锁 只是方便解锁加锁。还有特化模板的锁和一般模板的锁,设计得不错,连判断都省了。不可复制类。常作为父类实现对象的不可复制,其实就是私有化拷贝复制函数和赋值函数,连实现都不需要,因为在代码中是不会出现的,所以不需要链接源代码。这里构造函数和析构函数是保护的,觉得其实不需要也可以,因为也用不原创 2013-11-08 21:24:54 · 1424 阅读 · 0 评论 -
字符转换
一个比较巧妙的字符转换方式,通过异或的方式(^0x20)来把小写的字符转换成大写的字符,但是只是限定于'a'到'z'之间。只能说这个是ascii设计者想的好了 ,简单写一个宏来转换就是这样的:#define charupper(c) (((c) >= 'a' && (c)原创 2013-12-31 11:38:43 · 749 阅读 · 0 评论 -
元编程(c++)
在STL中为了提供通用的操作而又不损失效率,我们用到了一种特殊的技巧,叫traits编程技巧。具体的来说,traits就是 通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异。在程序设计中可以使用这些traits来判 断一个类型的一些特性,引发C++的函数重载机制,实现同一种操作因类型不同而异的效果。traits的编程技巧极度弥补了C++语言的不原创 2014-05-20 14:24:08 · 1247 阅读 · 0 评论 -
this指针常用用法(C++ )
this指针的含义及其用法: 1. this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。4. 在C原创 2013-04-06 13:32:47 · 1177 阅读 · 0 评论 -
#pragma once与 #ifndef的区别
为了避免同一个文件被include多次1 #ifndef方式2 #pragma once方式在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句转载 2013-04-10 01:39:46 · 710 阅读 · 0 评论 -
虚表的内存布局(c++)
点击这里查看下篇>>>前言 转自:http://blog.csdn.net/haoel/article/details/308132807年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非原创 2013-04-13 18:25:31 · 2763 阅读 · 0 评论 -
友元函数(C++)
转自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数原创 2013-04-13 20:40:40 · 1216 阅读 · 0 评论 -
派生类构造函数和析构函数的调用顺序(C++)
我们来看下面一段代码: class B1 { public: B1(int i) {cout }; class B2 { public: B2(int j) {cout }; class B3 { public: B3( ){cout }; class C: public B2, public B1,原创 2013-04-14 04:07:54 · 1418 阅读 · 0 评论 -
c++ 异常抛出 throw
throw介绍:throw是用来抛出异常的。与之对应的处理异常的关键字还有try catch。throw一般是要被放在try语块中的用来抛出异常,而在对应的catch语块中进行相应异常的处理。用举个例子吧:========================================#include #include char* _strcpy(char *d, const ch原创 2013-04-14 23:56:49 · 7812 阅读 · 0 评论 -
c++ 操作符重载
需要注意的是 ,像+ ,- ,* 等二元操作符以及> 一般是要使用友元函数,这是由于友元函数的特点是不属于对象,不含this指针,可以访问类的私有函数。 像=,+=,-=,*= 等一元操作符 一般是返回*this 的引用,降低开销,又方便连续使用,如 a = b = c = d ;等。源码可以直接运行,已经比较清晰了。#include using namespace std;c原创 2013-04-15 00:46:25 · 906 阅读 · 0 评论 -
二维数组动态分配和释放(c/c++)
(1)已知第二维Code-1char (*a)[N];//指向数组的指针a = (char (*)[N])malloc(sizeof(char *) *m);printf("%d\n", sizeof(a));//4,指针printf("%d\n", sizeof(a[0]));//N,一维数组free(a); (2)已知第一维Code-2char* a[M];原创 2013-04-19 04:14:54 · 1897 阅读 · 0 评论 -
空间配置器(c++)
说一说C++里的allocator。我们知道,C++ STL里定义了很多的容器(containers),每一个容器的第二个模板参数都是allocator类型。比方说在VC10里,vector类的模板声明为: templateclass _Ty, class _Ax = allocator > class vector但是,基本上很少有人会自定义一个allocator。一来,原创 2013-04-23 02:10:00 · 954 阅读 · 0 评论 -
c++类型转换
转自:http://blog.sina.com.cn/s/blog_4a84e45b0100f57m.html关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、d原创 2013-04-23 02:15:43 · 784 阅读 · 0 评论 -
c c++ register
用register关键字修饰的变量,在C语言中是不可以用&操作符取地址的。因为编译器如果接受了程序员的建议把变量存入寄存器,它是不存在虚拟地址的。但在C++中,用register修饰的变量可以用&操作符取地址,这是我在一段代码中发现的。如果程序中显式取了register变量的地址,编译器一定会将这个变量定义在内存中,而不会定义为寄存器变量。C99指出了The impleme原创 2013-05-05 04:33:28 · 6052 阅读 · 0 评论 -
分析可变参数(C/C++)
以前只是知道可变参数怎么用,但是一直对它的原理是似懂非懂,现在对计算机有了比较深刻的认识之后,回头再看,豁然开朗。要理解可变参数,首先要理解函数调用约定, 为什么只有__cdecl的调用约定支持可变参数,而__stdcall就不支持?实际上__cdecl和__stdcall函数参数都是从右到左入栈,它们的区别在于由谁来清栈,__cdecl由外部调用函数清栈,而__stdcall由被原创 2013-08-05 00:16:48 · 962 阅读 · 0 评论 -
stdio.h 与 cstdio
在C语言中,stdio.h 头文件是主要的。而在后来的C++语言中,C只是C++的一个子集,且C++中,已不推荐再用C的类库,但为了对已有代码的保护,还是对原来的头文件支持。cstdio文件的内容是这样的:#if #include namespace std { using ::fclose; using ::feof; using ::ferror;原创 2013-08-14 14:57:44 · 1691 阅读 · 0 评论 -
strcpy、strncpy、strncpy_s和snprintf
首先说下strcpystrcpy()是依据源串的\0作为结束判断的,不检查copy先的Buffer的Size,如果目标空间不够,就有BufferOverflow问题。strncpy的原型为:char * strncpy(char *dest, char *src, size_t n);其将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到N原创 2013-08-14 15:02:27 · 13764 阅读 · 1 评论 -
字符编码环境设置:setlocale函数
针对无法读取中文路径下的文件的问题,只要在解析模型配置文件时,加入一句: setlocale(LC_ALL,"chs");即可。setlocale函数原形为: char *setlocale( int category, const char *locale );头文件:所支持的操作系统为:ANSI, Win 95, Win NT对于简体中文可以使用如下设置:setl原创 2013-08-20 01:43:12 · 10197 阅读 · 0 评论 -
c++虚析构函数
// destructor.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include using namespace std;class A{public:A(){printf("A()\n");}virtual ~A()原创 2013-09-08 06:47:02 · 623 阅读 · 0 评论 -
预编译提醒宏,可在vs中编译过程中双击跳转
/* 获取当前文件和行数的宏(获取的字符串如:abc.cpp(2000))*/#ifndef __FILE_LINE__#define _TLN(LN)#LN#define __TLINE__(LN)_TLN(LN)#define __FILE_LINE____FILE__"("__TLINE__(__LINE__)")"#endif 预编译提醒宏:原创 2013-09-22 10:07:31 · 1090 阅读 · 0 评论 -
INL文件(c++)
inl 文件是内联函数的源文件。内联函数通常在c++头文件中实现,但有的时候内联函数较多或者出于一些别的考虑(使头文件看起来更简洁等),往往会将这部分具体定义的代码添加到INL文件中,然后在该头文件的末尾将其用#include引入。由此也可以看到inl文件的例外一个用法的影子——模板函数、模板类的定义代码的存放。对于比较大的工程来说,出于管理方面的考虑,模板函数、模板类的声明部分一般存放在一个或少原创 2013-10-23 01:44:50 · 2856 阅读 · 0 评论 -
全局变量和目标文件的静态变量
看到有一位同学在头文件中这么写:12static const wchar_t* g_str1 = …static const wchar_t* g_str2 = …这种定义变量的方式我从来没有见过,而且它还能顺利通过编译,于是我很想知道编译器是如何处理这种变量定义的。 定原创 2013-10-23 12:17:48 · 842 阅读 · 0 评论 -
字符适配宏T
_T("")是一个宏,定义于tchar.h下。[1] #define __T(x) L ## x #define _T(x) __T(x) 他的作用是让你的程序支持Unicode编码 因为Windows使用两种字符集ANSI和UNICODE原创 2013-11-11 16:16:23 · 770 阅读 · 0 评论 -
函数调用约定
(1) _stdcall调用_stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。WIN32 Api都采用_stdcall调用方式,这样的宏定义说明了问题: #define WINAPI _stdcall 按C编译方式,_stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_funct原创 2013-11-13 05:54:42 · 821 阅读 · 0 评论 -
enum 变量内存大小(c++)
关于占用内存的大小,enum类型本身是不占内存的,编译器直接替换。但是enum类型的变量肯定是占内存的(关于占用内存的大小,看后面详述)。enum需要特别注意的是它的取值范围和类型分配。关于确定enum的取值范围,如果一个enum中所有的枚举值非负,那么枚举的表示范围是[0,2^k - 1],其中2^k是使得所有枚举值位于此范围内的最小的2的幂。如果是有负值,那么范围就是[-2^k原创 2013-11-13 18:44:20 · 14786 阅读 · 1 评论 -
在指定的地址构造对象
在指定的地址构造对象,又不会生成对象,就是不用析构该对象。一般是在缓冲区里构造。可以指定地址,由模板编译类型,还可以传入参数。#include template inline void constructInPlace(T *_Ptr){ // construct object at _Ptr with value _Valnew ((void *)_Ptr) T(原创 2013-11-17 17:14:05 · 1983 阅读 · 0 评论 -
__attribute__ ((format (printf, 2, 3)));
这句主要作用是提示编译器,对这个函数的调用需要像printf一样,用对应的format字符串来check可变参数的数据类型。例如:extern int myprintf (void *other, const char *fmt, ...)__attribute__ ((format (printf, 2, 3)));format (printf, 2, 3)告诉编译器,fmt相当于p原创 2013-11-20 20:42:44 · 2923 阅读 · 0 评论 -
__THROW __nonnull
__THROW __nonnull ,不抛出异常和不让参数为空。Linux 下的定义是这样的: /usr/lib/string.h string.h:char *strcpy (char *__restrict __dest, __const char *__restrict __src) __THROW __nonnull ((1, 2));原创 2013-11-21 14:51:26 · 5516 阅读 · 1 评论 -
gets函数和fgets函数
今天在LINUX下编译C程序时,出现了:warning: the `gets' function is dangerous and should not be used.这个warning。百度之后,得知问题出在程序中使用了 gets ,Linux 下gcc编译器不支持这个函数,解决办法是使用 fgets[cpp] view p原创 2013-11-21 21:35:16 · 2863 阅读 · 0 评论 -
警告设置(c++)
关于#pragma warning1. #pragma warning只对当前文件有效(对于.h,对包含它的cpp也是有效的),而不是对整个工程的所有文件有效。当该文件编译结束,设置也就失去作用。2. #pragma warning(push)存储当前报警设置。#pragma warning(push, n)存储当前报警设置,并设置报警级别为n。n为从1原创 2013-12-02 17:49:43 · 2272 阅读 · 0 评论 -
vector at 函数 和[]操作符
[]操作符的源码reference operator[](size_type __n) { return *(begin() + __n); }at函数的源码reference at(size_type __n) {_M_range_check(__n);return (*this)[__n]; }原创 2014-01-19 18:35:48 · 12355 阅读 · 0 评论 -
c++异常抛出
为什么要加一个throw()到你的函数中? 这是异常规范,只会出现在声明函数中,表示这个函数可能抛出任何类型的异常 void GetTag() throw(int);表示只抛出int类型异常 void GetTag() throw(int,char);表示抛出in,char类型异常 void GetTag() throw();表示不会抛出任何类型异常 void GetTag()原创 2014-02-10 12:25:23 · 1200 阅读 · 0 评论