声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;
class A
{
public:
A()
{
++n;
}
A(const A& aa)
{
++n;
}
// static成员函数没有this指针
static int GetN()
{
//a++;
return n;
}
private:
// 不是属于某一个对象,属于所有对象,属于整个类
// 声明
static int n;
int a = 0;
};
// 定义
int A::n = 0;
静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
class A
{
private:
// 不是属于某一个对象,属于所有对象,属于整个类
// 声明
static int n;
int a = 0;
};
int main()
{
cout << sizeof(A) << endl;
return 0;
}
静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
class A
{
public:
A()
{
++n;
}
A(const A& aa)
{
++n;
}
// static成员函数没有this指针
static int GetN()
{
//a++;
return n;
}
public:
// 不是属于某一个对象,属于所有对象,属于整个类
// 声明
static int n;
int a = 0;
};
// 定义
int A::n = 0;
int main()
{
A aa1;
cout<< A::n << endl;
cout << aa1.GetN() << endl;
cout << A::GetN() << endl;
return 0;
}
class A
{
public:
A()
{
++n;
}
A(const A& aa)
{
++n;
}
// static成员函数没有this指针
static int GetN()
{
return n;
}
private:
// 不是属于某一个对象,属于所有对象,属于整个类
// 声明
static int n;
int a = 0;
};
// 定义
int A::n = 0;
int main()
{
cout << A::n << endl;
return 0;
}
class A
{
public:
A(int a)
{
++_scount;
}
A(const A & t)
{
++_scount;
}
~A()
{
--_scount;
}
static int GetACount()
{
return _scount;
}
private:
int a;
static int _scount;
};
int A::_scount = 0;
void TestA()
{
cout << A::GetACount() << endl;
A a1(10), a2(3);
A a3(4);
A a4 = 10;
cout << A::GetACount() << endl;
}
int main()
{
TestA();
return 0;
}
友元是C++中提供的一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装
比如说在类中私有的成员变量只有成员函数可以放其他函数是不能访问的但是使用了友元函数声明了之后,进行声明的类中就可以去访问我们的私有成员了。
其实我们以前在使用 重载流插入和留提取的时候就必须要用到友元函数。
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
// d1 << cout; -> d1.operator<<(&d1, cout); 不符合常规调用
// 因为成员函数第一个参数一定是隐藏的this,所以d1必须放在<<的左侧
ostream & operator<<(ostream& _cout)
{
_cout << _year << "-" << _month << "-" << _day << endl;
return _cout;
}
Date operator+(Date& a)
{
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2022, 10, 22);
Date d2(d1);
d1 << cout ;
d1.operator<<(cout); //不符合常规调用
//和我们重载++一样只不过要把第一个操作顺序改为cout
d1 + d2;
return 0;
}
class Date
{
friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
_cin >> d._year;
_cin >> d._month;
_cin >> d._day;
return _cin;
}
int main()
{
Date d;
cin >> d;
cout << d << endl;
return 0;
}
对一个函数进行友元声明,这个函数就叫友元函数,可以访问声明类中的私有成员。而友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
class Time
{
friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类
public:
Time(int hour = 0, int minute = 0, int second = 0)
: _hour(hour)
, _minute(minute)
, _second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
void SetTimeOfDate(int hour, int minute, int second)
{
// 直接访问时间类私有的成员变量
_t._hour = hour;
_t._minute = minute;
_t._second = second;
}
private:
int _year;
int _month;
int _day;
Time _t;
};
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越 的访问权限。
内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访 问外部类中的所有成员。但是外部类不是内部类的友元。
特性:
class A
{
public:
class B
{
public:
void fun(const A& a1)
{
cout << a1._year << endl;
cout << a1.n << endl;
}
private:
int _month;
int _day;
};
private:
int _year;
static int n;
};
int A::n = 1;
int main()
{
A::B b;
b.fun(A());
return 0;
}
在类的结构书写完成之后,我们实例化的对象叫做有名对象,而我们没有对一个对象没有起名的话那么他就是匿名对象。
class A
{
public:
A(int n = 0)
{
cout << "A()" << endl;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _n;
};
int main()
{
//有名函数
A a1();
//匿名函数
A();
return 0;
}
但是不要小看了匿名函数嗷,有些地方我们对匿名函数的需求还是很好的。第一匿名函数不需要创建对象想用直接用就好了,第二点就是匿名对象的声明周期只有一行。