第九章 怎样使用类和对象

第九章 怎样使用类和对象

 

1.构造函数

不需要用户调用,在建立对象的时候自动执行;

类内:类名(参数表){初始化语句;}//带参数类型

类名(参数表):数据成员(参数),...{初始化语句;}//使用初始化列表;

类名(参数表【参数类型 参数名=初始值....】){初始化语句;}

注意:应在声明构造函数的同时指定默认值;

一个类只能有一个默认构造函数,不可同时出现无参构造函数和默认构造函数

类外:  类名::类名(参数表){初始化语句;}

*说明:

构造函数没有返回值,也没有类型;

构造函数不能通过对象调用;

可以用一个对象初始化另外一个对象;

2.析构函数(~取反符)

*执行析构函数的情况——对象释放

*析构函数的作用不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作

*析构函数只有一个,不能被重载;

*先构造的后析构,后构造的先析构

3.对象数组与对象指针(与普通类型使用相同)

4.指向对象成员的指针

数据成员:

数据类型名 *指针变量名;(如果是公用的成员,可以直接通过指针在类外进行访问)

函数成员:

类型名 (类名::*指针变量名)(参数表);

指针变量名 = &类名::成员函数名;

5.公用数据的保护

*常对象:

类名const对象名[(实参表)];或者 const类名 对象名[(实参表)];

说明:对于常对象,只能调用它的常成员函数,而不能调用普通成员函数;

*常成员函数声明:函数类型 函数名(参数表)const

说明:常成员函数可以访问长对象中的数据成员;但仍然不允许修改常对象中数据成员的值

*将常对象中的某个数据成员修改成可更变的数据成员:mutable

mutable 类型名 变量名;

6.常对象成员

*常数据成员:只能通过构造函数的参数初始化表对常数据成员初始化;

*常函数成员:只能引用文本类的数据成员,不能修改;

类型名 函数名(参数表)const//const在声明和定义都要使用该关键词

 

形参

实参

合法性

指针所指对象值的可变性

指向非const型变量的指针

const变量的地址

合法

可以

指向非const型变量的指针

Const变量的地址

非法

/

指向const型变量的指针

Const变量的地址

合法

不可以

指向const型变量的指针

const变量的地址

合法

不可以

 

7.对象的常引用

如果不希望函数调用参数的时候,修改参数,可以把函数形参声明为常引用

函数类型 函数名 const 类型名 &);

8.Const型数据的小结

形式

含义

类名 const 变量名

定义了常对象,其值在任何情况下都不可以改变

类型名 类名::函数名 const

定义了类内常成员函数,可引用,不可修改

类名 *const 变量名

定义了指向该类对象的常指针,指向的对象不可变

Const 类名 *变量名

定义指向该类的常对象的指针,该对象不可通过指针指向来修改

Const 类名&变量名 = 对象名

定义该类对象的引用,两种指向同一空间,对象不可修改

 

9.对象的动态建立和释放

New运算符动态分配空间后,返回一个指向新对象的指针,即内存空间的起始地址

Delete

10.对象赋值和复制

赋值:对象1 = 对象2

复制:类名 对象2(对象1);

  类名 对象2 = 对象1

复制构造函数:参数为同类的常引用

11.静态成员

1.静态数据成员

*如果希望对象中的数据成员是一致的那么可以声明为静态数据成员

*静态数据成员不属于某一个对象,在为对象分配空间中不包括静态数据成员所占的空间。静态数据成员是有独立的存储空间。

*所有同类的对象都共享类中的静态成员数据

*声明形式:static 类型名 变量名

*初始化形式:类型名 类名::变量名 = 初始值;

//不能用参数初始化表对静态数据成员初始化。

*在类外,静态数据成员即可用对象名访问,也可用类名访问

2.静态函数成员

*静态函数成员是类的一部分而不是对象的一部分,所以在类外调用公用的静态成员函数,要用类名和作用域运算符“::”。

调用形式:类名::函数部分;或者 对象名.函数部分;

*静态成员函数没用this指针,因此静态成员函数不能访问对象的非静态数据成员;但是可以直接访问本类的静态成员数据;静态成员函数主要用来访问静态数据成员,而不访问非静态数据成员(若非要使用非静态成员,应通过对象名和成员运算符“.”)

说明:公用成员函数可以引用静态数据成员和非静态数据成员

约定:只用静态成员函数引用今天数据成员,而不引用非静态数据成员。

12.友元

1.友元函数:

*普通函数声明为友元函数:friend 类型名 函数名(参数表);

*类成员函数声明为友元函数:friend 类型名 其他类名::函数名 (参数表);

//这里使用到类的“提前引用”的声明(Class 类名;

建议:先完成类的建立在添加友元成员函数

2.友元类:

*friend 类名;

*说明:1友元的关系是单向的;2友元的关系不能传递;

13.类模板(功能相同,仅仅是数据类型不同)

*声明:

template < c lass 虚拟类型名1 ,c lass 虚拟类型名2...>

   C lass 类模版名{

类体;

*类模板是类的抽象,类是类模板的具体实现

*使用:

类模板名<实际类型名> 对象名(参数表);

 

*特别注意:在模版外定义成员函数格式有所不同

Tempalte <class 虚拟类型名>

函数类型名 函数模版名<虚拟类型名> :: 成员函数名(参数表){函数体;};

*定义对象

类模板名 <实际类型名> 对象名(参数表);

 

 

个人比较分享,欢迎指教;未经允许,请勿转载;

posted @ 2017-06-20 15:54  hello_OK  阅读(243)  评论(0编辑  收藏  举报