
C++ basic
文章平均质量分 55
lsfreeing
这个作者很懒,什么都没留下…
展开
-
DLL的灾难 --- DEBUG与RELEASE版本不能交叉调用
让我们先看一段引文,再来进行心灵的探索:If you have an EXE and a DLL.When your exe APP was built Debug Mode, your Dll must be Debug mode.When your exe APP was built Release Mode, your Dll must be Release mode....转载 2019-05-06 09:59:27 · 350 阅读 · 0 评论 -
二十九、数数组、指针和字符串:指向数组元素的指针和指针数组(左值概念)
1、指向指针元素的指针 数组在内存中的存储地址是连续的。很明显指针处理这种运算很方便。如int a[4]={1,2,3,4}; 数组名a是一个指针常量(不能改变指向的地址),也就不能进行自增或自减等运算。a和&a[0]是等价的。所以用数组名结合简单的算术运算符就可以访问数组元素。如:*a; //第一个元素*(a+1); //第二个元素,即i+1个元素*(a++); // '+转载 2015-04-27 14:19:17 · 764 阅读 · 0 评论 -
九、函数的定义与调用
一个复杂问题可以分解为若干子问题,然后对子问题分别解决。C+就是用函数来解决子问题的。1.函数的定义 函数定义的语法形式是: 类型标识符 函数名(形式参数表) { 语句序列 } 类型标识符是函数的类型,即函数的返回值类型。2.函数的调用a、调用形式函数调用前必须声明,声明形式为: 类型说明符转载 2015-04-19 10:43:44 · 451 阅读 · 0 评论 -
十三、类与对象:类的声明、成员的访问控制和对象
1.类的声明类声明中只声明函数的原型,函数的实现在类外定义,当然也可以写在类声明里,那样就为隐式声明的内联函数。2.类成员的访问控制 priate声明私有类型的成员。如果类中声明没有标明访问控制属性则默认为private. 保护类型成员和私有类型成员相似,差别在于某个派生类的子类中的函数能够访问它的保护成员。3.类的成员函数 类的比较简单的成员函数也可以声明为内联函转载 2015-04-20 10:40:15 · 721 阅读 · 0 评论 -
五十、异常处理
1、异常处理的基本思想 目标:使用软件具有容错能力。在出现异常时程序能够继续往下运行,必要时提供错误信息。 软件开发中往往每个函数都有自己的分工,很多出现错误的函数都不会处理错误,而是产生一个异常让调用者捕捉和处理。如果调用者也不能处理此异常,则异常就会被继续向上级调用者传递,这个传递过程会一直持续到异常能被处理为止。如果程序最终没能处理这个异常,那么它就会被传递给C++的库函数termi转载 2015-05-17 15:38:29 · 455 阅读 · 0 评论 -
四十六、多态性:运算符重载为类的成员函数
运算符重载为类成员函数后就可以像其他成员函数一样访问本类数据成员了。在类外部可以通过类对象像原操作符一样使用重载运算符。如“+”重载为类A的成员函数后,A的对象可以这么运算:a+b。 双目运算符:一个操作数是使用此运算符的对象本身。另一个操作数是运算符重载函数传递进来的对象。如a+b, ”+”重载为类的成员函数,此函数只有一个形参。相当于a.operator+(b)。形参类型就是b的对象类型转载 2015-05-17 10:45:56 · 544 阅读 · 0 评论 -
八、自定义数据类型
当内置基本数据类型不能满足需求时,就需要自定义数据类型。主要有:枚举类型、结构类型、联合类型、数组类型和类。1.枚举类型 有当遇到描述一件事情时只能取几个有限值的情况,比如,一周七天(我们可以用0到6整数表示周一至周日),比赛结果只有胜、负、平等。如果我们用整数来表示星期几那就需要判断是不是在0到6之间的合法值,但如果用枚举类型定义就没有这种问题,因为枚举类型就那几个可能的值。转载 2015-04-17 11:55:10 · 489 阅读 · 0 评论 -
十、函数参数传递与内联函数
一.函数的参数传递 函数参数有实参和形参两种。实参可以是常量、变量或表达式,它的类型必须和形参相符。函数没有被调用时,形参并不占用内存,只有在调用时才会分配内存空间,然后将实参传进去。函数参数的传递有两种方式,值调用和引用调用。1.值调用给形参分配空间,然后将实参拷贝给形参。之后实参和形参脱离了关系,互不影响。如下:#include using namespace std;vo转载 2015-04-19 14:55:50 · 708 阅读 · 0 评论 -
十一、重载函数与函数模板
一.重载函数什么是重载函数? 重载函数就是两个及以上的函数同名,但形参个数或类型不同。编译器根据实参与形参类型和个数进行最佳匹配。什么要定义重载函数? 试想,如果没有重载函数,比如简单的加法运算,那么要对int,double等不同类型定义名称的函数,明显太杂乱了,因为调用的函数名太多,且功能相似。定义重载函数要注意的地方、 函数间的的形参类型和个数必须有一样不同。(因为原创 2015-04-19 15:41:45 · 528 阅读 · 0 评论 -
十四、类与对象:构造函数和析构函数
1.构造函数什么是构造函数? 如声明变量初始化一样,声明对象也要初始化。但类对象相对复杂,所以我们需要构造函数实现。其作用就是在对象创建时利用特定初始值构造对象,在对象创建时由系统自动调用。需要注意的是: a、构造函数一般声明为公有函数,除非我们不允许某个类生成对象,那么我们可以将其生成为private或protected。 b、每个类编译器为其生成默认构造函数,但只要我们自己原创 2015-04-21 10:08:28 · 481 阅读 · 0 评论 -
四十七、多态性:运算符重载为类的友元函数
友员函数可以通过类对象访问类的公、私、保护成员。和类成员函数权限一样 与重载为成员函数不同的是:重载的友元函数不属于任何类,这样操作数都需要通过函数的形参表传递。(前面的双目只需提供一个参数,因为调用对象本身就是一个操作数了)同样分为双目运算和单目运算来讨论。双目运算符如类A “+”重载为其友员函数。对象a+b相当于 operator+(a,b)单目运算符以前置和后置“转载 2015-05-17 11:11:05 · 607 阅读 · 0 评论 -
十二、面向对象设计的基本思想和特点
面向过程程序设计优点不用多说,缺点主要是:数据和函数分开,如果修改数据结构,有关的函数都必须修改。这样维护成本大,也容易导致一些地方忘记修改。 面向对象程序设计方法的基本特点:抽象、封装、继承、多态。1.抽象抽出一类对象共性并加以描述的过程。主要有数据抽像和行为抽象,如:Clock数据抽象int Hour; int Minute; int Second;行为抽象S转载 2015-04-20 10:14:29 · 688 阅读 · 0 评论 -
三十二、数组、指针和字符串:动态内存分配和释放
当我们对需要分配的空间不确定,分配过大可能造成内存浪费,过小出现越界。这时我们就要用到动态内存分配。即在程序运程过程中根据实际情况动态分配适量内存,使用完毕后释放。动态分配时申请和释放的内存单元叫堆对象。1、new和delete语法形式new 类型名(初值列表)int *pp=new int(5); //如果是类对象则调用合适的构造函数delete p; //释放对象需要注意的转载 2015-05-07 21:21:33 · 1249 阅读 · 0 评论 -
四十一、继承与派生:作用域分辨符
作用域分辨符主要是为了处理基类和派生类成员的可见性问题。 派生类在继承时,基类成员和派生类成员都有类作用域。两个具有包含关系的作用域,派生类位于内层。当派生类和基类中存在同名的数据成员或函数成员时,派生类的新成员覆盖了基类成员。也就是说在派生类内还是在派生类外部都只能访问到派生类成员,同名基类成员无法访问。这时我们可以用作用域分辨符来访问基类中的同名成员。基类名限定了后面成员的所属类。语法转载 2015-05-15 15:04:15 · 765 阅读 · 0 评论 -
六、基本控制结构之选择结构
数据从一个对象到另一个对象的流动我们一般称之为“流”,比如程序中的数据在屏幕上显示出来,我们可以想成数据从程序流向屏幕,就是输出流。从键盘输入数据就是输入流了。从流中获取数据叫做提取操作,向流中添加数据叫做插入操作。cin是系统预定义的输入流,用来处理标准输入即键盘输入。cout是预定义的输出流,用来处理标准输出,即屏幕输出。 一.if选择结构 使用形式为:转载 2015-04-16 09:19:51 · 395 阅读 · 0 评论 -
四十八、多态性:虚函数
1、虚函数的意义 继续前面,如果我们要用基类指针指向派生类的同名成员,就要用到虚函数了,实现运行时的多态。 虚函数是动态绑定的基础,需要注意的是:虚函数是非静态的,一定不能是静态成员函数。2、虚函数的声明和使用virtual 函数类型 函数名(形参表) { 函数体 } virtual关键字,只有在类声明时给出,如果转载 2015-05-17 14:51:32 · 436 阅读 · 0 评论 -
程序调试断点的原理
对于程序员来说,debug的时间往往比写程序的时间还要长。尤其对我这种专写bug为主的程序员来说,一个好的调试器意味着早点下班和休息。现在方便的调试器很多,有著名的Visual Studio(VS)等IDE,也有免费的Windbg和GDB等等。加个断点也很简单,就是按一下键而已。但你有没有想过,调试器Debugger并不能控制程序的执行顺序,为什么它可以让CPU在需要的地方停住呢?今天我们就来...转载 2019-04-22 19:28:29 · 3483 阅读 · 1 评论 -
C++构造函数和析构函数中可以调用虚函数吗?
不能。这个问题来自于《Effective C++》条款9:永远不要在构造函数或析构函数中调用虚函数 。简要结论: 1. 从语法上讲,调用完全没有问题。 2. 但是从效果上看,往往不能达到需要的目的。 Effective 的解释是: 派生类对象构造期间进入基类的构造函数时,对象类型变成了基类类型,而不是派生类类型。 同样,进入基类析构函数时,对象也是基类类型。 详情参考:ht...转载 2019-01-02 18:14:54 · 452 阅读 · 0 评论 -
c语言可变参数列表函数
函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现。可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中。头文件中声明了一个va_list类型和va_start、va_arg、va_end三个宏。我们使用可变参数列表的时候需要声明一个va_list类型的变量配合这三个宏使用。va_start(va_l...转载 2018-11-02 11:25:28 · 253 阅读 · 0 评论 -
C++内存分配方式
摘录自 <<编写高质量代码:改善C++程序的150个建议>>http://book.51cto.com/art/201202/317619.htm 建议27:区分内存分配的方式在C/C++语言中,用内存管理的水平去划分高手与菜鸟已经成为一种不成文的约定:可以从中获得更好的性能、更大自由的被称作C++高手,而程序经常面临着莫名其妙的崩溃,一遍遍的调试,费时又费力的...转载 2018-08-04 10:18:37 · 678 阅读 · 0 评论 -
C++ 对某位清零或置1
原谅链接https://www.cnblogs.com/CuriosityWzk/archive/2011/12/17/2291344.html 如何对某一位置0或者置1?方法一:写成宏,方便移植#define setbit(x,y) x|=(1<<y) //将X的第Y位置1#define clrbit(x,y) x&=!(1<<y) //将X的...转载 2018-07-24 16:32:47 · 7594 阅读 · 1 评论 -
#、##和__VA_ARGS__
原文链接 https://www.cnblogs.com/zhujudah/archive/2012/03/22/2411240.html1.#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).#incl...转载 2018-07-11 11:26:10 · 164 阅读 · 0 评论 -
C++函数指针
函数指针原创 2017-11-22 22:16:15 · 513 阅读 · 0 评论 -
C++学习博客收集
收集的一些学习的C++博客https://blog.youkuaiyun.com/morewindows (windows相关)陈硕 http://blog.youkuaiyun.com/Solstice http://www.cnblogs.com/Solstice陈皓 酷壳 https://coolshell.cn/ http://blog.youkuaiyun.com/haoelvczh http...原创 2017-09-05 19:08:33 · 679 阅读 · 0 评论 -
C++11 override 保留字作用
描述:override保留字表示当前函数重写了基类的虚函数。目的:1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);2.强制编译器检查某个函数是否是重写基类虚函数,如果没有则报错。用法:在类的成员函数参数列表后面添加该关键字既可。class Base{ virtual void fun();};...原创 2017-10-18 23:52:00 · 607 阅读 · 0 评论 -
1.不同进制数之间的相互转换
1.不同进制数之间的相互转换我们比较常用的数制有十进制、二进制、八进制和十六进制。二进制就是逢二进一,每位都是小于二的数,其他进制类推。计算机存储数据使用的是二进制编码。 对于一个R进制的数X来说,其值可以通过下面的公式算出来:,前面是整数部分,后面是小数部分,m,n为正整数,表示第i位上的数字乘以进制数的i次方。比如二进制数(11.01)2=1×21+1×20+0×2-1+1×2-2转载 2014-11-12 14:37:51 · 3966 阅读 · 0 评论 -
ASCII码详解
一、ASCII码详解ASCII(American Standard Code forInfomatin Interchange)的缩写,即美国信息交换标准码。是基于拉丁字母 的一套电脑编码系统。主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。1、产生在计算机中,所有的数据在存储和运算时都要使用二进制数表示(计算机用高低电平分别原创 2014-11-14 14:04:22 · 1571 阅读 · 0 评论 -
五、GDI图形基础
5.1 GDI结构 GDI是win子系统,主要负责显示图形。不只应用程序使用GDI,同时win本身也使用GDI显示 接口对象,如菜单、图标等。从程序写作角度来说,GDI由几百个函数调用和一系列相关数据结构组成。 GDI函数虽然众多,但主要可以分为几大类: 1、取得和释放设备内容的函数。如BeginPaint…EndPaint等 2、取得有关设备内容的函数。如GetTextM原创 2015-05-21 15:07:39 · 1169 阅读 · 0 评论 -
四十五、态性:运算符重载的概念和规则
1、运算符重载的概念为什么会有运算符重载?(不同的操作数类型产生不同操作) 除了内置数据类型,我们自定义数据类型也要进行某些运算,这就要求我们自定义运算符,实际上属于函数重载,不是运算符表达式而是调用运算符函数,操作数实际也是运算符函数的参数。 2、运算符重载规则 a、虽然是为了让自定义数据类型能使用预定义运算符而进行重定义。但一般重定义功能与原运算符功能相似,参数个数也相同,转载 2015-05-16 10:54:07 · 428 阅读 · 0 评论 -
四十四、多态性:多态的概念和类型
1、多态的类型四种:重载多态、强制多态、参数多态、包含多态 前面两种为专用多态。普通函数和类成员函数的重载,属于重载多态。再如整形变量和浮点变量相加,整形会转换为浮点进行运算,这就是强制多态。 后面两种为参数多态。如模板类型参数化就是参数多态。包含多态一般通过虚函数实现。 2、多态实现 编译时多态:编译时确定具体调用哪个函数。即 静态绑定、(重载,强制,参数多态都是静态绑定转载 2015-05-16 10:21:43 · 1922 阅读 · 0 评论 -
二十四、C++程序设计必知:多文件结构和编译预处理命令
1、多文件结构 按结构划分为至少三个文件:类的声明(.h文件)、类的实现(.cpp),主函数文件(用到类的文件)。这样修改时只需改动相应文件,其他的不要变。 如学生类,我们定义Student.h,Student.cpp,main.cpp.首先Student.h,Student.cpp编译生成Student.obj.然后是链接过程,Student.obj和main.obj链接生成main.e转载 2015-04-26 10:06:03 · 758 阅读 · 0 评论 -
二十五、数组、指针和字符串:数组的声明和使用
数组在逻辑上是连续的,同时在内存中存储上也是连续的。1、数组声明 和结构体,类等一样,数组也是自定义数据类型。 数组名是一个常量,代表数组元素集合在内存存储的起始地址,不能进行自增或自减运算。 2、数组的使用需要注意的几点: 如int a[A][B] A、B为下标表达式,必须是正整数。 A、B可以是任何表达式,但结果必须是整型数据转载 2015-04-26 14:06:27 · 323 阅读 · 0 评论 -
二十六、数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数
一、数组的存储 数组在内存中连续存储,数组名则为数组所占内存的首地址。多维数组的存储,这里以二维数组 int a[2][3]为例 左边为高位,右边为低位 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] //这种存储方式为行优先存储 二、数组的初始化声明数组时对部分或全部元素赋值就是数组的初始化。如简单数组类转载 2015-04-26 14:46:47 · 504 阅读 · 0 评论 -
十五、类与对象:类的组合
1、什么是类的组合,为什么要类组合? 比如计算机,它分为硬件和软件,其中硬件又有cpu、显卡、内存等,软件分为系统和用户软件。如果直接声明计算机类,这样相对复杂,我们可以将硬件和软件声明为单独的类,这样计算机类由硬件类和软件类组成。这样处理起来就相对方便了。 类组合其实就是在一个类中嵌入其他类对象作为成员,创建该类对象时,其所包含的类对象自动创建。类对象是组合类的一部分,所以在构造时除了对转载 2015-04-21 16:09:00 · 889 阅读 · 0 评论 -
十九、C++程序设计必知:生存期
和自然办的事物一样,程序中的变量和对象等也有生存期,从产生到消亡。生存期主要有两种,静态和动态。1、静态生存期某个对象的生存时间和程序运行期相同,我们就说它具有静态生存期。很明显文件域的对象具有静态生存期。使用块作用域具有静态生存期的方法,加static关键字修饰。 2、动态生存期除开上面的静态生存期,其余对象具有动态生存期。具有动态生存期的对象产生于声明处,于对象转载 2015-04-24 19:37:25 · 763 阅读 · 0 评论 -
二十一、C++程序设计必知:类的静态成员
类的表态成员主要分为类的静态数据成员和类的静态函数成员。1、类的静态数据成员 假如我们定义一个学生类的同时要对学生的人数进行统计,定义变量count.很显然,该变量不能话在类外面,这样就隐藏性不好。同时也不能在类中增加cout数据成员,因为这样一个副本过多,造成浪费,另外不同学生对象间的count数据可能不一至。这样我们就要用到类的静态数据成员了,只有一个副本,所有类对象共同维护和使用。如转载 2015-04-24 20:09:50 · 583 阅读 · 0 评论 -
十八、C++程序设计必知:作用域和可见性
主要有四种:函数原型作用域、块作用域、类作用域、文件作用域1、函数原型作用域 如 void fun(int x);该函数声明中的形参作用域就是函数原型作用域。形参x有效的范围就在左、右两个括号之间。x的作用域就是函数原型作用域。是最小的作用域。2、块作用域 这里理解的块,就是一对大括号括起来的一段程序。作用域为从标识符声明到块结束。3、类作用域如类中声明了一数据成员转载 2015-04-23 10:06:34 · 493 阅读 · 0 评论 -
十七、类与对象:UML简介
Unified Modeling Language (UML)又称统一建模语言或标准建模语言简单的说我们可以用UML把软件规划、架构等表达出来,这样思路清晰,也便于优化。面向对象设计图应运而生,它能清楚的描述以下几个问题: 1.类,包括数据成员和函数成员。 2.对象,类的实例。 3.类及对象的关系,继承或者包含。 4.类及对象之间的联系,相互作用与消息传递等。转载 2015-04-22 21:56:20 · 620 阅读 · 0 评论 -
十六、类与对象:类模板
和函数模板类似,都是为了提高代码的复用性,这是面向对象设计中软件开发重要的思想之一。定义如下:template类声明建立对象时的声明:模板对象名1,….对象名n;下面直接上代码:#include #include using namespace std;struct Person //定义一结构体类型{ int id; string name;};templat转载 2015-04-22 21:33:41 · 859 阅读 · 0 评论 -
四、数据类型
C++是从C中发展来的,可以兼容C。所以C++的一些基本语法跟C几乎是一样的。 先给大家看下一个简单的C++程序。 #include void main(void) { cout << "Hello! \n"; } #include 告诉编译器对程序转载 2015-04-01 10:10:47 · 465 阅读 · 0 评论