数据结构-----C++编程基础

来源:互联网 发布:string转char数组 编辑:程序博客网 时间:2024/06/15 17:13

大概介绍:1. 类(访问控制,成员函数,构造函数与析构函数,动态存储);

  2. 特性(引用,友元,重载);

  3.代码重用机制(继承,多态,模板);



1  类

1.1 访问控制

成员访问限定符:private,public,protected(限定各个成员的访问权限)

private:私有的

此后声明的是类的私有类型成员。私有数据成员和成员函数是不透明的,即只允许本类的成员函数来访问,不能在类的定义域外被访问。

public:公共的

此后声明的是类公有类型成员。他们是类与外部的接口,外界可通过这些接口与类发生联系。

protected:保护的

此后的声明的是保护类型成员。他们用于类的派生和继承,他们不能被类外直接访问,允许本类的成员函数或派生类的成员函数来访问。

类是一种抽象数据类型,而对象是这种数据类型的实例。类的实例就是指定义类的变量。

定义对象的形式:class  类名 对象名
或  类名  对象名
访问对象中的成员时,可通过对象名和成员运算符访问对象中的成员,也可通过指向对象的指针访问对象中的成员。
eg:对象.成员或成员函数;对象指针->成员或成员函数
注:访问成员时应注意成员的访问权限,在类外只能访问public成员,不能直接访问private成员。
为了实现类与外界的接口,应当至少有一个共有的成员函数,以作为类的外部接口,否则程序无法对对象进行任何操作。

1.2成员函数

类的成员函数可在类的定义体中定义;也可在类定义体中声明,说明此函数的参数列表和返回类型,而后在定义体外给出具体实现,具体实现一般形式如下:(::作用域运算符
返回值类型  类名::成员函数名(参数列表){
...//函数体
}
注:当定义一个类的多个对象时,每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括成员函数代码所占用的存储空间。即只用一段存储空间来存放这个共同的函数代码段。在调用各个对象的函数时,都会转去调用这个公共的函数代码。
一个对象所占的存储空间大小只取决于该类对象中数据成员所占用的空间,而与成员函数无关。成员函数代码是存储在对象空间之外的。
不同对象使用同一段函数代码时,通过this指针(指向对象本身的指针,其值是当前被调用的成员函数所在对象的起始地址),分别对不同对象的数据进行操作。

1.3 构造函数与析构函数

作用:使用户自定义类的使用和一般数据类型的使用一样,在被创建时初始化,在使用结束时进行撤销。

构造函数

无需用户调用,在创建对象时自动执行。
特点:函数名与类名一致;一般声明为public,无返回值,无需返回类型;系统自动调用,且只执行一次。

构造函数一般形式:函数名 (类型1 形参1,类型2 形参2,类型3 形参3...){   }
定义对象的一般格式:类名  对象名(实参1,实参2,实参3...)
构造函数的参数值可以是通过实参传递,也可以是默认参数值。
构造函数的定义可使用初始化列表的形式,   函数名 (类型1 形参1,类型2 形参2,类型3 形参3...):成员1(形参1),成员2(形参2),成员3(形参3){   }

拷贝构造函数

通过同一类型的其他对象初始化一个对象。他是特殊的构造函数,其形参为本类的对象引用。当拷贝构造函数调用时,他将自己已有对象的整个状态复制到相同类的新对象中。
定义:
class  类名{public:          类名(形参);     //构造函数          类名(类名 & 对象名);  //拷贝构造函数};
实现:
类名::类名(类名 &对象名){函数体}

自动调用拷贝构造函数的情形:1,通过声明初始化来复制对象时;2,对象按值传递给函数时;3,从函数返回一个对象时。

析构函数

特点:析构函数与类名相同,并要在前面加~符号;析构函数不能接收任何参数,也没有返回类型说明;一个类只有一个析构函数。 
若实现并未定义析构函数,C++编译器会默认生成一个析构函数,但他什么操作都不执行,想让析构函数完成需要的操作,必须在定义的析构函数中指定。
析构函数的作用:在撤销对象所占用的内存前完成一系列的清理工作,使这部分内存可以被程序分配给新的对象使用,并非删除对象。当对象的生命周期结束时,会自动执行析构函数。

注:作用域不同于生命周期。它们从两个不同的维度描述了一个变量--空间和时间。顾名思义,作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域;而生命周期就是这个变量可以被引用的时间段。不同生命周期的变量,在程序内存中的分布位置是不一样的。一个程序的内存分为代码区、全局数据区、堆区、栈区,不同的内存区域,对应不同的生命周期。

动态存储(new,delete)

new

分配自由存储区的内存格式:new  类型     此时返回的是一个内存地址,他必须被赋值给一个指针。当然也可说明指针的同时对他进行初始化,此时也可进行赋值  ,如:  类型 * 指针变量名 =new 类型(初始值)。
如果new 运算无法再在自由存储区中分配新的空间,他将返回NULL,即空指针。

delete

new分配来的空间无法自动释放,需调用delete。使用delete运算符删除一个指针时,即删除了这个指针所指内存空间,让此空间仍可自由分配。若对同一指针使用两次delete运算,则可能使程序崩溃。
特殊的,释放存放数组的内存,应在delete运算符与指向堆数组的指针间加上一对方括号。
另外,类名  * 指针名=new 类名 ;  //此处调用了默认构造函数;
          delete   指针名;                   //此处调用了对象析构函数。

使用动态存储机制时,需要避免内存泄漏。
当类的成员为指针变量且无自定义的拷贝构造函数时,一旦程序中进行了拷贝构造函数的操作,C++中会调用默认的拷贝构造函数,而指针成员的复制则是完成了地址的复制,使两个对象的指针成员指向同一个地址,那么在最后函数退出时,先执行拷贝得来对象的析构函数,则此时指向的地址内存已被释放,之后在调用之前对象的析构函数时会出现错误。此时的办法便是自定义构造函数。

2.特性

引用(别名)

定义:类型 &引用变量名= 已定义的变量(对象名)
&为引用声明符,说明两个变量占用同一个内存地址,b是a的引用表明b具有a的地址。

作用:函数参数传递。
传递引用给函数时,传递的是实际的参数(变量或对象)本身,而不是在函数作用域内建立变量的或对象的临时副本。

返回引用:函数返回一个变量的引用,赋值语句中,当函数被用作左值时,将右值赋给左值,即将右值赋给从函数返回的变量。

按值传递参数和返回(局部拷贝),需要调用拷贝构造函数,最后返回时,局部拷贝后需要一一析构。而按地址传递和按引用传递则不需要局部拷贝,从而减省开销,所以当自定义对象比较庞大时,不适合采用按值传递。


友元

作用:用于解决类外访问私有成员的问题(频繁调用函数访问私有成员,会使程序的开销很大)
友元的定义在要声明的友元函数,友元成员或友元类前加关键字friend。

友元函数

友元函数是能够访问类的私有成员并在类外定义的普通函数。

声明格式:friend 返回类型 函数名(参数表)
声明