第九章 怎样使用类和对象
第九章 怎样使用类和对象
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 虚拟类型名>
函数类型名 函数模版名<虚拟类型名> :: 成员函数名(参数表){函数体;};
*定义对象
类模板名 <实际类型名> 对象名(参数表);
个人比较分享,欢迎指教;未经允许,请勿转载;