之前见识和运用的都是全局函数,在这里对成员函数和友元函数做个学习小记。
目录
成员函数:
类的成员函数与普通函数一样,都有返回值和参数列表,不同的是——成员函数是一个类的成员,它出现在类体中,作用范围由类来决定。
成员函数可以操作类的任意对象,可以访问对象中的所有成员。
在C++中,对于任意一个类,都会提供四个默认的成员函数——构造函数、析构函数、拷贝构造函数、赋值函数。
成员函数的定义方法:
成员函数有两种定义方法:
1、直接在类的内部定义
#include<iostream>
using namespace std;
int main()
{
class Goust
{
int a;
int b;
int c;
int name()
{
return a+b+c;
}
};
}
2、在类外使用范围解析运算符
class Goust
{
int a;
int b;
int c;
int name();
};
int Goust::name()
{
return a+b+c;
}
(不要在主函数中用,会报错)
成员函数的调用:
在对象上使用点运算符
Goust xx;
xx.name();
结合举例
#include<Windows.h>
#include<iostream>
using namespace std;
class Goust
{
public:
int a;
int b;
int c;
int name();
void za(int ab)
{a=ab;}
void zb(int bc)
{b=bc;}
void zc(int cd)
{c=cd;}
};
int Goust::name()
{
return a+b+c;
}
int main()
{
Goust xx;
int d=0;
xx.za(4);
xx.zb(7);
xx.zc(9);
d=xx.name();
cout<<d;
Sleep(10000);
return 0;
}
输出
友元函数
类的友元函数定义在类的外部,但有权力访问类里的私有成员和保护成员。友元可以是一个类,也就是友元类,类及其所有成员便均是友元。
友元所使用的关键字是friend
简单代码示例
#include<Windows.h>
#include<iostream>
using namespace std;
class Goust
{
int m;
public:
void trans(double t);
friend void pri(Goust goust);
};
void Goust::trans(double t)
{
m=t;
}
void pri(Goust goust)
{
cout<<goust.m<<endl;
}
int main()
{
Goust goust;
goust.trans(67);
pri(goust);
Sleep(10000);
return 0;
}
输出
友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用(因为友元函数里不含this指针)。
但是,当其访问的是静态成员(static)时,则不需要对对象进行引用。(具体原因看下面)
例如
#include<Windows.h>
#include<iostream>
using namespace std;
class Goust
{
double m;
static int z;
public:
void tran(int p);
};
int Goust::z;//声明
void tran(int p)
{
z=p;
cout<<z;
}
int main()
{
goust.tran(87);
Sleep(10000);
return 0;
}
在定义静态成员时,别忘了再类后面声明或者初始化。
静态成员
- 无论创建多少个类的对象,静态成员都只有一个副本。
- 他在类的所有对象中是共享的。
- 如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。
- 静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。
- 静态成员函数有一个类范围,不能访问类的 this 指针。可用于判断类的某些对象是否已被创建。
- 不能把静态成员的初始化放置在类的定义,可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。
class Goust
{
public:
double m;
static int z;
...............
};
int Goust::z;
....
.....
.....
int main()
{
Goust goust;
..........
cout<<goust.m;
cout<<Goust::z;//输出上的不同
return 0;
}