c++
偶尔e网事
折腾族:https://fusijie.github.io
展开
-
char*,string,CString,int,char[]之间的转换
CString 头文件#include string 头文件#include CString 转char *CString cstr;char *p = (LPSTR)(LPCTSTR)cstr;string 转 CStringCString.format(”%s”, string.c_str());char 转 CStringCString原创 2013-08-17 11:00:29 · 3462 阅读 · 0 评论 -
【C++基础之十六】数组传参
1.一维数组数组作为传参,其实传入的只是数组的首地址。实质上也是值拷贝。调用函数内部会有一个备份,这个备份指向了数组的首地址,所以数组元素可以在调用函数中被改变。由于调用函数只知道数组的首地址,并不知道数组元素的个数,所以一般我们将数组元素个数也传入。第一种实现:int sum(int array[3]);int sum(int array[3]){ int value=0;原创 2013-09-28 20:08:15 · 9660 阅读 · 0 评论 -
【数据结构之排序2】直接插入排序
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。本节介绍两种插入排序方法:直接插入排序和希尔排序。直接插入排序基本思想1.基本思想假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次转载 2013-10-21 15:49:08 · 2599 阅读 · 0 评论 -
【C++基础之二十一】菱形继承和虚继承
菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之于接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能出现的各种问题。1.菱形继承先看一下菱形继承长什么样。B和C从A中继承,而D多重继承于B,C。那就意味着D中会有A中的两个拷贝。因为成员函数不体现在类的内存大小上,原创 2014-01-05 09:05:41 · 34715 阅读 · 2 评论 -
【C++基础之十一】虚函数的用法
虚函数的作用和意义,就不进行说明了,这里主要讨论下虚函数的用法。1.典型的虚函数用法可以看到,只有标识为virtual的函数才会产生多态的效果,而且是编译多态。它只能借助指针或者引用来达到多态的效果。class A{public: virtual void f(){cout<<"A::f()";}//虚函数 void g(){cout<<"A::g()";}//普通原创 2013-09-22 15:38:42 · 9611 阅读 · 2 评论 -
【C++基础之二十】可变参数的函数
C++中可变参数的函数是从C中继承而来,可变参数的函数是指函数的参数个数可变,参数类型不定的函数。我们最常见的就是printf()。1.可变参数函数实现原理指定参数的函数实现很简单,通过通过指定的参数名访问就行了。但是如果不指定的呢?函数的调用的参数会进行压栈处理,详细可见此文函数调用机制。而对参数的压栈是从右到左进行压栈。而参数和参数之间存放是连续的,也就是说,只要知道第一个参数原创 2013-12-24 09:55:02 · 32830 阅读 · 2 评论 -
【C++基础之十七】抑制由构造函数定义的隐式转换
有时候构造函数的隐式转换可以帮我们不少忙,但有时候它也会帮倒忙。所以我们应该要控制它,而不是让它无脑操作。1.示例先看一段代码。#include "stdafx.h"using namespace std;class A{public: A(int v):var(v){};//带一个int型值的构造函数 bool isSame(const A& ref) cons原创 2013-11-28 15:38:30 · 4019 阅读 · 0 评论 -
【C++基础之十八】类继承中的隐藏规则
记得以前看林锐博士的《高质量C++编程指南》一书有提到类继承中的隐藏问题,当时网上也有不同的声音,觉得并没有隐藏这个东西,后来在看C++ primer的时候确实有提到这个问题(谓之“屏蔽”),这里记下来,如果理解有误,还请指出。1.重载和覆盖在了解隐藏之前,得先分清楚重载和覆盖。(1)重载:对同一个类而言的,函数名相同,函参不同,因为是在同一个类中,所以是否是virtual并不原创 2013-12-10 15:01:46 · 3640 阅读 · 6 评论 -
【C++基础之一】静态变量的分配空间与LNK2001错误
今天写一个单例类,在使用静态变量的时候发现了一个之前没有注意到的问题,这里总结并记录一下。先看这个单例类:Singleton.h#pragma onceclass CSingleton{public: CSingleton(void); ~CSingleton(void); static CSingleton* getSingleton(); int a;privat原创 2013-09-09 09:05:46 · 8129 阅读 · 10 评论 -
【C++基础之十三】指向指针的指针
话说这玩意真不好理解,一般也不会用到,不过还是拿出来看看,叔到用时方恨嫂啊!我们从一个例子来看它。1.一个常见的错误这个错误在第三篇局部变量的返回里就有讲过了。详见http://blog.csdn.net/jackystudio/article/details/11523353因为系统会自动拷贝一个char* p,然后给p分配空间,调用结束后p指向的空间产生内存泄漏。而te原创 2013-09-24 17:31:30 · 8203 阅读 · 4 评论 -
【C++基础之八】函数指针和回调函数
C++很多类库都喜欢用回调函数,MFC中的定时器,消息机制,hook机制等待,包括现在在研究的cocos2d-x中也有很多的回调函数。1.回调函数什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。B函数就是回调函数,而通常情况下,A函数是系统在符合你设定条件的情况下会原创 2013-09-16 09:40:06 · 35076 阅读 · 5 评论 -
【C++基础之十五】内联函数
1.优点为什么使用内联函数,而不使用宏定义,虽然宏本身采用的展开来替代函数调用的压栈出栈返回等操作,提高了代码的效率,但是会有两个问题:(1)边际效应宏只是展开代码而已,所以在一些操作符的优先级问题使用上很容易出现异常。#define ADD(x,y) x+y;int _tmain(int argc, _TCHAR* argv[]){ cout<<3*ADD(1,2);原创 2013-09-26 17:32:26 · 3126 阅读 · 0 评论 -
【C++基础之十四】函数的缺省参数
可能会有这么一个函数,在大部分的情况下,我们不用给它传递参数,但在某些特殊情况下,我们需要给它传递参数,那怎么办呢?简单啊,写两个一样的方法,一个带参,一个不带参。。。这样也太没水准了。来点高端的。。。函数的缺省!函数的缺省,在编译的时候,默认参数由编译器自动插入。这里主要要注意两点。1.缺省值只能出现在声明中,而不能出现在定义里void foo(int a=0);原创 2013-09-25 17:32:24 · 5407 阅读 · 0 评论 -
do...while(0)的妙用
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1. do...while(0)消除goto语句。通常,如果在转载 2013-08-28 08:59:52 · 2289 阅读 · 0 评论 -
【C++基础之六】运算符的重载
网上太多有关运算符的重载了,但是写的太过的详细,不适合新手入门,特别是那什么++和--的前增量后增量重载,一元二元运算符重载,特殊运算符,下标运算符,new和delete,甚至是指针运算符的重载,吓退了多少小伙伴啊。。我这里就写个最基础的,其实原理和写法都差不多,举一反三,多动手才能写好代码。1.概述什么是运算符重载?如果你想让1+1=0,那么就需要让+号不再是相加的意思,而是原创 2013-09-13 15:13:16 · 17246 阅读 · 3 评论 -
【C++基础之七】extern关键字
1.作用(1)放在函数或者变量前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(2)与“C”连用,作为连接指定。2.具体解释及示例2.1.extern的变量和函数声明extern用于修饰变量或函数,用于声明当前变量或函数可以在本模块或者其他模块中使用。不过要记住的是extern只是声明,而不是定义,也就是说extern并不分配空间。原创 2013-09-14 09:35:53 · 11829 阅读 · 2 评论 -
【C++基础之三】函数中局部变量的返回
一般说来,函数中是可以进行局部变量的返回的,不然岂不是全部要用全局变量,如果使用了全局变量,那还有必要进行返回吗?那函数就没有它存在的意义了!但是要注意了,这里所谓的局部变量的返回很有内涵,什么样的值才可以进行返回而不出错? 其实,只要遵守一句话即可:函数不能返回指向栈内存的指针! 为什么?因为返回的都是值拷贝! 我们知道,局部变量的作用域是函数内原创 2013-09-10 14:45:11 · 15815 阅读 · 3 评论 -
【C++基础之四】深拷贝和浅拷贝
1.普通类型对象的拷贝普通类型对象的拷贝很简单,就是值的复制而已。比如:int _tmain(int argc, _TCHAR* argv[]){ int a=1; int b=a; return 0;}2.类对象的拷贝类对象的拷贝相比于普通类型的拷贝就复杂多了,它存在着各种成员变量。比如:CopyTest.hclass CCopyTest{publi原创 2013-09-11 09:47:52 · 7461 阅读 · 5 评论 -
【C++基础之五】函数调用机制与调用约定
1.示例栈的作用和功能这里就不再叙述了。先看一个最简单的函数调用例子:#include "stdafx.h"int call(int _a,int _b);void _tmain(){ int a=1; int b=2; int c=call(a,b);}int call(int _a,int _b){ return _a+_b;}main函数中调用ca原创 2013-09-11 14:59:54 · 6215 阅读 · 0 评论 -
【C++基础之九】单例模式
1.作用单例模式目的就是为了保证一个类只有一个实例。2.原理(1)私有静态指针变量实现:使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。(2)静态局部变量实现:在公有静方法中定义指向该类的一个静态局部变量,并返回该静态局部变量。3.实现3.1.私有静态指针变量实现3.1.1.特点A.它有唯一一个私有的、指向类的的静态成员指原创 2013-09-17 11:49:43 · 5665 阅读 · 1 评论 -
【C++基础之十】友元函数和友元类
1.概述友元提供了一种 普通函数或者类成员函数 访问另一个类中的私有或保护成员 的机制。也就是说有两种形式的友元:(1)友元函数:普通函数对一个访问某个类中的私有或保护成员。(2)友元类:类A中的成员函数访问类B中的私有或保护成员。2.特性优点:提高了程序的运行效率缺点:破坏了类的封装性和数据的透明性。3.实现3.1.友元函数3.1.1.原创 2013-09-18 11:40:06 · 37143 阅读 · 4 评论 -
【C++基础之十二】虚函数表和覆盖机制
1.引出我们先来看个例子://空类class A{};//int成员变量class B{ int value;};//普通成员方法class C{ void f(){};};//虚函数class D{ virtual void g(){};};//两个虚函数class E{ virtual void g(){}; vi原创 2013-09-23 17:33:46 · 6197 阅读 · 12 评论 -
【C++基础之二】常量指针和指针常量
1.常量指针定义:具有只能够读取内存中数据,却不能够修改内存中数据的属性的指针,称为指向常量的指针,简称常量指针。声明:const int * p;注:可以将一个常量的地址赋值给一个对应类型的常量指针,因为常量指针不能够通过指针修改内粗数据。只能防止通过指针引用修改内存中的数据,并不保护指针所指向的对象。2.指针常量定义:指针常量是指指针所指向的位置不能改变,即指针本身原创 2013-09-10 11:27:26 · 37347 阅读 · 12 评论 -
【C++基础之十九】函数对象
函数指针倒是蛮常见的,这函数对象又是什么呢?什么时候会用到函数对象?1.什么是函数对象函数对象就是定义了函数调用操作符,也就是operate()的对象。因此我们可以在定义函数调用操作符的时候,实现所需的函数功能。2.示例如上,其实最主要的还是operate()的定义,这和普通运算符的重载是一样的。[cpp] view pl原创 2013-12-20 09:05:47 · 3598 阅读 · 0 评论