![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
语法分析
June_Tina
这个作者很懒,什么都没留下…
展开
-
为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样
1.在释放堆栈中c++基本数据(包括int,char.....结构体等)的存储空间时,不管是否是数组用delete都不会有错!而且能正常释放所有内存,不会导致内存泄露! //程序A struct text_data_t { int i; }; int _tmain(int argc, _TCHAR* argv[]) { text_data_t转载 2013-04-25 21:03:05 · 1424 阅读 · 0 评论 -
拷贝构造函数的参数类型必须是引用(转)
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。那么 拷贝构造函数的参数为什么必须使用引用类型?原因: 如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调原创 2013-05-13 09:29:19 · 708 阅读 · 0 评论 -
c++中重载、覆盖和隐藏概念的区别
1、重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。示例1:#include class B原创 2013-07-02 16:35:43 · 524 阅读 · 0 评论 -
C++多态个人总结
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOD)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。C++多态的实现:C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的原创 2013-07-02 16:42:11 · 617 阅读 · 0 评论 -
C++中const理解
一、首先介绍const引入1. C++有一个类型严格的编译系统,这使得C++程序的错误在编译阶段即可发现许多,从而使得出错率大为减少,因此,也成为了C++与C相比,有着突出优点的一个方面。2. C中很常见的预处理指令 #define VariableName VariableValue 可以很方便地进行值替代,这种值替代至少在三个方面优点突出: 一是避免了意义模糊的数字出现,使得原创 2013-07-18 20:19:16 · 498 阅读 · 0 评论 -
C++中的左值与右值
1. C++左值与右值概念变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的;对于每个变量,都有2个值与其相关联:1>数据值,存储在某个内存地址中,也称右值(rvalue),右值是被读取的值(read value),文字常量和变量都可被用于右值。2>地址值,即存储数据值的那块内存地址,也称左值(lvalue),文字常量不能被用作左值。2.C++左值与右值的含原创 2013-07-19 10:45:53 · 533 阅读 · 0 评论 -
c++ char *str和char str[]的区别
一、堆和栈的理论知识1、申请方式stack:由系统自动分配,例如声明在函数中的一个局部变量int b;系统自动在栈中为b开辟空间。heap:需要程序员自己申请,并指明大小,在C中用malloc函数:p1=(char*)malloc(10);在C++中用new运算符:p2=new char[10]。注意p1、p2本身是在栈中的。2、申请后系统的响应栈:只要栈的剩余空间大于所申请空原创 2013-08-20 21:13:11 · 905 阅读 · 0 评论 -
(转)关于strcpy函数的问题(程序员面试宝典P219)
一个关于strcpy函数的问题#include#includevoid main(){char s[]="123456789";char d[]="123";strcpy(d,s);printf("d=%s,\ns=%s",d,s);}执行结果:d=56789,s=123456789书上有关于这个的解答,说是因为当初分配的内存地址是连续内原创 2013-08-28 16:51:29 · 703 阅读 · 0 评论 -
函数参数压栈顺序
函数调用约定(Calling Convention) 函数调用约定不仅决定了发生函数调用时函数参数的入栈顺序,还决定了是由调用者函数还是被调用函数负责清除栈中的参数,还原堆栈。函数调用约定有很多方 式,除了常见的__cdecl,__fastcall和__stdcall之外,C++的编译器还支持thiscall方式,不少C/C++编译器还支持 naked call方式。这么多函数调用约定常常令许原创 2013-10-09 22:13:13 · 2326 阅读 · 0 评论 -
Java编码规范
编码规范对于开发人员来说是非常重要的,有以下几个原因:1.一个软件的生命周期中,80%的花费在于维护2.几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护3.编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码4.如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品5.为来自不同的项目组转载 2014-10-11 10:43:11 · 381 阅读 · 0 评论 -
String,StringBuffer和StringBuild 区别
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全)简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改原创 2014-10-14 09:33:33 · 932 阅读 · 0 评论 -
try-catch-finally学习
1、try…catch 将有可能抛异常的代码放到try语句中,那么当try语句中有异常出现时,catch语句会将异常捕捉到,但是一个try后面可以跟多个catch语句,可以针对于try抛出的不同异常,到对应的catch中处理,如果后面的没有准确对应的catch处理,异常就会跳到父类的异常catch中。记住一点,一个try-catch一次只能捕获一个异常。1.1 将预见可能引发异常的代码原创 2015-10-29 11:42:58 · 390 阅读 · 0 评论 -
equals和==的区别
要区分两者的区别首先需要知道当前java的数据类型。1、数据类型区分基本数据类型:byte,short,char,int,long,float,double,boolean 复合数据类型:就是定义的类2、两者区分 对于基本类型,采用==号进行比较,比较的是基本类型的值,结果是boolean值。 对于复合类型,采用==号比较时,比较的是复合类型在内存中原创 2015-11-19 11:42:59 · 461 阅读 · 1 评论 -
java类型转换
java类型转换有两种方式:自动转换(隐式转换)和强制类型转换1、自动转换(隐式转换)自动转换需要满足两个条件,第一是两种类型彼此兼容,第二是目标类型的取值范围必须大于源类型2、强制类型转换不满足自动转换条件时,需要强制转换,这时需要注意转换中造成的数据的微小变化。原创 2015-12-16 11:07:37 · 318 阅读 · 0 评论 -
java内存管理
Java分配内存分为两种:栈内存和堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了原创 2016-01-07 10:41:42 · 312 阅读 · 0 评论 -
C++拷贝构造函数(深拷贝,浅拷贝)(转载)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include using namespace std;class CExample {private: int a;public: CExam原创 2013-05-11 10:51:47 · 387 阅读 · 0 评论 -
C++ 按位与运算符&、按位异或运算符^、按位或运算符|
1、 按位与运算符参加运算的两个数据,按二进制位进行“与”运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1”,结果才为“1”,否则为0;另,负数按补码形式参加按位与运算。“与运算”的特殊用途:(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。(2)取一个数中指定位方原创 2013-05-09 17:31:59 · 1530 阅读 · 0 评论 -
C++中关于new和delete的使用
1.创建动态数组 数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道它的长度,数组只在定义它的块语句中存在。对于动态分配的数组,虽然长度是固定的,但是动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度;(下面有个例子,好好理解,在标准C语言中数组的长度必须在编译的时候就是知道的,这算C++与C的一点小区别)同时,动态分配的数转载 2013-04-25 21:12:21 · 676 阅读 · 0 评论 -
字节数对齐比较详细的介绍
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。 2) 结构体每个成员相对于结构体首地址的偏移量(offset)转载 2013-04-30 12:55:54 · 718 阅读 · 0 评论 -
C++ 对象的内存布局
转载地址:http://blog.csdn.net/haoel/article/details/3081328对象的影响因素简而言之,我们一个类可能会有如下的影响因素: 1)成员变量2)虚函数(产生虚函数表)3)单一继承(只继承于一个类)4)多重继承(继承多个类)5)重复继承(继承的多个父类中其父类有相同的超类)6)虚拟继承(使用virtual方式继承,转载 2013-05-03 13:42:32 · 620 阅读 · 1 评论 -
C++ 虚函数表解析
转载地址:http://blog.csdn.net/haoel/article/details/1948051前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,转载 2013-05-03 13:36:21 · 447 阅读 · 0 评论 -
C++继承方式
C++继承方式总共分为以下几种:public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。转载 2013-05-02 20:56:54 · 477 阅读 · 0 评论 -
typedef void (*Fun) (void)
为便于理解,你可以这样解释: typedef void(* Fun)(void) Fun 类似于 typedef int INT Fun在声明以后,可以把它当作数据类型声明其他变量 Fun的确切意义是一个函数指针类型,该函数没有参数且无返回值 定义了一个int类型的变量i; 而这样 typedef INT int; 表示用户自己定义了一个整型数据类型I转载 2013-05-03 12:59:15 · 620 阅读 · 0 评论 -
虚继承与虚基类的本质
虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行研究。 首先还是先给出转载 2013-05-03 14:04:40 · 599 阅读 · 0 评论 -
break / continue语句 与 switch
continue 和 break 语句都是循环体内的终止语句,但两者的区别是:1. continue在循环体内,略过循环体内continue下面的语句(即跳出本次循环),继续下一次循环,并不跳出整个循环体。2. break,略过循环体内break下面的语句,跳出整个循环体。两者的相同点是:都是只跳出本层循环体。即,一层一层的跳出。 并且:平常我们都是把break;语句用在s转载 2013-05-03 09:58:04 · 672 阅读 · 0 评论 -
重载符的定义
大多数的重载操作符可以定义为普通非成员函数或类的成员函数。运算符重载的实现运算符的重载形式有两种:重载为类的成员函数和重载为类的友元函数。运算符重载为类的成员函数的语法形式如下: operator (){ ;}运算符重载为类的友元函数的语法形式如下:friend operator (){ ;}注意:a、作为类成员的重载函数,其形参看起来比操原创 2013-05-03 20:35:47 · 724 阅读 · 0 评论 -
C++:静态联编和动态联编
联编就是将模块或者函数合并在一起生成可执行代码的处理过程,同时对每个模块或者函数调用分配内存地址,并且对外部访问也分配正确的内存地址,它是计算机程序彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于转载 2013-05-04 15:13:26 · 773 阅读 · 0 评论 -
C++构造函数私有化
通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?没错,我也知道这将会使构造函数成为私有的,这意味着什么? 我们知道,当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致编译出转载 2013-05-03 15:35:53 · 938 阅读 · 0 评论 -
C++ inline 函数
(一)inline函数(摘自C++ Primer的第三版)在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。 inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline函数不同的是,inline函转载 2013-05-03 17:04:55 · 706 阅读 · 0 评论 -
c++强制类型转换
C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。const_cast: 主要针对const和volatile的转换.static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。dynamic_cast: 通常在基类和派生类之间转换时使用,r转载 2013-05-02 20:40:05 · 468 阅读 · 0 评论 -
C语言深度剖析——个人笔记
1、const修饰的只读变量不能用来作为定义数组的维数,也不能放在 case关键字后面。2、#define ENG_PATH_3 E:\English\listen_to_this\listen\_to_this_3这里用了 4 个反斜杠,到底哪个是接续符?。注意:反斜杠作为接续符时,在本行其后面不能再有任何字符,空格都不行(前三个反斜杠后面都有字符,这一点是不满足作为连接符的原创 2013-05-08 10:01:58 · 750 阅读 · 0 评论 -
Serializable序列化
1、什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。2、什么情况下需要序列化a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;b)当你想用套接字在网络上传送对象的时候;c)当你想通过RMI传输对象的时候;3、如何实现序列化将需要序转载 2016-03-06 19:07:41 · 529 阅读 · 0 评论