除了类中的六个默认成员函数以外还有许多比较杂的知识,不方便以后的复习,所以笔者在这里记录下来方便复习。
const成员
在类中的成员函数中,可以遵循一个原则,
初始化列表
在了解了默认成员函数中的构造函数以后,那你来看看这个要怎么去初始化,
class B
{
public:
B(int b)
:_b(b)
{}
private:
int _b;
};
class A
{
private:
B _c;
int& _a;
const int _b;
};
这样子就不能用简单的构造函数去初始化了,会报错,因为其实构造函数并不是真正的初始化函数,他只是成员变量去赋初值,当遇到这个时就可以含明显的感觉到赋初值和初始化的区别了,
这里需要用到初始化列表具体格式为
class B
{
public:
B(int b)
:_b(b)
{}
private:
int _b;
};
class A
{
public:
A(int a, int b)
:_c(a)
,_a(a)
,_c(b)
{}
private:
B _c;
int& _a;
const int _b;
};
//这些必须用初始化列表去初始化
//成员变量初始化的顺序是声明的顺序,哪个先声明,哪个先初始化
//没有默认构造函数的类
//引用的成员
//const修饰的成员
explicit关键字
可以限制隐式类型转化
class Date
{
public:
//explicit Date(int year)
Date(int year)
:_year(year)
{
cout << "Date(int year)" << endl;
}
//{
// _year = year;
// _month = month;
// _day = day;
//}
Date(const Date& d1)
{
cout << "Date(const Date& d1)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(1);
Date d2 = 2;//这里是一个隐式类型转化,首先先构造一个date tmp(2),在拷贝构造tmp(2)d2就是这么来的,但是有时候会优化成d2(2)
return 0;
}
static成员
static所修饰的成员变量将会变成静态成员变量,static所修饰的成员函数将会变成静态成员函数,static修饰的类成员将会变成静态成员。静态成员变量一定要在类外进行初始化。
一个面试题就是:实现一个类,计算程序中创造了多少个类对象
class A
{
public:
static int n;
A(int a)
{
n++;
}
A(A& a)
{
n++;
}
};
int A::n = 0;
int main()
{
A a1(1);
A a2(2);
cout << A::n << endl;
return 0;
}