摘要: 数组是一组相同类型的对象的集合,这些对象有一定的顺序,在逻辑上是连续的,在内存中位置也是连续的。使用数组的好处之一就是,当我们面对大量相同类型的数据时,不需要对每个变量单独声明、定义和操作,只需要利用循环结构,用一条语句解决对多个变量的操作。数组名是一个常量,是数组元素集合在内存存储的首地址,不能进行自增自减运算。数组每一维的下标下界是0,上界是该下标所在维的元素个数减1。多维数组的存储方式:多维数组右边的下标为低位,左边的下标为高位。每一位都在自己的上下界之间变化。当某一位超过上界,则向左进位,该位和右边各位就恢复为下界。最右边一维下标变化最快,最左边一维下标变化最慢。比如,a[0][0][ 阅读全文
posted @ 2012-08-24 23:23 congcongfiry 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 有些数据需要共享但又不允许更改其值,我们需要将其声明为常量。常量包括:常引用、常对象、对象的常指针、常数组、常指针等。与常量概念相关的还有类的常成员函数。我们常见到的是常引用做为函数的形参,这样可以避免实参被修改。因为常引用所引用的对象不能被修改。常对象,其实是指对象在自己的生存期内,其数据成员不会被修改。声明常对象时,必须对其初始化。修改普通对象的数据成员的方式有两种,一种是通过对象名访问其公有数据成员并修改其值的方式;另一种是类的成员函数修改其数据成员的方式。这两种方式对修改常对象的数据成员都是无效的:常对象的数据成员不能被修改,而且常对象不能调用普通的成员函数,常对象只能调用类的常成员函 阅读全文
posted @ 2012-08-23 18:26 congcongfiry 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 面向对象的程序设计中,数据描述对象的属性,函数是行为,用来处理数据。将数据和函数封装到一个类中,类中的函数成员可以处理数据成员,函数成员之间可以共享数据。函数之间可以共享数据的方式包括:局部变量,全局变量,类的数据成员,类的静态成员和友元。其中,通过参数传递,可以在主调函数和被调函数之间实现对局部变量的数据共享。(具体如何实现?需要实践。)全局变量具有文件作用域,文件中的各个函数都能共享全局变量。类的数据成员具有类作用域,能够被类的函数成员共享。如果对类的数据成员设置为私有类型,则可以对类的数据成员实现隐藏和共享,其中,隐藏是针对类的范围以外,而共享针对的是类的范围之内。类的静态成员可以是数据 阅读全文
posted @ 2012-08-21 23:48 congcongfiry 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 作用域表示某个标识符在什么范围有效。可见性指的是标识符是否可见,可引用。生存期,是指程序中的简单变量和类的对象,它们同自然界中的万物一样,也有自己的产生和消亡的生存期,变量和对象的生存期包括静态生存期和动态生存期。具有静态生存期的变量和对象,它们的生存期与程序的运行期相同;除了具有静态生存期的变量和对象,其余的变量和对象则具有动态生存期。具有动态生存期的变量和对象,它们于被声明处产生,于自身的作用域结束处释放。全局变量有文件作用域,也就是说,在整个文件作用域中,除了定义了同名局部变量的块以外的其他地方,都可以直接引用全局变量;局部变量就是具有块作用域的对象。局部变量也可以有静态生存期,静态局部 阅读全文
posted @ 2012-08-20 22:27 congcongfiry 阅读(1496) 评论(0) 推荐(0) 编辑
摘要: 类模板是一种模板,它通过在类定义上铺设类型参数的形式,表示具有相似操作的系列类。类模板不是类,但是可以利用类模板生成模板类。简单记下,明天再理解。类模板是为类声明的一种模板,使得类中的某些数据成员,或者成员函数的参数,或者成员函数的返回值的数据类型可以取任意类型,包括基本数据类型和自定义数据类型。模板参数表,主要是类型参数,也可以有值参数,或者称为非类型模板参数。模板参数表可以既包含类型参数,又包含值参数。类模板的成员函数都是函数模板。类是对对象的抽象,类模板是对类的抽象。这种抽象是通过其参数可以取任意的数据类型来实现的。 阅读全文
posted @ 2012-08-18 00:00 congcongfiry 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 我们将现实世界中的事物抽象成类时,可能会形成很复杂的类。为了简洁开发,我们会将其中相对独立的部分抽象成一个个简单的类,这些简单的类又可以分为一些更简单的类,最后,由这些简单的类再组成我们需要的类。类的组合,其实就是在一个类中内嵌了其他类的对象做为组合类的成员的情况。一般简单类的数据成员是简单数据类型和自定义数据类型的。现在我了解到,类的数据成员也可以是类类型的。如果一个类中内嵌了其他类的对象,那么创建这个类的对象时,其内嵌对象也会被自动创建。构造这个类的对象时,要首先对内嵌对象初始化,再初始化组合类的对象。也就是说,先调用内嵌对象的类的构造函数,再调用组合类的构造函数。组合类生命周期结束时,调 阅读全文
posted @ 2012-08-16 12:58 congcongfiry 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 为了理解构造函数和析构函数,先说明一下同一个类的对象之间的不同之处:首先,对象名不相同。其次,对象的数据成员的值不相同。我们在声明一个对象时,可以对其初始化。如果对其初始化,那么程序会向操作系统申请为其分配一定的内存空间,在为其分配内存空间时,会将初始化写入内存单元中。问题是,我们不能像初始化一般变量那样,在对其初始化时,将初始值写入内存单元中,这是因为相对于这种初始化方法来说,类的对象太过复杂。构造函数:我们用构造函数来初始化类的对象。C++在创建对象时,都会调用构造函数。构造函数是一种特殊的类成员函数,当然可以直接访问类的所有数据成员;可以是内联函数,可以有形参列表,可以有默认形参值,可以 阅读全文
posted @ 2012-08-15 18:13 congcongfiry 阅读(895) 评论(0) 推荐(0) 编辑
摘要: 以时钟为例初步理解类成员的访问控制属性。我们不能拆开时钟看时分秒的值,也不能直接调整时钟的时分秒值,而是通过时钟的面板看时间,通过按钮设置时间。所以,时钟类Clock中设置时间的函数SetTime(int NewH, int NewM, int NewS)和显示时间的函数ShowTime()的访问控制属性都是public,是Clock类的外部接口。而Clock类中的Hour, Minute, 和Second的访问控制属性都是private。外部不能直接访问,而需要通过外部接口实现访问。 阅读全文
posted @ 2012-08-14 18:25 congcongfiry 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 不必定义不同名称的函数,而是利用重载函数,就可以实现对不同类型的数据进行相似操作的目的。编译器根据实参与形参的类型和个数,进行最佳匹配,来确定调用哪个函数,而与函数的返回类型无关。重载机制体现了面向对象的程序设计中类的多态性。有时候,使用重载函数还是不能达到最简洁的效果,比如,当几个函数只有返回类型和参数类型不同,而功能完全相同时,如果可以只用一段代码而不是定义几个重载函数来完成时,代码的复用性和开发效率会更高。这种情况可以用函数模板实现。编译器会根据调用函数时传入的实参类型,来确定函数模板的类型参数是什么类型,之后,编译器会根据判断结果生成一个符合要求的函数。调用语句其实调用的是编译器利用函 阅读全文
posted @ 2012-08-12 18:13 congcongfiry 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 形参是函数声明和定义的时候跟的参数,实参是调用函数时传进去的参数。形参只是对参数进行类型说明,函数没有被调用时,形参不占用内存;只有在调用时,才会为形参分配内存,将实参传递进去,即用实参对形参进行初始化。函数的参数传递有两种方式:值传递和引用传递。值传递,就是函数调用时,给形参分配内存空间,利用实参对形参进行赋值。之后的执行过程中,形参和实参就脱离关系,互不影响。也就是说,用实参初始化形参之后,形参在子函数内如何变化,与实参无关。子函数返回或结束后,调用函数中的实参的值,并未因为赋值给形参,形参在子函数中改变而改变。引用传递,就是利用引用类型的特点,来满足我们对于达到在被调函数中对形参的操作, 阅读全文
posted @ 2012-08-11 23:18 congcongfiry 阅读(8184) 评论(0) 推荐(0) 编辑