C/C++编程
文章平均质量分 56
our2848884
我是一只螃蟹……
展开
-
C++之构造函数
构造函数的作用是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方法。如果一个类中没有定义任何构造函数,那么C++编译器在某些情况下会为该类提供一个默认的构造函数,这个默认的构造函数是一个不带参数的构造函数。只要一个类中定义了一个构造函数,不管这个构造函数是否是带有参数的构造函数,C++编译器就不再提供默认的构造函数。也就是说,如果为一个类定义了一个带参数的构造函数,还想要无参数的原创 2017-04-17 15:17:53 · 222 阅读 · 0 评论 -
C++之类的构造与析构(三)
类的赋值操作 前文我们说到,在什么情况下我们需要自定义复制构造函数。现在我们再来讲讲类的赋值操作是否也需要重载。我们先来看个例子。 1: #include 2: using namespace std; 3: 4: class Test 5: { 6: public: 7: 8: Test(char* p) 9:原创 2017-04-17 15:28:40 · 185 阅读 · 0 评论 -
C++之类的构造与析构(二)
构建自己的复制构造函数 上一篇文章简单地介绍了类的构造函数和析构函数,这里我们讨论一下,什么情况下我们必须定义自己的复制构造函数。同默认构造函数一样,如果我们没有定义复制构造函数,编译器在编译时会为我们自动生成一个复制构造函数。但是在有些情况下,编译器自动生成的复制构造函数会产生很严重的问题。读者现在可能还不知道,我们看个简单的例子。 1: #include 2:原创 2017-04-17 15:28:35 · 186 阅读 · 0 评论 -
C++之类的构造与析构(一)
今天我们了解一下类的构造函数、析构函数。其中构造函数会提到默认构造函数、重载构造函数和复制构造函数。好了,现在开始我们的旅程吧。 首先温习一下C和C++中分配内存的方法。我们知道,C中的malloc/free和C++中的new/delete是用来分配内存和释放内存的,这里的内存是前面博文提到的“堆”。(如果不了解什么是堆,请参考文章《C\C++的内存存储》 )他们的区别如下:原创 2017-04-17 15:28:31 · 300 阅读 · 0 评论 -
C++之#progma pack预处理
前文我们简单地介绍了一下C\C++中的预处理,现在我们再来了解一下#progma pack的使用方法。 #progma pack ([n])表示内存对齐,目的是为了优化内存,减少内存碎片,使得内存按照一个固定的规则进行分配,让分配的内存总是n的倍数,避免随意分配内存大小。举个例子,我们在Visual C++中编写如下的类, class X { int a; ch原创 2017-04-17 15:28:26 · 562 阅读 · 0 评论 -
C++之预处理
预处理是指在进行程序编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。预处理是C语言一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译。 预处理程序(预处理器)包含在编译器中。预处理程序首先读源文件,预处理的输出是“翻译单元”,它是存放在内存中的临时文件。编译器接受预处理的输出原创 2017-04-17 15:28:21 · 260 阅读 · 0 评论 -
C与C++的区别
C语言 C语言是面向过程的语言,特点是 程序=算法+数据结构C++语言 C++语言是面向对象的语言,特点是 对象=算法+数据结构程序=对象+对象+...+对象未完待续!原创 2017-04-17 15:28:18 · 322 阅读 · 0 评论 -
【原创】在VS2010中使用Git管理源代码
前文我们讲了使用TortoiseGit管理源代码,但是对于使用VS2010的朋友来说,源代码管理起来还是不怎么方便。要是直接在VS2010中能使用Git就好了,下面我们就来看看怎么在VS2010中使用Git的功能。 主要是分成两个步骤 1 安装 打开VS2010,选择Tools->Extension Manager; 选择左侧的“online gallary”,在搜原创 2017-04-17 15:27:37 · 662 阅读 · 0 评论 -
C++之内存存储
在C\C++中,通常可以把内存理解为4个分区:栈、堆、全局/静态存储区和常量存储区。下面我们分别简单地介绍一下各自的特点。 1 栈 通常是用于那些在变异期间就能确定存储大小的变量的存储区,用于在函数作用域内创建,在离开作用域后自动销毁的变量的存储区。通常是局部变量,函数参数等的存储区。他的存储空间是连续的,两个紧密挨着定义的局部变量,他们的存储空间也是紧挨着的。栈的大小是有限的原创 2017-04-17 15:27:34 · 163 阅读 · 0 评论 -
【原创】C++之extern \"C\"的含义
extern "C"的含义是编译生成的内部符号名使用C语言的规则。我们需要知道的是,对于不同的编译器,在编译一个函数时,编译出来的函数名称或参数排列的顺序可能是不同的。例如,我们假设某个函数的原型为:void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(_foo_int_int这样的名字原创 2017-04-17 15:26:48 · 379 阅读 · 0 评论 -
C++之构造函数
构造函数分几种,默认构造函数,构造函数,和复制构造函数。需要特殊强调的是复制构造函数。编辑器主要在以下两种情况下调用复制构造函数。1)类的对象作为实参时,会调用复制构造函数,将值传递给形参;2)使用=操作符实现值传递,例如classX x=y; (y是classX的一个对象) 见代码:#include iostream>using namespace std;struct demo{ dem原创 2017-04-17 15:26:03 · 206 阅读 · 0 评论 -
内存池
1.为什么需要内存池 为什么需要内存池? a. 在大量的小块内存的申请和释放的时候,能更快地进行内存分配(对比malloc和free) b.减少内存碎片,防止内存泄露。 2.内存池的原理 内存池的原理非常简单,用申请一块较大的内存来代替N多的小内存块,当有需要malloc一块比较小的内存是,直接拿这块大的内存中的地址来用即可。 当然,这样处理的缺点也是很明显的,原创 2017-04-17 15:21:38 · 234 阅读 · 0 评论 -
C++之类的继承
1 继承与派生 前几天讲了类的构造函数和析构函数,今天跟大家学习一下类的继承的知识。 继承是面向对象程序设计中最重要的机制。通过继承机制,可以利用已经有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有自己新定义的成员,而且还同时拥有旧的成员。通常把被继承的类称为基类或父类,继承它的类称为派生类或子类。 下面我们给一个简单的例子,让大家原创 2017-04-17 15:29:33 · 297 阅读 · 0 评论 -
C++之虚函数
什么是虚函数?为什么要提出虚函数?本文就来为大家解惑。 1 虚函数 虚函数是C++继承中最丰富的一段知识,它是C++用于实现多态的机制。有继承才会有虚函数。我们在需要实现多态的函数前面加上一个virtual,就可以通过父类指针随意地调用各个子类的同名函数,用一个指针实现了不同的运行效果,达到多态的目的。这就是常说的虚函数的主要用途。我们看个例子。 1: #include原创 2017-04-17 15:29:36 · 307 阅读 · 0 评论 -
对friend std::ostream & operator<< 的简单学习
#include using namespace std ;class Tree{ int height ;public: Tree(int treeHight):height(treeHight) {} ~Tree(){std::coutheight};void main(void){ Tree * t = new Tree(40) ; cout 输出结果是:Tree Height is: 40原创 2017-04-17 15:18:22 · 3273 阅读 · 0 评论 -
【转】在VS2010中使用Git管理源代码
前文我们讲了使用TortoiseGit管理源代码,但是对于使用VS2010的朋友来说,源代码管理起来还是不怎么方便。要是直接在VS2010中能使用Git就好了,下面我们就来看看怎么在VS2010中使用Git的功能。 主要是分成两个步骤1 安装打开VS2010,选择Tools->Extension Manager;选择左侧的“online gallary”,在搜索栏中搜索“git”;在搜转载 2017-04-17 15:27:53 · 517 阅读 · 0 评论 -
【转】C++之内存存储
转载地址:http://our2848884.blog.163.com/blog/static/14685483420115249213671/ 在C\C++中,通常可以把内存理解为4个分区:栈、堆、全局/静态存储区和常量存储区。下面我们分别简单地介绍一下各自的特点。1 栈 通常是用于那些在变异期间就能确定存储大小的变量的存储区,用于在函数作用域内创建,在离开作用域后自动转载 2017-04-17 15:30:01 · 266 阅读 · 0 评论 -
C++之vector
转载地址:C++之vectorvector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vecto转载 2017-04-17 15:30:20 · 278 阅读 · 0 评论 -
【转】一个fork的面试题
前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:题目:请问下面的程序一共输出多少个“-”?#include #include #include int main(void){ int i; for(i=0; i2; i++){ fork()原创 2017-04-17 15:36:59 · 228 阅读 · 0 评论 -
一道C++的笔试题
今天看到一道C++的笔试题,感觉不错!记录一下。 char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc";原创 2017-04-17 15:34:37 · 239 阅读 · 0 评论 -
C++之deque
今天把最后一个常用的顺序容器简单地描述一下,它就是deque。 2 双端队列deque 2.1 deque简介 deque是双向开口的连续性存储空间。虽说是连续性存储空间,但这种连续性只是表面上的,实际上它的内存是动态分配的,它在堆上分配了一块一块的动态储存区,每一块动态存储去本身是连续的,deque自身的机制把这一块一块的存储区虚拟地连在一起。 它首次插入原创 2017-04-17 15:30:44 · 249 阅读 · 0 评论 -
C++之list
今天我们来讲一讲STL中的顺序容器。昨天我们讲了vector,它就是顺序容器中最常用的容器之一。今天我们讲一讲list。 双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素。在STL中,list和vector一样,是两个常被使用的容器。和vector不一样的是,list不支持对元素的任意存取。list中提供的成员函数与vector类似,不原创 2017-04-17 15:30:30 · 221 阅读 · 0 评论 -
C++之vector
vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。 vector的扩充机制:按照容器现在容原创 2017-04-17 15:30:15 · 367 阅读 · 0 评论 -
C++之STL概述
1 什么是STL STL就是C++ Standard Template Library,也就是标准模版库,是一个高效的C++程序库。STL包含六大组件:容器(container)、算法(algorithm)、迭代器(iterator)、配置器(allocator)、适配器(adapter)和函数对象(function object)。我们在学习这些组件时,应该按其重要程度来区别学原创 2017-04-17 15:29:49 · 226 阅读 · 0 评论 -
C++之虚拟继承和虚基类
昨天的两篇文章《C++之类的继承》和《C++之虚函数》带领我们认识了C++中的类的继承方法,以及多态的实现。今天我们来学习一下二者的结合体——虚拟继承和虚基类。 在讲解什么是虚拟继承之前,我们需要先普及一下子类和父类在内存中的关系。如图1所示,每一个子类在内存中都拥有父类内存的一份拷贝。 图1 子类和父类在内存中的关系 子类对象占用的内存始终会比父类对象占用的内存大,因为原创 2017-04-17 15:29:42 · 517 阅读 · 0 评论 -
【转】在WinXP下用VC调整系统时间
前言: 一日,编程急需XP下调整系统时间的代码。最初想上网找吧,省事点,不料诺大一个internet,找个现成的代码居然如此困难(按理说应该有,不过我确实没找到)。只好自己写了,而且在这里贴出来,以便节省大家的时间。 正文: 在Win2000中,调整系统时间很eazy,只要运用如下代码即可。 SYSTEMTIME st; GetSystemTime(&st);原创 2017-04-17 15:21:13 · 408 阅读 · 0 评论 -
将double类型的数据写入二进制文件,从二进制文件中读取double类型数据
这是C的代码 //写入二进制文件 FILE *f=fopen("F:\\g.txt","wb+"); double d=123456123.1231231131; fwrite(&d,sizeof(double),1,f); fclose(f); //从二进制文件读出 FILE *fop=fopen("F:\\g.txt","rb"); dou原创 2017-04-17 15:20:37 · 6212 阅读 · 1 评论 -
【原创】“error prj0019 工具从正在执行生成后事件...”的解决方法
今天在调试别人的项目源代码的时侯,出现了一个错误: “error prj0019 工具从正在执行生成后事件...” 原因: 引起这个问题,通常是移植项目到别的平台时,因为项目有可能设置了生成后事件,而我们的环境有变化,所以导致失败。建议去掉项目生成后事件,或者修改之。具体做法是:项目属性->配置属性->生成事件,修改或删除引起错误的相应事件。原创 2017-04-17 15:20:33 · 1925 阅读 · 0 评论 -
\t\tc++格式化输入输出(转载)
cin与cout 一:标准输入函数cin 不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。他是属于流的,他的用法和流的用法是一样的。也就是:cin>>变量;小小的说明一下,输入多个变量可以写在一行,如:cin>>x>>y>>z;这样写不是不允许,而是不好看,如果是不同的变量类型,那就更是没头没脑了。除了你,人家是不知道该输入什么的,所以,一般在输入语句的前面,我们一般都要做原创 2017-04-17 15:11:23 · 837 阅读 · 0 评论 -
\t\t位运算-运算符(转载)
一、位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反>> 右移1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补原创 2017-04-17 15:11:09 · 283 阅读 · 0 评论 -
\t\tRun-Time Check Failure #2 - Stack around the variable 'XXX' was corrupted
今天在写程序的时候,遇到一个问题,就是Run-Time Check Failure #2 - Stack around the variable 'XXX' was corrupted后来上网看了一下,就是数组越界,很郁闷,怎么还会出现这样的问题……原创 2017-04-17 15:10:59 · 192 阅读 · 0 评论 -
\t\t大小写字母的转换
#include#includeconst double PI=acos(-1.0),e=exp(1.0);int main(){printf("%f %f\n",PI,e);char temp;while (1){ scanf("%c",&temp); temp=char(temp&'_'); printf("%c",temp); char T='A'; T=cha原创 2017-04-17 15:10:53 · 925 阅读 · 0 评论 -
\t\t变量和内存分配(二)(转载)
C++中内存的分配: 1.栈:是用来存放像一般变量和函数参数等的一块内存。系统会在变量生存期结束时自动释放内存,即把内存从栈中弹出。 2.堆:用来存放动态变量,如指针。要通过设计者自己管理变量,自行进行创建和清理工作。(利用new和delete) 3.自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。原创 2017-04-17 15:10:41 · 241 阅读 · 0 评论 -
\t\terror C2143 syntax error missing ')' before 'constant'的原因
以下是我自己从网上找的,不知道对不对。原因1:头文件顺序不对 //没有遇见过 发现错误的根源是某个cpp文件中的 # include "***.h" 但是这个头文件在其他的文件中包含都没有出现过这种错误. 将这个include 干掉编译就没有问题了, 仔细检查了一下, 没有出现头文件重复包含的情况.原创 2017-04-17 15:10:08 · 808 阅读 · 0 评论 -
\t\t二维数组new小结(转载)
二维数组new小结 1. A (*ga)[n] = new A[m][n]; ... delete []ga; 缺点:n必须是已知 优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用) 2. A** ga = new A*[m]; for(int i = 0; i ga[i] = new A[n]; ... for(int i = 0; i delete []ga[i]; delet原创 2017-04-17 15:09:36 · 215 阅读 · 0 评论 -
\t\t写个小问题
昨天在写排序程序的时候,想看看各个排序算法运行的时间。就利用clock()函数。clock()函数的返回值是从程序开始运行到现在经过的滴答数,类型为clock_t。所以在算法开始前设置double startTime=clock();//排序算法double endTime=clock();double times=(endTime-startTime)/(double)CLK_TCK;原创 2017-04-17 15:09:31 · 253 阅读 · 0 评论 -
\t\tc++格式化输入输出(转载)
cin与cout 一:标准输入函数cin 不知道说它是个函数对还是不对,它是代表标准的输入设备--键盘。他是属于流的,他的用法和流的用法是一样的。也就是:cin>>变量; 小小的说明一下,输入多个变量可以写在一行,如:cin>>x>>y>>z; 这样写不是不允许,而是不好看,如果是不同的变量类型,原创 2017-04-17 15:09:17 · 308 阅读 · 0 评论 -
\t\t深入C++的new(转载)
new和delete运算符用于动态分配和撤销内存的运算符new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5)原创 2017-04-17 15:09:07 · 248 阅读 · 0 评论 -
\t\tC++生成随机数(转载)
#include #include #include int isAlready(int t, int r[]); int main() { int rand_num[10]={0}; int i,t; srand((原创 2017-04-17 15:09:01 · 387 阅读 · 0 评论 -
\t\t对一个C++函数的效率优化(好,转载)
作者:Hub Sutter译者:plpliuly/*此文是译者出于自娱翻译的GotW(Guru of the Week)系列文章第二篇,原文的版权是属于Hub Sutter(著名的C++专家,"Exceptional C++"的作者)。此文的翻译没有征得原作者的同意,只供学习讨论。——译者*/#2 临时对象难度:5/10不必要的临时对象常常导致代码冗余和执行效率低下。问题: 假设你正在看一原创 2017-04-17 15:11:26 · 176 阅读 · 0 评论