1.对象的构造方法跟类同名,而且没返回值.
2.如果没有提供一个默的构造器,编译器会帮我们合成一个默认的. 如果已经有了其他构造器的重载,那么就不再合成. 通常我们都自己写一个构造器,初始化成员变量. 否则,合成的构造器不会帮我们初始化成员build-in or compoud type变量, 此时就处决与这个类是在什么scope定义了.如果是在global 则,build-in or compoud type变量会初始化为0,如果是local scope,则是undefine. 而对于class member,则调用default constructor. so best pratice is to write a default constructor by ourself.
3.构造器有一个初始话列表,虽然不是必需,但在某些环境还是需要的.
class A
{
public:
int m_int1;
int m_int2;
const int m_int3;
string m_str;
A():m_int2(0),m_int1(0),m_int3(111) //怕这个初始化列表,虽然m_int2 放在m_int1前面, 但其实初始化的顺序是按成员变量定义的顺序的.故m_int1 首先初始化.
//这里就显示出这初始化列表是必要的.m_int3; 是const 只能在初始化时赋值.在构造体里面的只是assign 的过程,不是初始化.
{
m_int2=10;//ok.
m_int3=111;// error.
}
A(const string & str="a string") //构造器参数也可以带default value
{
}
boolean istheSameA(A anotherObj);
};
4. A b(); //对于default construct 的使用,我们一般不这样来定义一个A对象, 这是一个方法的声明.
直接 :A b; 就可以了.不用在加括号. 或者 A b=A();//这样也行.
5.对象也可以有隐式的转换.
string aStr="this is a String";
A aObj;
aObj.istheSameA(aStr); //我们的member function 里面是没有带string para 的,而是一个A 对象,此时,implict conversion happen. in this case.
会调用 A(aStr) 生成一个A对象后,传递给istheSameA,
如果我们要prevent this conversion. 我们可以这样声明构造器, 在构造器声明前面加explicit 关键字,注意这个关键字只能用于构造器,成员function not suitable to use.
explicit A(constr string & str="a string")
{
}
此时我们只能这样调用:Obj.istheSameA(A(aStr));//显示的构造.
5.对于简单的类我们还可以这样去实例化.
class B
{
char * ptr;
int i;
};
B aBobj={"haha",125};
B aBobj2={0,0};