目录
一、static成员
1.1 特性
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;
- 用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 类静态成员即可用类名::静态成员或者对象.静态成员来访问
- ⽤static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
- 静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。
- 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
- 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不⾛构造函数初始化列表。
1.2 应用
#include<iostream>
using namespace std;
class test
{
public:
//静态成员函数
static int Get()
{
return _test;
}
private:
//类里面声明
static int _test;
};
// 类外⾯初始化
int test::_test = 0;
int main()
{
//两种访问方式
cout << test::Get() << endl;
test t;
cout << t.Get() << endl;
return 0;
}
二、友元
2.1 特性
友元分为:友元函数和友元类,在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。
友元函数:
- 外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。
- 友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。
- ⼀个函数可以是多个类的友元函数。
友元类:
- 友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。
- 友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。
- 友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是B的友元。
2.2 使用
流操作符的提取使用友元函数就可以访问类内私有成员
#include<iostream>
using namespace std;
#include<assert.h>
class Date
{
// 友元函数声明
friend ostream& operator<<(ostream& out, const Date& d);
public:
Date(int year = 2005, int month = 6, int day = 8)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
//友元函数实现
ostream& operator<<(ostream& out, const Date& d)
{
out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
return out;
}
int main()
{
Date d;
cout << d << endl;
return 0;
}
三、内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,
它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
- 内部类可以定义在外部类的public、protected、private都是可以的。
- 内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
- sizeof(外部类)=外部类,和内部类没有任何关系。
四、匿名对象
匿名顾名思义就是没有名字:⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的类型对象名(实参) 定义出来的叫有名对象。
匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象。