类与对象

类与对象

类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类

img

函数

范围解析运算符

:: 在类的外部使用范围解析运算符 :: 定义该函数

构造函数

隐式调用构造函数: 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

  1. C++提供了一个特殊的对象指针——this指针。它指向类对象的首地址

  2. 成员函数通过这个指针可以知道自己当前属于哪一个对象。

  3. this指针是一种隐含指针,它隐含于每个类的成员函数中。

this 指针是const 指针,即编译器规定不允许在程序中修改它的值。

当形式参数与数据成员同名时,需要加this:

const

**返回类型成员函数名(形参)const **

只读本类的数据成员而不能修改它们

只能用指向常对象的指针变量指向常对象。

指向常对象的指针变量即可指向常对象,也可指向非常对象。

不能通过该指针改变对象。该指针变量本身可以改变。

常用于函数形参,目的是保护形参指针所指向的对象,使它在函数执行过程中不被修改。

即只想在函数中引用该对象,而不想改变它。

静态成员

静态成员的特性:

不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。

不能在类中进行初始化,也不能通过构造函数初始化。因为在类中不给它分配内存空间。必须在类声明之外使用单独的语句初始化。一般在main() 开始之前、类的声明之后的全局地带为它初始化。

格式:数据类型类名::静态数据成员名=初值;

在类外定义时,不要用static前缀。

静态成员函数中没有this指针,因为它不与特定的对象相联系

静态成员函数访问的基本上是静态数据成员。最好不用静态成员函数引用非静态数据成员。

使用静态成员函数的另一个原因是:可以用它在建立任何对象之前处理静态数据成员,这是普通成员函数不能实现的功能。

posted @ 2022-05-12 09:38  孙二牛  阅读(52)  评论(0编辑  收藏  举报