首页 新闻 会员 周边

重载构造函数的调用?

0
悬赏园豆:5 [已解决问题] 解决于 2012-05-26 12:28
#include <iostream>
using std::cout;
using std::endl;

class Counter
{
public:
       Counter();
       Counter(int val);
       ~Counter(){}
       int GetItsVal() const { return itsVal; }
       void SetItsVal(int x) { itsVal = x;}
private:
        int itsVal;
};

Counter::Counter():itsVal(0)
{}

Counter::Counter(int val):itsVal(val)          //是怎样调用这个函数的?不明白????? 
{}

int main()
{
    int theShort = 5;
    Counter theCtr = theShort;                 //经过测试,等价于 Counter theCtr = Counter(theShort);和Counter theCtr(theShort); 请解释一下,谢谢……                                                      
    cout << "theCtr: " << theCtr.GetItsVal() << endl;
    system("pause");
    return 0;
}
c++
waynewuzhenbo的主页 waynewuzhenbo | 初学一级 | 园豆:189
提问于:2012-05-19 10:08
< >
分享
最佳答案
0

在C++中,对无參构造函数的调用:

Counter counter;

等价于

Counter counter();

Counter counter = Counter();

 

对于有参函数调用

Counter counter = 5

等价于

Counter counter(5)

Counter counter = new Counter(5)

Counter counter = (5)

 

Counter counter = 5

这个写法是针对于单参数构造函数。假如多参数则需要把参数按顺序用括号标记。

 

Counter::Counter(int val):itsVal(val)

{

}

这个构造过程应该相当于(倒是没弄过):

Counter::Counter(int val)

{

    itsVal = val;

}

收获园豆:5
无之无 | 大侠五级 |园豆:5095 | 2012-05-19 11:03

刚做了实验:

#include <iostream>
using std::cout;
using std::endl;

class Counter
{
public:
       Counter();
       Counter(int val);
       Counter(int val, int val2);
       ~Counter(){}
       int GetItsVal() const { return itsVal; }
       void SetItsVal(int x) { itsVal = x;}
private:
        int itsVal;
        int itsVal2;
};

Counter::Counter():itsVal(0)
{}

Counter::Counter(int val):itsVal(val)          //是怎样调用这个函数的?不明白????? 
{}

Counter::Counter(int val, int val2):itsVal(val), itsVal(val2)          //是怎样调用这个函数的?不明白????? 
{}

int main()
{
    int theShort = 5;
    Counter theCtr = theShort;                 //经过测试,等价于 Counter theCtr = Counter(theShort);和Counter theCtr(theShort); 请解释一下,谢谢……                                                      
    cout << "theCtr: " << theCtr.GetItsVal() << endl;
    system("pause");
    return 0;
}

Counter::Counter(int val, int val2):itsVal(val), itsVal(val2)

很强大!

无之无 | 园豆:5095 (大侠五级) | 2012-05-19 11:06

@笨笨蜗牛: 

此外,感觉

Counter::Counter(int val):itsVal(val)

{}

虽然等价于:

Counter::Counter(int val)

{

    ::itsVal = val;

}

但要更强大,因为前面的写法是优先调用itsVal(val)的。假如用后面一种写法:

Counter::Counter(int val)

{

int myVal = itsVal;

itsVal = val;

}

Counter::Counter(int val):itsVal(val)

{

int myVal = itsVal;

}

有本质区别,因为这样,确保了在构造函数里,先将参数变量赋值给成员变量,再使用成员变量的这个要求。很多程序员经常犯这样的错误,一不小心就把语句顺序弄反了。

无之无 | 园豆:5095 (大侠五级) | 2012-05-19 11:11

@笨笨蜗牛: 

嗯,你说的要注意。

构造函数设置成员变量分两个阶段,初始化阶段和构造函数体内。在初始化阶段初始化成员变量表达更多清楚,效率更高。

waynewuzhenbo | 园豆:189 (初学一级) | 2012-05-19 16:45

谢谢支持。

waynewuzhenbo | 园豆:189 (初学一级) | 2012-05-26 12:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册