![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 72
HAN-Kai
这个作者很懒,什么都没留下…
展开
-
内存分类
栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自原创 2012-01-07 18:32:48 · 833 阅读 · 3 评论 -
C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
一、本文目的与说明 1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。 3. 单继承、多继承、虚继承,既然都属于继承,那么虽然有一定的区别,但还是相同点比较多。如果放在一块讲,但为了转载 2012-01-10 20:04:49 · 934 阅读 · 0 评论 -
C++静态成员函数和变量
代码一:[cpp] view plaincopyprint?class Point{ public: void output() { } static void init() { } }; int main() { Poi转载 2012-03-16 15:28:49 · 849 阅读 · 0 评论 -
C++静态数据成员
静态类成员包括静态数据成员和静态函数成员两部分。 一、 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 1.静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所转载 2012-03-16 15:26:37 · 786 阅读 · 0 评论 -
C++中的位拷贝和值拷贝
为了便于说明我们以String类为例:首先定义String类,而并不实现其成员函数。Class String{public: String(const char *ch=NULL);//默认构造函数 String(const String &str);//拷贝构造函数 ~String(void); String &operator=(const转载 2012-03-19 16:35:23 · 567 阅读 · 0 评论 -
二维数组的动态分配及参数传递
1. C语言动态分配二维数组(1)已知第二维[cpp] view plaincopyprint?char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(char *) * m); printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]));/转载 2012-03-20 15:41:03 · 568 阅读 · 0 评论 -
VC6.0Debug调试总结
1. 如何显示Debug工具栏窗口?①:在任意工具栏的位置,单击鼠标右键,勾选Debug项 ②:Tools---->Customize---->Toolbars---->Debug---->close 引申:工具栏和工具条的区别? 一个工具栏可以放置多个工具条。2.关于断点调试F9:设置或去除断点。如果当前行未设置断点,按F9可在当前行设置断点转载 2012-06-14 15:39:38 · 1249 阅读 · 0 评论 -
VC6.0Class Wizard不显示类的问题
先解决Class Wizard中不能显示外来的文件包含的类的问题:实际上 Class Wizard的目的不是显示类,而是让编程者能方便得添加/删除MFC相关的成员函数或变量。要改变类的内容就要改变源文件,但是应该在什么地方修改,ClassWizard可没有本事处理任意一个手工编写的.cpp .h对。它的办法是用类似 //{{AFX_MSG(类名)//}}AFX_MSG这样转载 2012-06-21 14:37:31 · 1768 阅读 · 0 评论 -
使用ifstream和getline读取文件内容[c++]
假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion dollars.[Everyone gasps.]Auctioneer: Sir, that's not a number.数据读取, 测试 。以下就是基于 data.txt 的数据读取操作:#include iostream>#include fstr转载 2012-06-24 13:02:42 · 875 阅读 · 0 评论 -
ofstream和ifstream详细用法
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器( 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout2、析取器(>>) 从转载 2012-06-24 12:04:50 · 664 阅读 · 0 评论 -
AfxMessageBox与MessageBox
AfxMessageBox的函数原型int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) –1 );在第一种形式中,lps转载 2012-06-12 10:31:11 · 761 阅读 · 0 评论 -
ACE通信框架的一些例子(包括MFC)
一. ace的编译安装环境:XP,VC6.0+SP6,ACE5.41. 解压缩ace源代码包,假设在D:\ACE_wrappers2. 使用vc打开D:\ACE_wrappers\ace\ace.dsw3. 工作区上有三个工程,在ACE工程的头文件中找到config.h4. 双击打开这个文件,会有提示这个文件不存在是否创建,点是5. 在config.h中写入#include转载 2012-07-22 10:17:20 · 2363 阅读 · 0 评论 -
Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
服务器端代码[c-sharp] view plaincopyusing System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace TCP通信转载 2012-07-21 16:16:01 · 4609 阅读 · 0 评论 -
opencv在两点间画箭头的方法
在opencv中没有可以直接画箭头的方法,但是可以利用cvline方法来解决画箭头的问题。画箭头非常常用,在图像中标定运动方向中经常用到,如光流法等。以下是解决方案。 double alpha_angle;//弧度 CvScalar line_color; line_color = CV_RGB(0,0,255); cv::Point原创 2012-08-14 18:55:20 · 9605 阅读 · 1 评论 -
基础备忘:数组做为函数参数
一、一维数组做参数1) 用数组名做为函数参数时,不是进行值传,而是地址的传递,也就是说把实参数组的首地址赋予形参数组名。例如,下面语句声明了一个数组为函数参数的func().int func(int a[10]);2) 用数组做为函数参数,其长度是没有意义的。也就是说上面的函数声明与下面的声明是等效的。int func(int a[]);int func(int a[100]原创 2012-08-19 17:25:52 · 642 阅读 · 0 评论 -
C/C++数组名与指针区别深入探索
引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误转载 2012-08-19 20:23:12 · 973 阅读 · 1 评论 -
基础备忘:结构体、联合、枚举笔记
结构体占内存大小:最大成数数据类型大小*成数数据个数。定义和声明方式:方式1:先定义结构体类型,然后声明一个该类型的变量struct Student{ char Name[20]; int Number; int Age; char Sex; float Score; };struct St原创 2012-08-28 22:56:33 · 753 阅读 · 0 评论 -
基础备忘:带参数的main 函数
在main函数中允许带两个参数,一个为整型数据类型 argc,另一个是指向字符型的指针数组argv[ ]。这两个参数在main函数头部声明格式为:int main(int argc, char * argv[])argc表示命令行中字符串的个数,指针数组argv[ ]指向命令行中的各个字符串。argc的值是自动赋的,不用人为输入,人为输入的只是argv的值。以下是一个例子,输出原创 2012-08-19 16:36:24 · 697 阅读 · 0 评论 -
基础备忘:数组指针与对一维数组名取地址
一、指向一维数组的数组指针数组指针是指向一个数组的指针。如int (*p)[10];p是一个指针,指向一个包含10个元素的一维数组,数组元素是整形。如果写成了int *p[10],则是一个指针数组,由于[ ]的优先级比*的高,p先与[ ]结合,p就是数组类型的数据,元素是指针。下面是数组指针与一维数组名取地址的实验:#includeusing namesp原创 2012-08-19 21:12:39 · 1443 阅读 · 0 评论 -
指针和引用的区别
指针和引用的区别(1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值. String & rs = string1; 由于没有所谓的 null reference 所以所以在使用前不需要进行测试其是转载 2012-08-19 21:46:19 · 1020 阅读 · 2 评论 -
C++ const成员初始化问题
Const成员如其它任何成员一样,简单考虑其出现在三个位置:全局作用域、普通函数内部、类里面。下面请看测试代码:#include using namespace std; class A { public: const int j;// const int k = 3; const static int i; }; //const stat原创 2012-08-29 15:56:22 · 7655 阅读 · 0 评论 -
C++枚举类型
1、枚举enum的用途浅例 写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等。 更常见的,打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即: const int input = 1;转载 2012-08-29 13:10:30 · 861 阅读 · 0 评论 -
基础备忘:友元——友元函数,友元成员,友元类
在C++中,为了使类的私有成员和保护成员能被其它类或其它成员函数访问,引入的友元的概念。友元函数友元函数定义后可以访问改类的所有对象的所有成员,包括private、protected、public成员。友元函数使用前必须要在类定义时声明,声明时在其函数名前加上关键字friend。该声明可以放在公有成员中,也可以放在私有成员中。友元函数可以在类内部定义,也可以在类外部定义,通常在类外部定义。原创 2012-08-30 23:40:32 · 2317 阅读 · 0 评论 -
字符串指针与char型指针数组
一、字符串指针字符串是一种特殊的char型数组,指向char类型数组的指针,就是字符串指针。与普通指针一样,字符串指针在使用前也必须定义。字符串与char数组的区别在于长度,字符会自动在尾部加上一个长度‘\0’,而char型数组的长度就是其字符的个数。字符串长度是字符个数+1。例:#includeusing namespace std;int main(){ char s原创 2012-08-19 22:19:59 · 18396 阅读 · 1 评论 -
基础备忘:指针函数和函数指针
顾名思义。指针函数是指函数的返回值为指针类型。函数指针是指指向函数的指针,即指针存储的是函数的首地址。一、指针函数。数据类型 *函数名 (参数表)优势:能够返回一组数据,普通函数只能返回一个数据。#includeusing namespace std;int main(){ char *p[5]={"Hanson","John","Tom","Joy",原创 2012-08-21 13:08:07 · 630 阅读 · 0 评论 -
通过线程来谈指针函数和函数指针
线程中遇到pthread_create函数第三个参数 void *(*start_routine)(void *)这个参数代表一个指针,这个指针指向的函数必须满足以下条件:1、函数参数只有一个为void指针,可以为任意数据类型的指针。2、函数的返回值必须是void指针,可以为返回任意数据类型的指针指针函数:函数返回值为指针的函数。函数指针:指向函数名的指针为函数指针。e转载 2012-08-21 10:57:22 · 2000 阅读 · 1 评论 -
C++和函数指针和线程函数
虽然标题是这么写的不过还是倒过来先从线程说起吧,Windows via C/C++里提到的线程函数实现这里就不说了,只说创建需要给的一个函数指针。uintptr_t _beginthreadex( void *security, // security properties, pass NULL for most times unsigned stack_size,转载 2012-08-21 11:03:21 · 2313 阅读 · 2 评论 -
C++面试宝典2011版
1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要转载 2012-08-21 15:00:07 · 2021 阅读 · 0 评论 -
基础备忘:new\delete和malloc\free及memset
一、new、delete、malloc、free1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在原创 2012-08-21 14:57:12 · 5473 阅读 · 0 评论 -
C/C++ 中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法大全、使用技巧
C/C++ 中宏与预处理使用方法大全 (VC) 原文:C/C++ 中宏与预处理使用方法大全 (VC)作者:Breaker C/C++ 中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法大全、使用技巧开发环境:VC 2005关键字:宏, 预定义宏, 预处理, 预编译头, VC, #pragma, 编译选项, 程序区段R转载 2012-08-22 13:31:10 · 12771 阅读 · 0 评论 -
c语言宏定义中##连接符和#的使用
C中如何使用宏属于编译器预处理的范畴,属于编译期概念。.宏定义中字符串化操作符#:#的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。例如:#define WARN_IF(EXPR)\do {\ if (EXPR)\ fprintf(stderr, "Warning: " #EXPR "\n");\转载 2012-08-23 12:47:49 · 1305 阅读 · 0 评论 -
基础备忘:派生类直接访问基类的私有成员
派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数。实现方法有如下两种:1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员。2.将需要访问基类私有成员的派生类成员函数声明为友元。#includeusing namespace std;class Base{ friend class Derived2;//f原创 2012-09-01 16:33:33 · 3603 阅读 · 0 评论 -
const与define
常量:用宏表示常数 假如我们要写一个有关圆的种种计算的程序,那么∏(3.14159)值会被濒繁用到。我们显然没有理由去改∏的值,所以应该将它当成一个常量对待,那么,我们是否就不得不一遍一遍地写3.14159这一长串的数呢?这就用到了宏。宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段。宏的语法为: #define 宏名称 宏值 比如要代替前面说到的∏值,应为:#defi转载 2012-08-23 10:18:54 · 588 阅读 · 0 评论 -
C语言中的位域的使用
一、位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对转载 2012-08-23 19:17:29 · 759 阅读 · 0 评论 -
基础备忘:多重继承的构造函数和析构函数
多继承构造函数和析构函数的执行顺序与单继承相同,但应强调的是,基类之间的执行顺序是严格按照声明时从左到右的顺序来执行的,与他们在定义派生类构造函数中的次序无关。例如:#includeusing namespace std;class Base1{ int x1; public: Base1(int y1) {原创 2012-09-02 18:59:17 · 1122 阅读 · 0 评论 -
基础备忘:虚基类
在多重继承中,要引用派生类的成员时,先是在派生类自身的作用域内寻找,如果找不到再到基类中寻找。这时,如果这些基类有一个共同的基类,派生类访问这个共同基类的成员时,就有可能由于同名成员的问题发生二义性,此时就需要用虚基类来解决这个问题。例如:#includeusing namespace std;class Base{ protected: in原创 2012-09-02 20:12:26 · 1325 阅读 · 0 评论 -
基础备忘:多重继承中的二义性问题
二义性问题在多重继承中,需要解决的主要问题是标识符不唯一,即二义性问题。例如,当在派生类继承的多个基类中有同名成员时,派生类中就会出现标识不唯一(二义性)的情况,这在程序中是不允许的。如:#includeusing namespace std;class Base1 { public: int x; int a()原创 2012-09-02 15:38:05 · 3067 阅读 · 0 评论 -
基础备忘:虚基类的构造函数和初始化
虚基类的初始化与一般的多继承的初始化在语法上是一样的,但构造函数的执行顺序不同,主要有以下几点:1.虚基类的构造函数的执行在非虚蕨类的构造函数之前。2.若同一层次中包含多个虚基类,这些虚基类的构造函数按照他们被声明的先后次序执行。3.若虚基类由非虚基类派生而来,则仍然先执行基类的构造函数,再执行派生类的构造函数。#includeusing namespace std;cla原创 2012-09-02 20:46:27 · 1627 阅读 · 0 评论 -
基础备忘:派生类的构造函数和析构函数
执行顺序和构建原则在构建派生类的构造函数和析构函数时,要遵循以下原则:1.基类的构造函数和析构函数不能被派生类继承。2.如果基类没有定义构造函数,派生类也可以不定义构造函数,全都采用默认构造函数,此时,派生类新增成员的初始化工作可用其他公有函数来完成。3.如果基类定义了带有形参表的构造函数,派生类就必须定义新的构造函数,提供一个将参数传递给基类构造函数的途径,以便保证在基类进行初始原创 2012-09-02 10:52:10 · 795 阅读 · 0 评论 -
基础备忘:宏和预编译
#include#define MACRO 1<<2const double PI = 3.14;//不能写成const double PI 3.14 using namespace std;int main(){ cout<<MACRO<<endl; cout<<(MACRO)<<endl; cout<<PI<<endl; system("pause")原创 2012-08-22 21:12:41 · 1053 阅读 · 0 评论