C++
abc609315767
C++狂热爱好者
展开
-
C++中运行时类型信息(RTTI)及动态强制类型转换
采用通用方式(即多态形式)编程时,如果想在运行时修改相应的派生类对象的信息,我们可以使用C++中强大的运行时类型信息机制,来完成相应派生类对象状态的改变。下面我们就来动态的改变BaseCommsionEmployee对象的状态,把它的基本工资在程序运行当中动态的增加10%。及动态的打印基类Employee指针所指派生类对象的的类型信息。例:代码举例#include #inclu原创 2012-08-21 12:36:53 · 873 阅读 · 0 评论 -
静态持续性变量与自动局部变量异同
对于C++中的变量存在着两种类型的不同形式。1.静态持续性变量 2.自动局部性变量 那这两者有何区别呢?下面我们来一起分析一下,他们的异同点。1.静态持续性变量: 即此变量在程序的整个生命周期中一起存在,不管程序是否执行到相应的作用域。它一直存在,由于是静态的,所有它们并没有像其它自动局部变量(即相应作用域内定义的变量,出了作用域变量自动销毁)那样,在特定的管理原创 2012-08-23 17:44:04 · 589 阅读 · 0 评论 -
C++中的this指针
对于类对象,我们一定会直觉的认为肯定会比一般的数据类型大很多才是。为什么呢?可能有的人就可以很容易的举出相应的例子。比如说:对象包含了数据成员和成员函数。这样的一个实体能不大吗?常规理解对象确实很大,它不单单只有数据,而且还有函数来着。但是直觉却总是有例外的时候,其实编译器只维护了类的所有对象的一个函数副本。你可以用sizeof()函数来计算一下类或类的对象的大小。你会发现他们确实只包含了数据,而原创 2012-08-24 18:12:18 · 511 阅读 · 0 评论 -
结构体与类
在学习C++中我们可能会对结构体与类的关系产生疑问,这两个类型怎么这么相似?他们有什么异同点?确实他们两个非常的像,结构体与类都可以具有属性(可以是基本类型或类对象)和函数。访问方式也一样,都通过圆点运算符.来访问相应成员。都可以具有访问限定符(public, private, protected)。代码示例:class A{public: void print();原创 2012-09-03 23:04:54 · 461 阅读 · 0 评论 -
#ifndef#endif防止头文件重复包含
在C++中由于程序设计的需要,我们需要自己编写相应的类头文件与实现。但在编程的过程中,我们总是会不经意的遇到编译器报类重复定义这样的错误。我们可能会觉的很郁闷?明明在main主函数中只包含了一个类的定义,怎么报出这样的错?其实这是预编译器在头文件展开的时候出现的问题。比如说main主函数文件包含了一个#include "A.h" 头文件和一个#include "B.h"头文件,而#include原创 2012-09-04 21:41:49 · 1341 阅读 · 0 评论 -
C++中const指针的应用
用const修饰指针可以形成四种权限的限制,并达到控制指针与所指数据的常态性(也就是做到最小访问权限)。那什么样的场合下会用到这样的权限控制呢?这个主要还是应用在函数调用当中。比如举个例子,当我们调用函数时,并不希望函数体内对于传入的指针参数修改指针所指对象的数据时,就派上用场了。const修饰的指针有四种类型,下面我们来详细解析一下:1.指向常量数据的常量指针(具有最小访问权限),即格式:c原创 2012-08-26 23:11:15 · 729 阅读 · 0 评论 -
++i与i++区别
在C++中++i与i++具有不一样的含义。不一样的地方在于前缀++i在参与表达式运算的时候,是先自增1,然后再参与相应的表达式运算。而后缀i++则是先参与表达式运算,然后再自增1。而–i与++i,i–与i++的运算情况完全一样。下面我们来看一下这背后的代码机制是怎么样的?代码示例:下面代码为Date类中++与–的代码1Date & Date::operato原创 2012-09-09 16:59:22 · 686 阅读 · 0 评论 -
继承中的重载,重写及相应隐藏规则
在C++中的继承中写函数的时候,我们问题会遇到重载,重写,隐藏函数这三大问题。在面向对象的程序设计中,对这三个概念的理解相应重要,否则会出现一些莫明其妙的事件。下面我们来解释下这三个的概念:重载:即在同一个类中声明相同的函数名,但型参列表的参数类型与及参数的数目不同时,应会发生重载。示例代码:class A{public://函数名相同,形成的重载 void f(){}; v原创 2012-09-27 21:40:03 · 381 阅读 · 0 评论 -
虚析构函数存在的理由
我们知道C++中virtual关键字,是产生多态的基础。即父类指针调用同名方法时,产生不同行为。如果子类重写了相应方法,则调用子类重写的方法,否则调用父类的方法。这种形式是我们对虚函数最基本的认识。除了这种方法外,还存在另外一种虚函数的形式--虚析构函数。有人要问了虚函数不是要父类方法与子类方法同名才行的吗? 对,是这样的。但对于虚析构函数来说,这是一个特例。那虚析构函数有什么用呢?不会也要多态变原创 2012-09-27 20:10:26 · 336 阅读 · 0 评论 -
Static类成员
在类中由关键字Static声明的数据成员或成员函数,我们称为静态成员。为什么称为静态,是因为他们独立于类的对象而存在。即使没有对象存在,他们依然在整个静态存储区中存在,生命周期为整个程序运行期。那么他们还有什么其它的特点呢?下面我们就来分析一下,静态成员的独特的一面。 常规状态下,我们知道每个对象都维护着类数据成员的一个副本。每个对象都有自己的状态,状态存在于自身当中。而S原创 2012-09-15 16:47:34 · 405 阅读 · 0 评论 -
指针与引用的异同
在C++中在任何能用指针的地方都可以改用引用。那两者区别何在?指针:即一类专门用来存储别的变量地址的变量,它的内容没有别的,只存别的变量的地址。而且指针变量的内容可以任意改变(也就是存储的地址可以改变,指向任意变量)。例:int *p = 变量地址 p就是指针变量引用:做为其它变量的一个别名而存在,就像一个人的外号一样。外号与姓名都是指本人。而引用只能与一块内存地址唯一绑定,只能初始化原创 2012-09-14 22:02:01 · 425 阅读 · 0 评论 -
数据类型转换及注意事项
在C++中存在三种类型的数据类型转换。1.是隐匿自动转换 2.强制类型转换 3.赋值类型自动截断转换。而对于这三种转换存在相应的规则,它们分别就下面的三种规则进行相应的处理。1.就长不就短原则:即参与表达式计算的变量遵从类型长度最大的原则,在参加运算前把所有变量类型转换成类型最大的那种类型。也称为类型自动提升。这种方式进行的运算具有最大的安全性。所有参与数据都在最大的空间时进行计算,不会原创 2012-09-15 10:43:41 · 722 阅读 · 0 评论 -
预编译的三种情况
在C++中存在三种预编译的行为,1.宏展开 2.#include包含 3.条件限定#if #endif预判断 。 下面我们来逐一的分析这三种情况的用途。1.宏:定义的格式为 #define PI 3.1415 //这就是一个宏定义。它的优点:在程序的任何位置凡是应用到3.1415的地方都可以用PI来代替。如果以后需求改变了,不采用 3.1415值时,可以很方便的修改宏原创 2012-09-16 20:12:27 · 823 阅读 · 0 评论 -
C++中的异常处理
对于程序中出现的异常,C++可以实现相应的异常处理机制。而并不会不友好的强制崩溃,在崩溃的时候会做出相应的提示。C++中的所有异常派生自基类exception,基类exception声明了visual的what函数,此函数可以直接被派生类复写,来实现自定义的异常提示信息。基类exception下面存在三大派生类 1.runtime_error(运行时错误) 2.logic_error(逻辑错误原创 2012-08-21 12:35:38 · 367 阅读 · 0 评论 -
C++中new失败的三种处理方式
如果对象动态的申请内存的时候或调用相应的构造函数来生成对象的时候,而计算机中内存又不够用怎么办?我们第一感觉想到的就是new异常处理啊,对! 我们可以用bad_alloc异常类来抛出new失败的异常,并在catch(bad_alloc &)异常处理器中处理。其实C++中存在有三种new失败的策略。1.应用标准的异常类来处理(c++中推荐的处理方式)代码示例:#include #原创 2012-08-21 21:15:12 · 3029 阅读 · 0 评论 -
声明与定义的区别
C++中的声明与定义边界不是很清晰,那这两者之间到底有什么差别呢?声明: 就是告诉编译器这个变量或函数在内存的某个位置已经定义(即分配了内存地址),向编译器做个自我介绍。如果要用就可以直接用,不需要说再来分配相应的内存。 变量或函数的声明用关键字extern来表明,但函数声明可以省略。原因在于函数的声明与定义边界非常的清晰,没有函数体的就是声明,有函数体的就是定义。定义: 就是原创 2012-08-31 15:34:37 · 351 阅读 · 0 评论 -
函数,变量及存储方案
我们知道变量分为两种类型,一种是自动变量另一种是静态变量,自动变量存储在相应在栈中,创建和销毁与程序的控制权和作用域相关,控制权进入相应作用域则编译器创建并维护变量在相应的栈(一种先进后出的结构)中,出了作用域则自动销毁。也就是说其生命周期由程序的执行状态控制。而静态变量,即是存储在编译器分配的固定的内存中(不在栈中),其生命周期在整个程序运行中一直存在。而这样的内存我们也称为静态内存块。原创 2012-08-30 14:59:36 · 415 阅读 · 0 评论 -
C++中的泛型程序设计---函数模板
模板是C++中功能最为强大的软复用的一种方式,通过函数模板和类模板,我们只需要写一段特定的模板代码,即可以实现不同类型相应功能函数或类的一整套实现。不需要针对不同类型编写多个函数重载(这里就极大的减少了相应代码的编写)。当编译器遇到处理不同的类型时,会调用相应的函数模板来特化自动相应类型的目标代码(也就是说编译器帮我们完成了不同类型的函数重载编写工作). 函数模板的定义:原创 2012-08-15 09:58:55 · 344 阅读 · 0 评论 -
成员初始化器
所有数据成员均可以用成员初始化器的形式来进行初始化,但是对于const数据成员和引用数据成员和成员对象必须用成员初始化器来初始化。成员初始化器出现在构造函数参数列表后和函数体之间,用冒号:来与参数列表区分。多个数据成员之间用逗号来区别。例:Increment::Increment(int c, int i):count(c),increment(i){//count,increment均是原创 2012-08-03 10:23:59 · 683 阅读 · 0 评论 -
动态内存管理
动态内存管理的意义在于,无需提前为相应的数组定义大小,可以由程序在运行的过程中由相应的表达式来赋值生成合适的内存大小。内存的动态分配和释放用new和delete来完成。例:Time *timePtr = new Time;用timePtr指针来指向new出来的Time 类型的对象。而释放的话则通过。例:delete timePtr; 来完成。若只分配不释放,那么系统内存就会被过早的用完,我们称为"原创 2012-08-03 10:22:05 · 299 阅读 · 0 评论 -
代理类:接口与实现的分离
对于提供给客户使用的类,我们如何把接口与实现分离才能更好的体现软件工程的思想呢。我们一般设计类,把类的定义及接口写到相应的头文件中(*.h这样的文件),而对于类中接口(即方法)的定义则放在*.cpp的源文件中,这样的好处就是类的接口与实现分离,然后对于提供给客户的类,客户还是可以看到类头文件中定义的私有属性。虽然客户不一定会直接修改,但我们还是可以把相应的private属性隐藏,让客户只看到相应类原创 2012-08-07 22:17:20 · 378 阅读 · 0 评论 -
C++中的继承
继承是代码复用的重要形式,也是面向对象中最重要的一部分。通过继承我们无需重头创建具有相似功能的类,直接可以复用已有类。C++中对于继承有二个角色关系。1.基类 2.派生类(即从基类中派生而来的类)。派生类从基类中继承所有的属性(除了构造函数,析构函数,赋值重载运算符三个例外)。基类中的所有属性都会得到传承。 如何理解C++中的private, protected, public三个访问说原创 2012-08-15 10:02:38 · 269 阅读 · 0 评论 -
C++泛型程序设计——类模板
对于类模板的声明形式与相应的函数模板相同,只需要在相应类之前加上关键字template ,后面直接接相应的类的定义,唯一不同的地方就是类中所有的类型统一采用T来表式。当程序编译时来根据具体的类型来类模板特化(就是生成能处理具体类型的类)。类型模板T的作用及所处的位置总结:1.相应函数形参类型 2.函数返回值类型 3.局部变量类型。c++中所有的类模板定义在相应的头文件中。只要引入相应的头原创 2012-08-15 09:57:56 · 317 阅读 · 0 评论 -
面向对象与结构化编程区别及异同
结构化编程的语言主流的是c语言,采用结构化的编程方式,主要用来编写操作系统。特点:语言灵活非常接近底层,对硬件有强大的访问能力。对于一个比较复杂的系统,往往是自顶向下,逐步求精,分模块的思想来编写。各个模块单独负责完成一个功能。最后通过拼接的方式来组成整个有机的系统。缺点:数据与操作分离,软件极不容易复用,好比已经有一个本科生的学生管理系统,如果要再开发一个研究生学生管理系统,代码可利用性非常低。原创 2012-08-07 22:15:54 · 1597 阅读 · 0 评论 -
Static类成员
static类数据成员,即属于类的一种服务,可以在类没有实例对象的时候调用。所有类的对象共享一个副本,不像非static数据成员一个,每个对象维护着各自的副本。通常static 数据成员定义成private,通过调用static函数来访问。声明static数据成员时需要注意的一点就是如果没有提供默认的构造函数,则相应的static成员就需要在具体的.cpp文件中定义并声明,否则程序无法通过编译。原创 2012-08-03 10:22:57 · 304 阅读 · 0 评论 -
C++中的多态性
多态性:即基类指针指向派生类对象,当调用相应基类的方法,执行的却是派生类对象的方法(派生类中复写了基类当中相应调用的方法)。程序中的这种形式,我们叫做多态。但在C++中实现多态时,有一个关键字必不可少。如果没有这个关键字,则想通过基类指针调用派生类的方法时,却只能调用基类本身的方法,并没有产生多态的行为。也就是说只调用了句柄(基类指针或引用所指的对象)的方法,而没有调用句柄所指向的派生类的方法。那原创 2012-08-21 12:34:30 · 367 阅读 · 0 评论 -
explicit构造函数的具体应用
对于c++这门语言存在众多的构造函数,如:默认构造函数,拷贝构造函数,转换构造函数。真是相当的多,也相当的复杂。这里就对这三种构造函数做个简短的说明:1.默认构造函数:即创建对象时,编译器自动调用的函数,主要用来生成相应的对象及对private属性进行必要的初始化。就如之前文章介绍过的一样,对于对象数据成员和const数据成员,我们一定要用相应的初始化列表器来做相应的初始化(此时,初始化列原创 2012-08-07 22:18:08 · 394 阅读 · 0 评论 -
迭代与递归深入解析
对于程序开发中要执行相同的运算(例:阶乘运算),我们应该选择哪一种函数调用呢?那迭代与递归调用的相同点与不同点又是什么呢?下面我们就来深入分析其中执行的机制(从性能,变量申请,内存,运算时间方面考虑)。迭代与递归比较:相同点:1.他们都有运算的出口点,也就是说迭代和递归都有自己的终止条件,否则会引发无限循环迭代与无限递归。异同点:1.迭代是不断的对变量A调用变量B(即:所有操作在同一个原创 2012-08-22 11:20:51 · 1031 阅读 · 0 评论 -
深度解析函数调用与变量存储
对于堆栈结构相应大家一定还是很熟悉的吧,其实C++中函数的调用就是应用这一经典数据结构的完美体现。堆栈对于函数就像宗教对于人一样起异常重要的作用。堆栈:即一种先进后出的结构,主要有二种操作方式 1.压入栈 2.弹出栈。 举个比较形象的例子,比如一组菜盘(就是我们平时吃饭用的碟子),我们平时取的时候总是先从最上面取(即:弹出),而放的话也是放在最上面(即:压入)。总体来说就是这样的一种形式。原创 2012-08-21 21:16:57 · 462 阅读 · 0 评论 -
继承中的重载,重写及相应隐藏规则开启的时机
在C++中的继承中写函数的时候,我们问题会遇到重载,重写,隐藏函数这三大问题。在面向对象的程序设计中,对这三个概念的理解相应重要,否则会出现一些莫明其妙的事件。下面我们来解释下这三个的概念:重载:即在同一个类中声明相同的函数名,但型参列表的参数类型与及参数的数目不同时,应会发生重载。示例代码:class A{public://函数名相同,形成的重载 void f(){}; voi原创 2012-09-18 17:42:17 · 379 阅读 · 0 评论