上次我们讲了最重要的默认成员函数,还有几个不是那么重要的,比如const等,就没有细讲,只需要注意具有const的变量不能修改就可以了。
一.初始化列表
我们之前说,c++类中的成员变量,不用构造函数就只是声明,但是我们不能光只声明函数吧。所以我们就引入了初始化列表这个概念。它以冒号开始,以逗号分隔,每个成员变量跟一个放在括号中的初始值或表达式。我们看以下代码:
class A
{
public:
A()
:_a(1),
_b(2)
{
_c = 3;
}
void Print()
{
cout << _a << " " << _b << " " << _c;
}
private:
int _a;
const int _b;
int _c;
};
int main()
{
A().Print();
system("pause");
return 0;
}
以上就是初始化列表的方式,可以看到,const成员变量必须在初始化列表里初始化,所以初始化列表的作用非常之大。
二.单参数构造函数的隐式类型转换
单参数构造函数的隐式类型转换是指当一个类的构造函数只有一个参数时,可以将该参数隐式地转换为该类的对象。这种转换是隐式发生的,因此也被称为隐式类型转换。我们来看下面的代码:
class A
{
public:
A(int a=3)
:_a(a)
{
}
void Print()
{
cout << _a << endl;
}
private:
int _a;
};
int main()
{
A a = 2;
a.Print();
system("pause");
return 0;
}
我们看main函数的第一行,有没有发现我们初始化的方式不一样,这样就是构造函数的隐式类型转化,当然只限于单参数构造函数的类。原理是什么呢,就是用2调用A构造函数会生成一个临时变量,在用这个对象去拷贝给a。编译器会再优化,优化用2直接构造。如果你不想使用隐式类型转换的话,在构造函数前加一个explicit,这样就不能够用隐式类型转换了,如下:
explicit A(int a=3)
三.友元函数
友元函数的最大特点是,友元函数在类中声明后,可以在类外访问私有函数,它具有以下几个特点:
1.友元函数可以访问类的私有成员和保护成员,但不熟类的成员函数。
2.友元函数不能用const修饰。
3.友元函数可以在类定义的任何地方声明,不受访问限定符限制。
4.一个函数可以是多个类的友元函数。
5.友元函数的调用与普通函数调用的相同。
我们来看以下例子:
class A
{
public:
friend int add(A& a);
/*explicit*/ A(int a=3,int b=2)
:_a(a),
_b(b)
{
}
void Print()
{
cout << _a <<" "<<_b << endl;
}
private:
int _a;
int _b;
};
int add(A& a)
{
return a._a + a._b;
}
int main()
{
A a(3,2);
int x = add(a);
a.Print();
cout << x << endl;
system("pause");
return 0;
}
可以看到,我们正常调用友元函数,我们是可以访问到类中的私有成员的。以上便是友元函数的内容。