类与对象
类与对象
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类
函数
范围解析运算符
:: 在类的外部使用范围解析运算符 :: 定义该函数
构造函数
隐式调用构造函数: complex A(1.1 , 2.2);
显式的调用构造函数: complex A=complex(1.1 , 2.2);
无参构造函数调用形式:complex A;
创建对象数组时
这个类必须有无参构造函数或形参皆有缺省值
析构函数
释放分配给对象的内存空间
当撤消对象时(对象生命周期结束时),系统会自动地调用析构函数。
而是在撤销对象占用的内存之前完成一些清理工作---释放资源。
先构造的后析构,后构造的先析构
全局对象:在主函数之前构造,主函数结束或调用exit(0)时,析构。
局部自动对象:函数调用,建立对象时构造,函数结束时析构。多次调用函数,就多次构造和析构。
局部静态对象:程序第一次调用函数时构造,主函数结束或调用exit(0)时,析构。其间,调用函数不构造也不析构。
重载
class Time{
//重载减号
Time operator-()const{
}//cconst成员函数不能修改调用该函数的对象
};
友元
类的主要特点之一是数据隐藏
由于重载之后的B*(double)
只能左边是调用对象
用非成员函数(使用的所有值都是显性参数
这个时候就可以使用友元函数了
1.创建
在类声明的原型前面加上关键词friend
不属于成员函数,无法使用成员运算符来调用
但是与成员函数的访问权限是一致的
不需要 范围解析运算符
2.友元: 重载<<运算符
cout 是一个 ostream 对象,能够智能识别c++的基本类型
void & operator<<(ostream &os,const Time & t){//采用引用而不是取值,普通类型用引用更快
}
//这种情况下只能 time << cout
//不符合
//可以用友元函数来实现
//这种情况不能用cout<<"7"<<time,而通常能用是因为它返回一个指向ostream的引用,(cout<<)本身就是一个ostream对象
void & operator<<(ostream &os,const Time & t){//采用引用而不是取值,普通类型用引用更快
return os;
}
rand()函数
rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。
int rand(void);
void srand (usigned int seed);
在调用rand()函数之前,可以使用srand()函数设置随机数种子,如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子为1。随机种子相同,每次产生的随机数也会相同。
srand()用来设置rand()产生随机数时的随机数种子。参数seed是整数,通常可以利用time(0)或getpid(0)的返回值作为seed。//Time(0)是得到当前时时间值(因为每时每刻时间是不一样的了)。
使用rand()和srand()产生1-100以内的随机整数:
三、使用rand()和srand()产生指定范围内的随机整数的方法
“模除+加法”的方法
因为,对于任意数,0<=rand()%(n-m+1)<=n-m
对象指针
对象空间的起始地址,称为对象的指针
Time *pt;//定义pt为指向Time类对象的指针变量
This
-
C++提供了一个特殊的对象指针——this指针。它指向类对象的首地址。
-
成员函数通过这个指针可以知道自己当前属于哪一个对象。
-
this指针是一种隐含指针,它隐含于每个类的成员函数中。
this 指针是const 指针,即编译器规定不允许在程序中修改它的值。
当形式参数与数据成员同名时,需要加this:
const
**返回类型成员函数名(形参)const **
只读本类的数据成员而不能修改它们
只能用指向常对象的指针变量指向常对象。
指向常对象的指针变量即可指向常对象,也可指向非常对象。
不能通过该指针改变对象。该指针变量本身可以改变。
常用于函数形参,目的是保护形参指针所指向的对象,使它在函数执行过程中不被修改。
即只想在函数中引用该对象,而不想改变它。
静态成员
静态成员的特性:
不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。
不能在类中进行初始化,也不能通过构造函数初始化。因为在类中不给它分配内存空间。必须在类声明之外使用单独的语句初始化。一般在main() 开始之前、类的声明之后的全局地带为它初始化。
格式:数据类型类名::静态数据成员名=初值;
在类外定义时,不要用static前缀。
静态成员函数中没有this指针,因为它不与特定的对象相联系
静态成员函数访问的基本上是静态数据成员。最好不用静态成员函数引用非静态数据成员。
使用静态成员函数的另一个原因是:可以用它在建立任何对象之前处理静态数据成员,这是普通成员函数不能实现的功能。