构造函数
c 在进行实例化的时候通常需要使用构造函数,没有显示构造函数的时候,系统会默认一个所有参数为空的默认构造函数。
C 中的构造函数有很多细节,其中从语法上来说,定义在函数声明的部分,是会优先于构造函数本身执行。 譬如说以下的两种方式,会有不同的效果。
代码语言:javascript复制class A{
int X;int Y;
public:
A( int x, int y ){
std::cout << X << std::endl;
X = x; Y = y;
}
}
class B{
int X;int Y;
public:
B( int x, int y ): X(x),Y(y){
std::cout << X << std::endl;
}
}
A,B都能分别完成对象的构造,区别在于B由于是在声明阶段定义了两个形式参数将要被放置到的对象属性中,所以A的构造函数不能在函数体内的第一行输出我们期望的值。而B中,X属性已经完成了初始化,可以顺利的输出我们的期望值。 另外由于省略了建立、销毁局部参数的过程,这种声明式的构造函数效率更好。
派生类中的构造函数
在派生类中使用构造函数时,需要同时构造基类的构造函数,如果同时继承多个基类,则需要依次构造基类。 在没有进行基类构造的时候,c 会默认使用基类的默认构造函数进行构造,但如果不满足这样的条件,就会报错。
代码语言:javascript复制class A{
int a;
public:
A( int a ):a(a){}
}
class B{
char b;
public:
B( char b ):b(b){}
}
class C : public A, public B{
bool c;
C( int a, char b, bool c ):A(a),B(b),c(c){}
}
这是一个最基本的多继承构造函数的形式。
有些时候我们可能会需要一些变种构造函数,也就是重载。譬如说当我们基于Matrix设计一个九宫格类的时候,实际上matrix的行和列都是固定的3x3.我们并不需要这两个参数来初始化。 这样的话,我们就可以使用单参数的形式重载九宫格类的构造函数:
代码语言:javascript复制template <typename T>
class sMatrix : public Matrix<T>{
private:
int _sign;
public:
sMatrix( int sign ): Matrix<T>(3,3), _sign(sign){ cout<< _sign << endl; }
sMatrix( int x, int y, int s ):Matrix<T>( x, y ){
cout << _sign << endl;
_sign = s;
cout << _sign << endl;
}
};