
C++
文章平均质量分 57
新一下的兰天
紧要关头不放弃,绝望就会变成希望
展开
-
VS C++调用Lua动态链接库
这里使用的是VS2019,其他版本类似新建一个控制台应用创建好工程后,打开工程属性页进入C/C++ —> 常规—> 附加包含目录,将lua的头文件目录包含进去进入链接器 —> 输入 —> 附加依赖项,将VS编译lua-5.4.2库生成的lib文件进行添加进入链接器 —> 常规—> 附加库目录,将VS编译lua-5.4.2库生成的lib文件所在位置进行添加最后,将VS编译lua-5.4.2库生成的dll放到工程的可执行文件所在..原创 2021-03-17 13:10:36 · 790 阅读 · 0 评论 -
Qt C++调用Lua动态链接库
新建一个C++工程创建好结构如下选中工程,右键选择“添加库”选择外部库选择通过VS编译lua-5.4.2库方式创建的lib库,和要包含的头文件目录,我把包含的头文件目录和lib都放在了一个文件夹下点击下一步,就会在工程的pro文件下添加如下内容:最后就可以调用lua库的各种函数啦这里给出个小案例:#include <iostream>extern "C" {#include "lua.h"#include "lualib.h"#include "lauxlib原创 2021-03-17 12:02:16 · 501 阅读 · 0 评论 -
VS编译lua-5.4.2库
首先登陆Lua官方下载Lua源码包“lua-5.4.2.tar”一、编译Lua5.4.2这里使用的VS2019(其他版本类似哈),创建一个动态链接库的项目这里起名叫“Lua5.4.2”解压官方下载的源文件包lua-5.4.2.tar,将解压后的src目录copy至当前工程所在目录,并将src目录下所有的 .c和.h文件添加至当前工程更改工程配置属性“C/C++ => 预编译头”为“不使用预编译头”编译工程,提示错误如下需要找到“lua.c”和“luac.c”源文件,将其中的“原创 2021-03-17 11:50:06 · 870 阅读 · 0 评论 -
++a与a++效率问题
a=a+1,是先取a的值,再进行加加操作,它等同于a++。a+=1,是先对a进行加1操作,在返回a的值,它等同于++a。另外a++ 直接对内存中的值进行加1,并将结果写入内存,更效率。a=a+1 先申请一块内存空间,分别把变量a 和常量1 放入累加器中计算,再把计算结果放到内存中。最后,这三类指令在编译成汇编指令的时候也会有一定的差异,导致运行效率的变化。...原创 2020-07-20 19:58:18 · 545 阅读 · 0 评论 -
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 · 940 阅读 · 0 评论 -
Cococs2d-x之第一个层
一、游戏入口WinMain ---> APPDeleGate ---> applicationDidFinishLaunching游戏最终在从APPDeleGate 中的applicationDidFinishLaunching这个函数开始的,关于applicationDidFinishLaunching函数,这里涉及到一个完美的多态的实现。二、游戏结构设计一个游戏是由多个场景构成的,一个场原创 2016-06-19 15:51:28 · 429 阅读 · 0 评论 -
C++之IO流
一、IO流的关系图这两个图很清楚的表示了各个类的继承关系,第二个图中的白框代表类,黑框代表对象,尖括号代表头文件。二、IO对象不能复制或赋值fstream fs1, fs2;fs2 = fs1;fstream fs3(fs2);这种发生赋值运算符重载和拷贝构造的行为都是不允许的。因为在ios_base中拷贝构造和赋值运算符重载都是私有权限的://ios_base中的源码private:原创 2016-06-20 08:36:24 · 522 阅读 · 0 评论 -
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 · 1866 阅读 · 0 评论 -
当define或者typedef遇到模板
#define defNode Node<int>template<typename T>struct Node { T *date; Node<T> *Lchild, *Rchild;};defNode InitBiTree(defNode root) { return root;}如果要用define宏定义一个与模板相关的类型,一定要显示指明是什么类型,模糊的类型原创 2016-07-27 11:53:50 · 2238 阅读 · 0 评论 -
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 · 1828 阅读 · 1 评论 -
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 · 322 阅读 · 0 评论 -
C++之运行时类型信息(RTTI)
运行时类型信息RTTI(run time type identification)就两个:typeid和dynamic_cast。其类型信息来自于运行时,所以这两个主要应用于实现多态的父子类之间。一、typeidtypeid是一种运算符,可以获得变量包括对象的类型,作为一个获取运行时类型信息的运算符,目的并不是获取普通变量的类型,而是对象指针的类型。#include<iostream>#inclu原创 2016-06-16 20:10:32 · 1062 阅读 · 0 评论 -
C++之构造函数为什么不能为虚函数
针对虚函数在说虚函数表的时候已经说过了 C++之虚函数表,虚函数的运行是根据虚函数表,而虚函数表是在对象生成后,释放前才存在的,构造函数就是来生成对象的,对象还没有生成,就把构造函数声明为了虚函数,放到了虚函数表中,可是虚函数表又不存在,这就矛盾了,故当然不可以把构造函数声明为虚函数,如果这么做了,编译器直接报错。举几个例子实实在在的展示一下虚函数表的生命周期:public: Father(原创 2016-06-16 16:56:27 · 787 阅读 · 0 评论 -
C++之静态成员函数为什么不能为虚函数
应该知道静态成员函数属于类,也属于对象,但终归属于类,他在内存中只有一份。而虚函数必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以的,两者一个终归属于类,一个必依赖于对象,那么终归是不能合二为一的原创 2016-06-16 15:58:08 · 3467 阅读 · 1 评论 -
C++之虚函数表
虚函数是C++实现多态的一种重要方式,那么虚函数是如果进行工作的,这就依赖于虚函数表,虚函数表是对象生成时自动生成的,当对象释放时,虚函数表也会自动消失,这一切对程序员都是透明的。class Base {public: virtual void f(){cout << "Base::f()" << endl;} virtual void g(){cout << "Base::g()原创 2016-06-16 15:31:38 · 585 阅读 · 0 评论 -
指针常遇到的问题
指针是个涉及到内存,很容易产生bug的根源,总结了几点指针容易出错的问题:1、对于多级指针,不要在多个函数中分配内存空间,例如:void func(char** p){ for(int i = 0; i < 5; i++){ p[i] = (char*)malloc(sizoef(char) * 100); }}int main(){ char** p =原创 2016-07-19 10:13:24 · 1023 阅读 · 0 评论 -
C++之派生类的拷贝构造与赋值运算符重载
这里只说一下为什么派生类在拷贝构造器和赋值运算符重载中一些注意语法: 一、派生类的拷贝构造器1.派生类的拷贝构造器跟普通构造器一样,若没有自定义生成,编译器会自动生成拷贝构造器,自动调用父类的拷贝构造器(不管父类的拷贝构造是否自定义或编译器自动生成)。2.若派生类的拷贝构造器自定义生成,则一定要显示调用父类的拷贝构造器(不管父类的拷贝构造器是否自定义或编译器自动生成),否则编译可以通过,But拷贝原创 2016-06-09 19:28:09 · 4938 阅读 · 1 评论 -
(转)#ifndef 与 #program once 的区别
为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #en转载 2016-06-30 14:57:13 · 585 阅读 · 0 评论 -
C++之继承类中的this指针
#include<iostream>#include<typeinfo>using namespace std;class A {public: A() { cout << this << endl; cout << typeid(this).name() << endl; cout << "&a = " << &a << endl;原创 2016-06-14 19:49:14 · 1767 阅读 · 0 评论 -
C++之模板
模板主要应用于泛型编程,现在主要就是非常火的STL(标准模板库),对于公司项目来说利用模板的可能性不大,一般一个项目是无法达到模板这个要求的。一、函数模板函数模板的要求是:1、函数名一致 2、参数个数一致 3、函数体一致 4、参数类型不同函数模板的格式:template<class/typename T1, class/typename T2, ...>返回类型 函数名(参数列表){原创 2016-06-17 16:31:44 · 282 阅读 · 0 评论 -
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 · 1647 阅读 · 0 评论 -
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 · 2113 阅读 · 0 评论 -
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 · 3180 阅读 · 0 评论 -
把单一元素的数组放在一个struct的尾端,则每个struct objects就拥有了可变大小的数组
标题是《深度探索C++对象模型》(《Inside The C++ Object Model》)中的一句话,其中给出的例子如下:strcutmumble{charpc[1];};strcutmumble*pmumbl=(structmumble*)malloc(sizeof(structmumble)+strlen(str...原创 2019-06-04 21:06:22 · 637 阅读 · 0 评论 -
宏定义
宏定义不管在C还是C++中都经常用到,其用法是个比较神奇的东西,宏定义不表示任何类型,同样也表示任何类型,这也是宏定义的一个优点,宏函数类似C++的函数重载,可以用于任何类型,但不进行类型检查,宏定义实际代表的就是一个字符串,比如下面这段代码#include<iostream>using namespace std;#define M int main(M) { cout << "hello原创 2016-08-15 09:34:09 · 358 阅读 · 0 评论 -
自动类型转换
我们都知道多数编程语言都有类型自动转换的功能,那到底那些类型之间可以自动转换呢,一般主要遵循两点: 1、目标类型与源类型兼容,比如double和int之间2、目标类型大于源类型,比如double占8字节,int占4字节,那么当把一个int类型赋给一个double类型的变量时,int可以自动转换成double类型在java中类型比C++更严格,java不能从double类型自动转换成int,但C++原创 2016-08-10 15:36:58 · 340 阅读 · 0 评论 -
指针的引用遇到的内存释放问题
先来一段程序:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string.h>using namespace std;int getMem(char* &p) { int ret = 0; if (&p == NULL) { cout << "func getMem &p == NULL err原创 2016-08-08 10:42:24 · 1890 阅读 · 0 评论 -
当函数重载遇上函数指针
#include<iostream>#include<string>using namespace std;void func() { cout << "void func()" << endl;}void func(int a) { cout << "void func(int a)" << endl;}void func(int a, int b) { cout <原创 2016-08-08 09:41:18 · 1166 阅读 · 0 评论 -
格式化操纵算子
详细内容看《C++编程思想》 按照书里面的代码敲得,这里只说明一点:T.setf(0, ios::floatfield);第一个参数为0,对于这句automatic的格式化,是精度域指整个有效数字的数目, 而ios::scientific和ios::fixed的精度域都是指小数点后面的数字数目,这点注意区分,当第一个参数为0,即automatic情况下,若精度域小于所给变量的精度,则会自动变成科学原创 2016-08-17 10:21:05 · 497 阅读 · 0 评论 -
字符串的操作
一、字符串的初始化 1、定长字符数组1>char buf1[128] = {'a', 'b', 'c', 'd'};printf("sizeof(buf1) = %d\n", sizeof(buf1)); //128printf("strlen(buf1) = %d\n", strlen(buf1)); //4printf("buf1[66] : %d\n", buf1[66])原创 2016-07-08 23:21:03 · 1014 阅读 · 0 评论 -
指针
铁律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 · 587 阅读 · 0 评论 -
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 · 1734 阅读 · 0 评论 -
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 · 461 阅读 · 0 评论 -
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 · 537 阅读 · 0 评论 -
C++之引用
引用相当于给变量起个别名,并不分配内存空间,C++中话是这么说,但实际上这个引用就相当于C语言中的指针,实际是开辟了4字节的空间,与开辟指针大小的空间相同,且指向变量的地址。引用相当于指针,其引用的大小与指针大小相同,但当打印sizeof时,打印出的就是变量的大小,这就是C++中做的一种蒙蔽。例如:int a = 200;int &ra = a;ra = 300; //ra可以修改值int原创 2016-05-19 20:10:01 · 290 阅读 · 0 评论 -
C++之双目运算符重载
运算符重载可以友元重载,也可以成员函数重载,但两者是不能共存的。因为这会造成二义性,再一次强调,计算机最讨厌的就是让他做选择。同时有的运算符只支持友元重载,有的则只能成员函数重载,在后面的详细说明中,再区分,先举个例子:一、友元重载:class Complex{private: float _x; float _y;public: Complex(float x = 0,原创 2016-06-04 08:55:06 · 1584 阅读 · 1 评论 -
C++之异常
一、引入异常的意义1、C语言中错误的处理通常采用返回值的方式或者置位全局变量的方式。这就存在两个问题:1> 如果返回值正是我们需要的数据,且返回数据同出错数据容错差不高。全局变量,在多线程中易引发竞争;2> 而且,当错误发生时,上级错误要出过处理,层层上报,造成过多的出错处理代码,且传递的效率低下,为此C++提供了异常。2、C++的异常处理机制使得异常的引发和异常的处理不必再用一个函数中,这样底层的原创 2016-06-21 17:52:16 · 362 阅读 · 0 评论 -
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 · 341 阅读 · 0 评论 -
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 · 8679 阅读 · 0 评论 -
C++之虚析构函数
先给个例子:class Animal{public: Animal(); ~Animal(); virtual void voice() = 0;};Animal::Animal(){ cout << "Animal()" << endl;}Animal::~Animal(){ cout << "~Animal()" << endl;}class原创 2016-06-13 16:09:32 · 272 阅读 · 0 评论