对象的相关知识一.动态分配和撤销内存的运算符new和delete(1)在软件的开发中经常要动态的分配和撤销内存空间,例如动态链表中结点的插入与删除。
例如:New int; //开辟一个存放整数的存储空间,返回一个指针。
New int(1); //同上并赋初值为1。
New char[10]; //开辟一个字符数组的空间,返回一个指针。
New int[5][4]; //开辟一个二维数组的空间,返回一个指针。
Float *p=new float(3.14159);//开辟并赋初值。
注意:撤销数组空间用Delete [] 指针名;撤销变量空间用Delete 指针名;(2)对象的动态建立和释放。
1.如果已经定义了一个类box。
可以用下面的方法建立一个对象,对象是无名的,但它确实存在。
New box;2.动态分配返回一个指向新对象的指针,需要定义一个指向本类的对象指针来承接它。
Box *p1;P1=new box;3.在程序中可以通过p1访问这个新建的对象。
Cout<<p1->height:4.c++允许在执行new是初始化。
Box *p1=new box(12,15,18);5.用完后delete [] p1;或delete p1;释放。
二.对象数组(1)含义对象数组的每一个元素都是同类的对象。
(2)初始化1.当构造函数有一个参数时,可以用如下的方式初始化。
Student stud[3]={60,70,78};2.当有多个参数时,用如下方式初始化。
Student stud[3]={student(1001,18,84),student(1002,19,86),student(1003,17,87)}:三.对象指针(1)指向对象的指针1.定义对象指针的一般形式:类名 *类对象指针名2.用途:可以通过对象指针访问对象。
(2)指向对象成员的指针1.指向对象的数据成员的指针数据类型 *指针变量名int *p1;p1=&1.hour;2.指向对象成员函数的指针。
普通函数:数据类型名 (*指针变量名)(参数列表)指针变量名=成员函数名void (*p)();p=fun;(*p)(); //调用函数对象成员函数数据类型名 (类名::*指针变量名)();指针变量名=&类名::成员函数;3.This指针This指针式指向本类对象的指针,他的值是当前被调用的成员函数所在对象的起始位置。
即:*This=a;This指针是系统自动实现的,不必在形参中增加this。
注意:所谓“调用对象a的成员函数f”,实际是调用成员函数f时使this指针指向对象a,从而访问对象a的成员。
四.共用数据的保护(1)常对象1. 定义类名const 对象名(参数列表);或const 类名对象名(参数表列);注意:1.常变量的数据成员必须有初值。
2.对象中的所有数据成员的值都不能被改变,凡是需要数据成员不被改变的对象可以声明为常对象。
3.常对象不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。
例如:const time t1(10,15,36)T1.get_time //不合法若将成员函数声明为常成员函数,则可以调用,但是不允许修改常对象中的数据成员。
4.若在编程时一定要修改常对象中的某个数据成员的值,可以用mutable声明为可变的数据成员。
例如:mutable int count:(2)常对象成员1常数据成员定义Const int hour;注意:1.只能通过构造函数的初始化表对其进行初始化,因为常数据成员不能被初赋值,2.在类中声明一个常数据成员,该类所有的该成员都不能改变,但是其值可以不同(在定义对象时给定)。
(2)常成员函数定义:Void get_time const;注意:1常成员函数只能以用本类中的数据成员不能修改它们。
2.在声明和定义时都要有const关键字。
但调用时不必加。
(3)指向对象的常指针定义:tim *const ptr1=&t1.注意:1在定义指针变量时使之被初始化。
Time *const ptr1=&t1; //正确Time *const ptr1;Ptr1=&t1; //错误2.指向对象的常指针变量的值不能改变,即始终指向同一个对象,但是可以改变指向对象中数据成员的值。
用途:如果想将一个指针变量固定的与一个对象相联系,可以将它指定为常指针,往往用长指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。
(4)指向常对象的指针变量1指向常变量的指针变量定义:const 类型名 *指针变量名注意:1.常变量只能用之指向常变量的指针指向他,而不能用一般的指针变量指向他。
2.指向常变量的指针除了可以指向常变量,还可以指向普通变量。
可以通过指针变量访问该变量,但是不可以改变其值,如果不是通过指针变量访问,则变量的值是可以改变的。
3.如果形参为指向非const型变量,则实参也为指向非const型,形参为指向const 型,则实参可以为任意型,因为当形参为指向非const型变量时,形参指针变量指向的实参可以改变,则实参也必须可以改变,而当形参为指向const型时,形参指针变量所指向的实参是不可以改变的,则实参可为任意。
、4.使用形参的和实参的对应关系如下;注意:1常对象只能用指向常对象的指针指向他。
2.如果定义了一个指向常对象的指针变量指向一个非const的对象,则其指向的对象是不能通过指针来改变的3.指向常对象的指针最常用于形参,目的是保护形参指针所指向的对象,使他在函数执行的过程中不被修改。
4.指向常对象的指针变量,不可以通过它改变所指对象的值,但是指针变量本身的值可以改变。
5.在函数中可以修改形参变量的值,但是不能改变其所对应的实参t1的值,这是因为用对象作函数参数时,将建立一个新对象,他是实参对象的拷贝函数,实参把值传给形参,二者分别占有不同的存储空间。
无论形参是否修改都不会影响实参的值。
这种形式的虚实结合要产生实参的拷贝,当对象桧木较大时,则时间和空间开销可能都比较大。
一次常用指针作函数参数。
(3)对象的常引用。
1.如果不希望在函数中修改实参t1的值,可以将引用变量t声明为const(常引用)2.在c++对象程序设计中,经常用常指针和常应用需哦函数参数,这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝函数,可以提高程序的运行效率。
(4)const型数据的小结(1)对象的赋值对象之间的赋值是通过赋值运算“=”进行的,本来,赋值运算符“=”只能用来对单个变量赋值的,现在被拓展为两个同类对象之间的赋值,这是通过运算符重载实现的。
际上,这个过程是通过成员赋值完成的,即将一个对象的成员值赋值给另一个对象。
一般形式为对象1=对象2;注意:1。
象以和对象2必须属于同一类。
2.对象的赋值只是对其中的数据成员赋值,而不是对成员函数赋值,不对象的成员函数是同一个函数代码,不需要也无法对他们赋值。
3.类的数据成员中不能包括动态分配的数据,否则在赋值是可能出现严重的后果。
(2)对象的复制定义:类名对象1(对象2);在建立一个新对象的时候调用了一个特殊的构造函数——复制构造函数。
1.这个函数的形式是这样的:Box::box(const box&b) //参数是本类对象的常引用。
{height=b.height;Width=b.width;Length=b.length;}2.复制构造函数也是构造函数,但是它只有一个参数,这个参数是本类的对象(不能是其他类的对象),而且采用对象的引用形式(一般约定家const声明,使参数不能改变,以免调用此函数是因不慎而使对象值被修改)。
3.C++还提供了另一种方式的赋值类名对象名1=对象名2;可以在一个语句中进行多个对象的复制。
例如:box box1=box2,box3=b4.普通构造函数与复制构造函数的区别;在形式上:类名(形参表列);//普通构造函数的声明类名(类名&对象名)//复制构造函数的声明在建立对象时实参类型不同。
系统会根据实参的类型决定调用哪个;5.在什么情况下调用调用赋值构造函数、○1程序中需要建立一个新对象,并用另一个对象的同类的的对象对他初始化。
○2当函数的参数为类的对象时。
○3函数的返回值是类的对象。
这些都是系统制动实现的用户只要知道就行。
六.静态成员(1)静态数据成员如果在一个程序文件中有许多个函数,在每一个函数中都可以改变全局变量的值,全局变量的值为各函数共享。
但是用全局变量是安全得不到保障。
因此在程序中少用全局变量。
如果象实现多个对象之间的数据共享,可以用静态的数据成员。
定义:static 数据类型数据成员名;注意:1.静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员的所占的空间,只要在类中定义了静态数据成员,即使不定义对象,也为静态函数分配空间,也可以被引用。
2.他不随对象的建立而分配空间,也不随对象的撤销而释放。
3.静态数据数据成员可以初始化,但是只能在类外进行初始化。
一般形式为:数据类型类名::数据成员名=初值;不能用参数的初始化表对其惊醒初始化:4.数据成员可以通过对象名引用,也可以通过类名来引用。
(2)静态成员函数定义:ststic int volume();注意:1静态数据成员是类的一部分,如果要在类外调用静态成员函数,要用类名和域运算符”::”,实际上也允许通过对象名它调用静态函数;2.与静态数据成员不同,静态成员函数是为了能处理静态数据成员。
3.当调用一个对象的成员函数时,系统会把对象的其实地址赋给函数的this指针。
而静态成员函数并不属于某一对象,他与任何对象都无关,因此静态数据成员函数没用this指针。
既然他没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问。
4.非静态成员函数有this指针,而静态成员函数没有this指针。
由此,决定了静态成员函数不能访问本类中的非静态成员。
静态数据成员可以直接引用本类中的静态数据成员,5.静态成员函数也不是绝对不能访问本类中的非静态成员,知识不能进行,默认访问,因为无法知道应该去找那个对象。
如果一定要引用本类中的非静态数据成员,应高加对象名和成员运算符“.”。
如:对象名.数据成员;七.友元类具有封装性和信息隐蔽的特性,只有成员函数才能访问私有成员。
程序中的其他函数是无法访问私有成员。
(1)友元函数和友元类定义:Friend 函数或类声明;此句可以放在类中的任意位置。
将另一个函数声明为友元类或友元函数,则另一函数可以直接访问该类中的私有成员。
(2)优缺点优点:提高效率方便编程。