目录
一、初始化列表
初始化列表写在构造函数参数下面,用冒号开始,逗号分隔,每一个成员属性后用括号内的参数进行初始化。
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
为什么使用初始化列表,是因为成员属性一个初始化的时机。如果是普通的int类型等不需要初始化的属性,可不用初始化列表。但若是const类型的属性需要在定义的时候就初始化好,这时我们就一定要使用初始化列表来初始化这类属性,包含引用成员变量 、const成员变量 、自定义类型成员(该类没有默认构造函数)。
class A
{
public:
A(int a)//没有默认构造函数
:_a(a)
{}
private:
int _a;
};
class B
{
public:
B(int a, int b)
:_a(a)
,_b(b)
,_c(1)
{}
private:
A a; // 没有默认构造函数
int& b; // 引用
const int c; // const
};
二、static成员
在类中的属性前加static就是静态属性,在函数前加static就是静态成员函数。
在类中设置静态变量_scount,该变量生命周期不会随着一个对象结束而结束,任意一个该类的对象都会操作该属性。而静态函数GetACount,任意不同的对象调用该函数都是一样的,也可以直接使用A::来调用函数。个人理解,静态的成员因为其生命周期在一个类中,相当于该类的不同对象共同使用。初始化要在类外。
class A {
public:
A() {++_scount;}
A(const A& t) {++_scount;}
static int GetACount() { return _scount;}
private:
static int _scount;
};
int A::_count = 0;
void TestA()
{
cout<<A::GetACount()<<endl;
A a1, a2;
A a3(a1);
cout<<A::GetACount()<<endl;
}
c++11中支持非静态成员变量在声明时进行初始化赋值,但要注意这里不是初始化,而是为定义初始时提供一个缺省值。如果构造函数初始化列表中没有初始化,那么就会用这个默认值进行初始化。
class A
{
public:
private:
// 非静态成员变量,可以在成员声明时给缺省值。
int a = 10;
static int n;
};
int A::n = 10;
三、友元
由于c++中的封装特性,一个类的私有属性是其他函数或者类不能直接访问的。如果一定要访
问,可以将这些类或函数定义为友元函数或友元类。
class B
{};
class A
{
friend void f();
friend class B;
private:
int _a;
};
void f()
{
cout<< _a << endl;
}
将B类和f()函数定义为A的友元类后,B和f()就可以访问A的私有属性。但需要注意的是,友元类只是一个单向的关系,A并不能访问B的私有属性。
友元函数f()不能用const修饰。