自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

转载 (转)#ifndef 与 #program once 的区别

为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #en

2016-06-30 14:57:13 563

原创 STL之multiset

multiset同set相似,唯一的不同就是set中的元素是唯一的,multiset对于同一值可以出现多次,直接就给个基本操作的例子:void func1() { multiset<int> ms; int temp; cout << "请输入值:"; cin >> temp; while (temp != 0) { ms.insert(tem

2016-06-27 09:09:31 261

原创 STL之set

1、set是集合容器,其中的元素是唯一的,集合中元素按一定的顺序排序,元素的插入是按照排序规则进行插入的,所以不能指定插入位置;2、set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树,再插入与删除操作上比vector快3、set不能采用[]或者at()的方式访问数据,也不能按[]的方式插入数据;一、set的基本操作void print(set<int>& s) { set<int>::

2016-06-27 08:46:38 636

原创 STL之priority_queue

priority_queue是优先级队列,主要应用于需要自动排序的情况,比如录入成绩。一、priority_queue的基本操作#include<iostream>#include<queue>#include<functional>using namespace std;void func1() { priority_queue<int> pq1; priority_queue

2016-06-26 20:09:21 263

原创 STL之list

list是双向链表容器一、list的基本操作#include<iostream>#include<list>using namespace std;void print(list<int>& l) { list<int>::iterator it = l.begin(); while (it != l.end()) { cout << *it << " ";

2016-06-26 19:38:27 207

原创 STL之deque

deque是双端数组,跟vector类似,只不过多了从头部添加和删除的操作,直接上例子:1、deque的基本操作#include<iostream>#include<deque>using namespace std;void print(deque<int>& d) { deque<int>::iterator it = d.begin(); for (; it != d.end

2016-06-26 17:10:53 276

原创 STL之vector容器

vector容器是一种动态数组,其本质的实现就是数组。一、vector对象的默认构造vector<int> v1;vector<char> v2;vector<string> v3;vector<CA*> v4; //CA是自定义类vector<CA> v5; //CA是自定义类型vector是一种模板类,可以接受各种数据类型,需要注意的是,对于vector<CA> v5;对于

2016-06-26 15:55:56 351

原创 指针

铁律1:指针也是一种数据类型一、指针1、指针是一种变量,占有内存空间,用来把保存内存地址。指针的大小在32位平台下是4字节,64位平台下是8字节。2、*p操作内存1> *p放在等号左边,相当于对指向的内存空间赋值。#include"stdio.h"#include"stdlib.h"int main() { int a = 10; int *p = &a; *p = 20;

2016-06-26 12:58:00 533

原创 函数调用模型-主调函数与被调函数

一、函数调用模型:返货都是先以返回地址,函数参数,执行状态的顺序依次压栈的,函数执行完毕再从上到下依次弹栈。二、函数调用模型中的内存管理还是以上面那个图为例:1、main函数中,可以在栈区、堆区、全局区开辟空间,这些内存空间都可以在fa和fb函数中使用2、fb函数中,在栈上开辟的内存空间,不能在fa和main函数中使用,因为出了fb函数就被析构掉了。3、fb函数中,在堆区开辟的内存空间,可以在fa和

2016-06-26 10:38:49 3426

原创 栈区的地址增长方向与buf地址的增长方向是两个完全不同的概念

一、栈区的地址增长方向要想验证栈区究竟是开口向上还是开口向下,都进行先压变量a再压变量b的操作,若a的首地址比b的首地址大则说明开口向下,若b的首地址比a的首地址大,则说明开口向上,下面就用代码来验证一下:#include"stdio.h"#include"stdlib.h"int main() { int a; int b; printf("&a : %d\n", &a)

2016-06-26 09:50:33 2052

原创 内存四区之堆栈区

一、堆区先看一个例子:#include"stdio.h"#include"stdlib.h"#include"string.h"char* getval(int num) { char* p = NULL; p = (char*)malloc(sizeof(char) * num); strcpy(p, "123456789"); if(p == NULL)

2016-06-26 08:58:37 1708

原创 静态存储区的内存四区

一、操作系统是如何执行exe程序的?1、操作系统首先把物理磁盘代码load到内存;2、操作系统把C代码分成四分区;3、操作系统找到main函数入口执行二、内存四区1、栈区:局部变量存放的位置,因为局部变量出了作用域会被析构释放空间,所以也叫临时区;2、堆区:需要手动分配和释放内存的区,由malloc和new分配,free和delete释放;3、全局区:全局变量,静态变量,常量存放的位置,相同的常量在

2016-06-25 20:07:39 1787

原创 C语言之变量的本质

一、变量的本质变量的本质是一段连续内存空间的别名,或者说变量是一段连续内存空间的门牌号,画个图:不管是标准数据类型,还是指针(指针也是一种数据类型),都是一样的,都是内存空间的门牌号,千万不好把变量画到内存中去。二、通过变量往内存中进行读写数据三、修改内存的方法1、直接int a = 10;a = 20;2、间接#include"stdio.h"#include"stdlib.h"#inclu

2016-06-25 16:42:19 2753

原创 C语言之数据类型

1、数据类型是固定内存块大小的别名,也就是说申明变量为一种数据类型就是告诉编译器分配多少内存给我。看这么一段代码:#include"stdio.h"#include"stdlib.h"int main() { int a[10]; //告诉编译器分配40个字节 printf("a : %d, a + 1 : %d, &a : %d, &a + 1 : %d\n", a, a

2016-06-25 16:09:54 284

原创 C语言之数组做参数退化问题

先来个冒泡排序的简单实现来说明整个问题:#include"stdio.h"#include"stdlib.h"void print(int a[3], int num) { for (int i = 0; i < num; i++) printf("%d ", a[i]); printf("\n");}void sortfunc(int a[3], int num

2016-06-25 15:30:11 814

原创 STL之string

一、string类型的初始化MSDN上列出的所有String的构造函数: 感觉这里应该少了一种String(int32, char)这个构造函数,例子中会给出的:#include<iostream>#include<string>using namespace std;int main() { char a[11] = "helloworld"; char *p = a;

2016-06-25 10:38:22 2664

原创 设计模式之代理模式

代理都知道是什么意思,一般都有个代理人,一个被代理人,代理人替被代理人完成各种事情。最常见的例子就是现在的网上购物,比如淘宝,当当、亚马逊等,这些网站其实都是在做代理的工作,而被代理人则是那些一个个的店家。不管是代理人还是被代理人他们的工作都是卖东西,代理模式也是同样的一个意思。一、代理模式的条件1、代理类与被代理类共同实现的函数就要由一个抽象类来定义,代理类与被代理类共同实现的函数在抽象类中是纯虚

2016-06-24 16:03:49 451

原创 设计模式之单例模式

单例模式故名思议类只能有一个对象,下面就来说说如何实现只有一个对象的。一、单利模式的三个条件1、类的构造函数是private访问权限; 2、类中定义一个static的类成员对象指针(其访问权限最好是protected,因为是不允许外部通过这个对象指针生成该类的对象的,当然就算不是protected同样也是不能生成该类的对象,因为构造函数已经是private了嘛,当然这里就是一个规范的问题) 3、

2016-06-24 15:43:32 230

原创 C++之类的成员函数的原理

先来一个类的成员函数的例子:#include<iostream>using namespace std;class MyTime {private: int hour; int minute; int second;public: void settime(int h, int m, int s) { hour = h; minut

2016-06-22 11:19:26 1701

原创 C++之内联函数-inline

一、宏函数#define SQR(x) ((x)*(x))优点:不需要调用,直接内嵌到代码段 缺点:直接内嵌造成了代码体积增大,且容易产生歧义, 没有类型检查 二、普通函数int sqr(int x){return x * x;}优点:不会产生歧义,有类型检查,不会增加代码体积 缺点:需要函数调用,增加了压栈弹栈的开销 三、内联函数inline int pow(int x){retur

2016-06-22 11:05:48 435

原创 C++之new

一、new的用法1、开辟单变量地址空间int *p1 = new int; //开辟大小为sizeof(int)空间int *p2 = new int(5); //开辟大小为sizeof(int)空间,并初始化为52、开辟数组空间一维: int* a = new int[100]{0}; //开辟空间并初始化 int **p = new int*[5]{NULL}

2016-06-22 10:24:05 509

原创 C++之异常

一、引入异常的意义1、C语言中错误的处理通常采用返回值的方式或者置位全局变量的方式。这就存在两个问题:1> 如果返回值正是我们需要的数据,且返回数据同出错数据容错差不高。全局变量,在多线程中易引发竞争;2> 而且,当错误发生时,上级错误要出过处理,层层上报,造成过多的出错处理代码,且传递的效率低下,为此C++提供了异常。2、C++的异常处理机制使得异常的引发和异常的处理不必再用一个函数中,这样底层的

2016-06-21 17:52:16 341

原创 C++之流总结

一、流的本质无论是istream,ostream,fstream背后的本质都是FILE*, 同样的道理,可以写一个自己的流类。二、测试案例#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include<stdio.h>using namespace std;class MyStream {public:

2016-06-21 10:56:06 328

原创 C++之cin.eof, cin.bad, cin.good, cin.fail, cin.clear

1、eof()如果读文件到达文件末尾,返回true。2、bad()如果在读写过程中出错,返回true。 例如:当我们要对一个不是打开为写状态进行写入时,或者我们要写入的设备没有剩余空间的时候。3、fail()出了与bad()同样的情况下会返回true以外,加上格式错误也会返回true,例如当想要读入一个整数,但输入了一个字母的时候,或者遇到eof,eof是一种fail,但fail不是一种eof。4、

2016-06-21 10:26:08 8434

转载 C++之(cin)与(!cin)的原理分析

在判断文件打开成功与否或是连续从流中读取数据时,就要用到对流对像的操作,比如if(!cin) 或是 whie(cin) 等等。代码 while(cin>>val),我们都知道 cin 是一个流对象,而>>运算符返回左边的流对象,也就是说 cin>>val 返回 cin,于是 while(cin>>val)就变成了 while(cin),问题就变成了一个流对象在判断语句中的合法性。不管是 while(

2016-06-21 09:58:07 3119

原创 C++之fstream

一、ifstreamifstream只能定义文件输入流对象:#include<iostream>#include<fstream>using namespace std;int main() { ifstream fs("abc.txt"); if (!fs) cout << "open error" << endl; else cout <

2016-06-21 09:38:03 2073

原创 C++之cin.ignore, cin.peek, cin.putback

1、cin.ignoreistream& ignore(streamsize n = 1, int delim = EOF)功能:跳过流中n个字符,或者遇到结束符为止,第一个参数默认跳过一个字符,第二个参数默认为eof2、cin.peekint peek()功能: 窥视最近一次移动的指针,函数本身并不操作指针3、cin.putbackistream& putback(char c)功能:将字符c插入

2016-06-20 19:28:03 1559

原创 C++之cin.getline

#include<iostream>#include<string.h>using namespace std;int main() { char buf[1024]; cin.getline(buf, 10, 'i'); cout << buf << endl; memset(buf, 0, sizeof(buf)); cin.getline(buf, 1

2016-06-20 19:09:30 297

原创 C++之cin.get

一、cin的>>运算符重载 cin的>>运算符重载有个缺陷,则是遇到空格,tab键,回车都会当做结束符,举个例子:#include<iostream>using namespace std;int main() { char buf[1024]; cin >> buf; cout << buf << endl; system("pause"); return

2016-06-20 16:31:22 1728 1

原创 C++之cout

一、流算子以往要输出不同进制的数值,需要先unsetf取消当前进制,setf设置当前进制,下面给出了代码例子:#include <iostream>using namespace std;int main(){ int a = 0x12345678; cout.unsetf(ios::dec); cout.setf(ios::hex); cout << "十六机制:

2016-06-20 09:12:32 1819

原创 C++之IO流

一、IO流的关系图这两个图很清楚的表示了各个类的继承关系,第二个图中的白框代表类,黑框代表对象,尖括号代表头文件。二、IO对象不能复制或赋值fstream fs1, fs2;fs2 = fs1;fstream fs3(fs2);这种发生赋值运算符重载和拷贝构造的行为都是不允许的。因为在ios_base中拷贝构造和赋值运算符重载都是私有权限的://ios_base中的源码private:

2016-06-20 08:36:24 494

原创 Cocos2d-x之层间切换

先说一下CCObject派生子类CCNode,不管是CCScene、CCLayer、CCSprint、CCMenu都可以加入到CCNode当中。同时CCNode也可以放入到CCScene和CCLayer中。游戏中的按钮操作就是通过CCMenu来实现的,说白了就是个菜单,并不叫按钮。第一个层的代码://BackGroundLayer.h#pragma once#ifndef _BACKGROUND

2016-06-19 19:48:00 916

原创 Cococs2d-x之第一个层

一、游戏入口WinMain ---> APPDeleGate ---> applicationDidFinishLaunching游戏最终在从APPDeleGate 中的applicationDidFinishLaunching这个函数开始的,关于applicationDidFinishLaunching函数,这里涉及到一个完美的多态的实现。二、游戏结构设计一个游戏是由多个场景构成的,一个场

2016-06-19 15:51:28 403

原创 Cococs2d-x之解决cocos2d项目编译速度慢的问题

由于在创建cocos2d项目之后,系统会自动把cocos2d引擎带的那一套链接到新创建的项目上,我们只想要个helloworld你就要把一整套都弄进来,编译半天,欺负人啊有木有,这里给出一种解决方案: 1>先在cocos里把自带的那一套编译一遍,第一次漫长的编译是死活也逃不过了,等半天之后Debug.win32中就会出现这么一堆lib和dll文件,这就是我们要的。 2>先用vs打开新创建的项目,

2016-06-19 11:42:08 1598

原创 Cocos2d-x之helloworld

安装配置完成之后,不管啥玩意第一步肯定就是建一个helloworld来玩玩啦,先说个简单的创建helloworld的方式:一、创建方式One1>首先打开cocos:2>点击新建项目:点击完成就创建好了3>调到~\helloworld\proj.win32中,双击helloworld.sln文件用vs打开:4>在vs中编译生成一下(这个编译生成比引擎自带的那个可快多了),就得到下面的图啦:堪称完美,再

2016-06-19 08:51:56 245

原创 Cocos2d-x之下载安装和配置

一、下载1.Cococs2d-x下载地址http://www.cocos.com/download/#推荐下载cocos2d-x-v3.10版本,自带创建项目的cococs软件,就不用在cmd中敲命令了(不过敲命令还是显得高大上一些)。2.Android NDK和Android SDK的下载地址:http://store.cocos.com/stuff/category/1/score_count.

2016-06-19 08:00:45 4637

原创 Cocos2d-Lua之面向对象的继承

--UsrClass.lua文件local Usr = class("Usr")--id,name,age分别为Usr.id = 1Usr.name = "张三"Usr.age = 20function Usr:ctor(name, num, age) self.name = name self.id = num self.age = age print("

2016-06-18 10:36:00 568 2

原创 Cocos2d-Lua之面向对象的封装

Lua作为一门脚本语言,不同于C++,java这类的高级语言,Lua中的面向对象只能通过封装与继承(只能是单继承)实现,并没有多态,连重载都不支持的Lua拿什么资本支持多态呢。先说一下类的格式:local 类名 = class("类名")--类内部定义的成员函数和成员变量return 类名举个例子:--UsrClass.lua文件local Usr = class("Usr")--id,name,

2016-06-18 09:40:58 1374

原创 Cocos2d-Lua之闭包

对于function中定义的local变量只能活在这个function中,出了这个function就不存在了。function bag(a) local x = a x = x + 1 print(x)endfor i = 1, 10 do bag(3) bag(10) print("-----------------")end输出结果:这样的输出

2016-06-18 08:43:42 541

原创 Cocos2d-Lua之协同程序

协同程序与操作系统中的线程类似,但工作方式是不同的,例如线程的时间片调度算法,当某个线程的时间片用完,系统会自动让该线程等待,让后面的线程运行。而对于协同程序,除非一个正在运行的协同程序被挂起,否则就一直运行到结束才能让其他协同程序运行。举个例子:function coroutineFun() local co = coroutine.create(function(a, b)

2016-06-18 08:04:27 720

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除