许久没有写技术日志了,今天写一篇关于字符串转换的。
大家都知道,在标准c++中有string和wstring,前者为多字节ANSI字串,后者为宽字节wide字串(UTF-16)。
在一些应用中常常需要在二者之间以及与UTF-8之间进行字串转换,这里提供一个自己写的类,用于之间的转换。
原理是利用windows的api:WideCharToMultiByte、MultiByteToWideChar。
这两个api的第一个参数就是代码页,其中CP_ACP代表ANSI CODE PAGE,而CP_UTF8自然代表UTF-8。
注:由于用到了windows api,所以只适用windo...
发表于2009年3月31日 09:03:00 更新于2009年3月31日 09:05:00
发表于2008年5月14日 10:43:00 更新于2008年5月22日 15:57:00
自己写的总结,错误之处,还望指出
要领如下 sshong 08.05.14
1.首先是获取窗口客户区的DC
2.产生这个DC对应的设备上下文内存(因为直接操作源DC会有闪烁,而先搞一个统一的DC到内存中,最后再统一copy到源DC)
3.产生这个DC对应的位图(大小一致,为何全黑还不得而知)
4.将这个位图选中到设备上下文内存中,并保留老的位图
5.根据源DC拷贝位图到内存设备上下文中,没有这一句位图还是黑的,估计选入之后,对内存设备上下文的操作会影响到选入的位图
6.选入老的位图,因为被选入的gdi对象无法被销毁,而出栈时需要销毁这个新位图,所以选出以便被销毁
7.此时...
要领如下 sshong 08.05.14
1.首先是获取窗口客户区的DC
2.产生这个DC对应的设备上下文内存(因为直接操作源DC会有闪烁,而先搞一个统一的DC到内存中,最后再统一copy到源DC)
3.产生这个DC对应的位图(大小一致,为何全黑还不得而知)
4.将这个位图选中到设备上下文内存中,并保留老的位图
5.根据源DC拷贝位图到内存设备上下文中,没有这一句位图还是黑的,估计选入之后,对内存设备上下文的操作会影响到选入的位图
6.选入老的位图,因为被选入的gdi对象无法被销毁,而出栈时需要销毁这个新位图,所以选出以便被销毁
7.此时...
发表于2008年4月4日 15:31:00 更新于2008年4月4日 15:31:00
构造函数并不存在继承,因为在c++中,构造函数是自动调用的,子类会调用父类的构造函数。而且构造的顺序如下,
(1)首先调用父类构造函数;
(2)调用成员对象的构造函数;
(3)子类自己的构造函数。
析构顺序与上面严格相反!
因此,因为是先调用父类构造函数,在父类的构造函数中,其虚函数表并未完全形成,要想在父类构造函数中使用多态功能是错误的!
譬如下代码:想在父类构造函数中实现多态,结果输出的却是父类的virfun。
...
(1)首先调用父类构造函数;
(2)调用成员对象的构造函数;
(3)子类自己的构造函数。
析构顺序与上面严格相反!
因此,因为是先调用父类构造函数,在父类的构造函数中,其虚函数表并未完全形成,要想在父类构造函数中使用多态功能是错误的!
譬如下代码:想在父类构造函数中实现多态,结果输出的却是父类的virfun。
...
发表于2008年1月13日 21:04:00 更新于2008年3月21日 17:51:00
11、编译器在类中添加了材料(The compiler puts stuff in classes)
对于一个类,通常并不是你看见的就是你所获得的,举个例子,对于一个有虚函数的类,它的对象都将含有一个指向虚函数表的指针。而且各种不同的编译器将虚函数指针位于对象的不同位置,永远不要做一些愚蠢的假设某个成员变量的偏移、虚函数表指针偏移是多少!如:
...
对于一个类,通常并不是你看见的就是你所获得的,举个例子,对于一个有虚函数的类,它的对象都将含有一个指向虚函数表的指针。而且各种不同的编译器将虚函数指针位于对象的不同位置,永远不要做一些愚蠢的假设某个成员变量的偏移、虚函数表指针偏移是多少!如:
...
发表于2008年1月13日 16:48:00 更新于2008年3月21日 17:53:00
MFC中包含了一些宏,这些宏内容在DLL定义文件和DLL调用程序中以不同的方式展开,这些宏有
宏名称 宏内容
AFX_CLASS_IMPORT __declspec(dllexport)
AFX_API_IMPORT __declspec(dllexport)
AFX_DATA_IMPORT __declspec(dllexport)
AFX_CLASS_EXPORT __declspec(dllexport)
AFX_API_EXPORT _...
宏名称 宏内容
AFX_CLASS_IMPORT __declspec(dllexport)
AFX_API_IMPORT __declspec(dllexport)
AFX_DATA_IMPORT __declspec(dllexport)
AFX_CLASS_EXPORT __declspec(dllexport)
AFX_API_EXPORT _...
发表于2008年1月3日 20:10:00 更新于2008年1月3日 20:10:00
const 常引用与const reference生命周期延长
常引用
使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下:
const <类型说明符> & <引用名>
例如:
const double & v;
在实际应用中,常指针和常引用往往用来作函数的形参,这样的参数称为常参数。
#include <iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
...
常引用
使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下:
const <类型说明符> & <引用名>
例如:
const double & v;
在实际应用中,常指针和常引用往往用来作函数的形参,这样的参数称为常参数。
#include <iostream>
using namespace std;
class A
{
public:
A(int i);
void print();
const int &r;
...
发表于2007年12月8日 14:15:00 更新于2008年3月21日 19:18:00
9.新型强制转换操作符(new cast operators)
const_cast:对一个表达式添加或者移去const类型
static_cast:用于将一个基类型的指针或者引用转换为子类的指针或引用。
reinterpret_cast:与static_cast在强制转基类指针到子类指针时的区别是--reinterpret只是假装基类指针是一个子类指针而不改变它的值二static_cast则会执行正确的地址操作。
dynamic_cast:典型的特别的应用于安全的向下类型转化(基类指针转到子类指针)。它仅仅在多态类才会起作用,也就是基类必须有虚函数,并且这种强制转换会在运行期间...
const_cast:对一个表达式添加或者移去const类型
static_cast:用于将一个基类型的指针或者引用转换为子类的指针或引用。
reinterpret_cast:与static_cast在强制转基类指针到子类指针时的区别是--reinterpret只是假装基类指针是一个子类指针而不改变它的值二static_cast则会执行正确的地址操作。
dynamic_cast:典型的特别的应用于安全的向下类型转化(基类指针转到子类指针)。它仅仅在多态类才会起作用,也就是基类必须有虚函数,并且这种强制转换会在运行期间...
发表于2007年12月8日 13:42:00 更新于2008年3月21日 19:19:00
7.常指针和指向常量的指针(const pointers) and pointers to const
区别准则:*左边的const都是指向的对象是常量,而*右边的const是指针的指向不能被改变。
如
...
区别准则:*左边的const都是指向的对象是常量,而*右边的const是指针的指向不能被改变。
一个指向常量的指针可能指向是一个非常量对象,但是一个指向非常量的指针不能指向一个常对象。const T *pct= new T;//ptr to const T
T* const pct=new T;//const ptr to T
如
...
发表于2007年12月8日 13:25:00 更新于2008年3月21日 19:19:00
6.用数组作为形参(Array Formal Arguments)
c++中,一个数组名将作为指向第一个元素的指针进行传递。如
void average(int ary[12]);//arg is int*
如果我们要精确的保证传递的数组的边界与函数需要的相同,我们可以使用引用形参, void average(int (&ary)[12]);另一种更传统,使用更广泛的解决方法是显式传递数组的大小,void average(int arg[], int size);
多维数组形参看上去似乎更有挑战性。
void process(int ary[10][20]),因为多维数组是数组...
c++中,一个数组名将作为指向第一个元素的指针进行传递。如
void average(int ary[12]);//arg is int*
如果我们要精确的保证传递的数组的边界与函数需要的相同,我们可以使用引用形参, void average(int (&ary)[12]);另一种更传统,使用更广泛的解决方法是显式传递数组的大小,void average(int arg[], int size);
多维数组形参看上去似乎更有挑战性。
void process(int ary[10][20]),因为多维数组是数组...
发表于2007年12月8日 13:12:00 更新于2007年12月8日 13:12:00
1.数据抽象(data abstraction)
永远都不要随便的为成员变量添加一连串的get/set,这不是数据抽象,这是懒惰和缺乏想象力的表现。
2.多态(Polymorphism)
3.设计模式(design patterns)
设计模式是面向对象设计的方法论,就像快速排序、二分查找对算法一样。选择正确的合适的设计模式去实现一种新的面向对象设计。
4.标准模板库(the standard template library)
STL包含三个主要的构件:容器(container)、算法(algorithms)、迭代器(iterators)
5.引用是别名,不是指针!(re...
永远都不要随便的为成员变量添加一连串的get/set,这不是数据抽象,这是懒惰和缺乏想象力的表现。
2.多态(Polymorphism)
3.设计模式(design patterns)
设计模式是面向对象设计的方法论,就像快速排序、二分查找对算法一样。选择正确的合适的设计模式去实现一种新的面向对象设计。
4.标准模板库(the standard template library)
STL包含三个主要的构件:容器(container)、算法(algorithms)、迭代器(iterators)
5.引用是别名,不是指针!(re...
分类
琐碎文字 As3&Flex RIA UG English CodingArt C++ PHP Webserver E音乐盒 Unity3d C# JS&Html5 Tools mobile golang 最近发表
- golang学习之函数/方法/接口(2022年1月6日 17:50:24)
- golang学习之零值(2022年1月6日 16:38:10)
- hello, 2018(2018年1月15日 22:47:25)
- 字体类型名词解释(2015年1月18日 11:29:14)
- 获取mysql表注释以及列注释(2014年11月13日 15:56:32)
- php连接ms sql数据库的一些问题(2014年9月15日 20:32:14)
- virtualbox虚拟网络:NAT&bridge桥接网络(2014年8月25日 22:51:35)
- php图片加水印(2014年8月15日 22:50:42)
- windows查看端口占用情况(2014年7月31日 21:19:30)
- android安卓activity生命周期(2014年7月12日 10:31:47)
最近回复