您的位置:首页 > 编程语言 > C语言/C++

C++ 回忆录5 对象的构造方法

2012-07-27 16:38 316 查看
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};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐