#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++中,对无參构造函数的调用:
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;
}
刚做了实验:
#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)
很强大!
@笨笨蜗牛:
此外,感觉
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;
}
有本质区别,因为这样,确保了在构造函数里,先将参数变量赋值给成员变量,再使用成员变量的这个要求。很多程序员经常犯这样的错误,一不小心就把语句顺序弄反了。
@笨笨蜗牛:
嗯,你说的要注意。
构造函数设置成员变量分两个阶段,初始化阶段和构造函数体内。在初始化阶段初始化成员变量表达更多清楚,效率更高。
谢谢支持。