有关构造函数的简单问题 class a{public: a(); DWORD m_TT; DWORD m_QQ;};a::a():m_TT(0),m_QQ(0){}和a::a(){ m_TT=0; m_QQ=0;}有什么相同,有什么不同? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在你的这个例子当中,两种写法没什么不同。但是如果m_TT和m_QQ是常量或者引用,他们需要设定初始值,这时候就必须采用第一种写法。 9.2构造函数的初始化表 构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表位于函数参数表之后,却在函数体{}之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。 构造函数初始化表的使用规则:u 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。例如 classA {… A(intx); //A的构造函数}; classB:publicA {… B(intx,inty);//B的构造函数 }; B::B(intx,inty) :A(x) //在初始化表里调用A的构造函数 { …} u 类的const常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化(参见5.4节)。u 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。 非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。例如 classA{… A(void); //无参数构造函数 A(constA&other); //拷贝构造函数 A&operate=(constA&other); //赋值函数}; classB { public: B(constA&a); //B的构造函数 private: A m_a; //成员对象}; 示例9-2(a)中,类B的构造函数在其初始化表里调用了类A的拷贝构造函数,从而将成员对象m_a初始化。示例9-2(b)中,类B的构造函数在函数体内用赋值的方式将成员对象m_a初始化。我们看到的只是一条赋值语句,但实际上B的构造函数干了两件事:先暗地里创建m_a对象(调用了A的无参数构造函数),再调用类A的赋值函数,将参数a赋给m_a。 B::B(constA&a) :m_a(a) { …} B::B(constA&a){m_a=a;…} 示例9-2(a)成员对象在初始化表中被初始化 示例9-2(b)成员对象在函数体内被初始化 对于内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别,但后者的程序版式似乎更清晰些。若类F的声明如下:classF{ public: F(intx,inty); //构造函数 private: intm_x,m_y; intm_i,m_j;}示例9-2(c)中F的构造函数采用了第一种初始化方式,示例9-2(d)中F的构造函数采用了第二种初始化方式。 F::F(intx,inty) :m_x(x),m_y(y) { m_i=0; m_j=0;} F::F(intx,inty){ m_x=x; m_y=y; m_i=0; m_j=0;} 示例9-2(c)数据成员在初始化表中被初始化 示例9-2(d)数据成员在函数体内被初始化 请问各位大哥大姐 鼠标拖拽一个文件或什么的到我的listctrl控件上,怎么触发 急!如何将程序运行后的数据保存在HTM文件中? 新手请问:CSocket类怎么把他弄成异步的呀?谢谢 有没有好的办法把十六进制串"4A6F6E6573",换为二进制串"0100101001101111011011100110010101110011" 急急急。。。。。LIST控件的问题————在线等待 急救,救急!!!一个超难的问题,up有分 请各位谈谈vc.net比vc6的不同处? 救命!! 请问高手有关反向代理的问题!!! winsock网络事件如何响应?? 多网卡环境下建立socket的时候网卡的邦定问题
构造函数有个特殊的初始化方式叫“初始化表达式表”(简称初始化表)。初始化表位于函数参数表之后,却在函数体{}之前。这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。 构造函数初始化表的使用规则:u 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。例如 classA {… A(intx); //A的构造函数}; classB:publicA {… B(intx,inty);//B的构造函数 }; B::B(intx,inty) :A(x) //在初始化表里调用A的构造函数 { …} u 类的const常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化(参见5.4节)。u 类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。 非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。例如 classA{… A(void); //无参数构造函数 A(constA&other); //拷贝构造函数 A&operate=(constA&other); //赋值函数}; classB { public: B(constA&a); //B的构造函数 private: A m_a; //成员对象}; 示例9-2(a)中,类B的构造函数在其初始化表里调用了类A的拷贝构造函数,从而将成员对象m_a初始化。示例9-2(b)中,类B的构造函数在函数体内用赋值的方式将成员对象m_a初始化。我们看到的只是一条赋值语句,但实际上B的构造函数干了两件事:先暗地里创建m_a对象(调用了A的无参数构造函数),再调用类A的赋值函数,将参数a赋给m_a。 B::B(constA&a) :m_a(a) { …}
B::B(constA&a){m_a=a;…}
示例9-2(a)成员对象在初始化表中被初始化 示例9-2(b)成员对象在函数体内被初始化 对于内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别,但后者的程序版式似乎更清晰些。若类F的声明如下:classF{ public: F(intx,inty); //构造函数 private: intm_x,m_y; intm_i,m_j;}示例9-2(c)中F的构造函数采用了第一种初始化方式,示例9-2(d)中F的构造函数采用了第二种初始化方式。 F::F(intx,inty) :m_x(x),m_y(y) { m_i=0; m_j=0;}
F::F(intx,inty){ m_x=x; m_y=y; m_i=0; m_j=0;}
示例9-2(c)数据成员在初始化表中被初始化 示例9-2(d)数据成员在函数体内被初始化