说说你对构造函数的理解?
构造函数:对象创建时,利用特定的值构造对象(不是构造类),将对象初始化(保证数据成员有初始值),是类的一个public 函数
① 与类同名
② 无返回值
③ 声明为public
④ 一个类中可以有多个构造函数(实际就是重载)
1.默认构造函数无参数; 带参数的构造函数,冒号后边是初始化列表
B(int i) : data(i);
2.组合类构造函数
类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)……{}
Line(Point p1, Point p2);//类中声明 Line(Point p1, Point p2) : p1(xp1),p2(xp2){...} //声明并初始化
初始化顺序:①调用内嵌对象的构造函数(如上边Point类的构造函数)
②内嵌对象按照 组合类的声明顺序初始化(先p1,再p2)
③执行组合类自己的构造函数体
3.常量必须在构造函数的初始化列表里初始化或将其设置为static
class A{ const int size=0; //错误 A(){ const int size=0;//正确,常量在构造函数里初始化 } static const int size=0;//正确,常量设置为static };
【注意】 Test a(); 和Test a;的区别 //前提声明了Test类
前者声明一个返回值为Test,名为a的函数,后者声明了Test类的一个对象(把Test当成int)
struct Test{ Test(int){} //构造函数 Test(){} void fun(){} }; void main(){ Test a(1); a.fun(); Test b(); b.fun(); //b声明为一个函数,而不是一个对象,这里编译出粗 }
********题**目*******分割线*********************************************************************
1.请问下面程序打印结果是?(程序员面试宝典10.3节)
class base{ private: int mi, mj; public: base(int i) : mj(i),mi(mj){}//构造函数1,按照mi,mj声明顺序,先初始mi(mj),结果mi是随机数,再初始化mj base() : mj(0), mi(mj){} int get_i(){return mi;} int get_j(){return mj;} }; void main(){ base obj(98); //调用构造函数1 cout<<obj.get_i() <<"\n"<<obj.get_j()<< endl; }
输出结果第一个为随机数,第二个是98.如果想得到98,98,修改私有变量声明顺序为mj, mi