由于最近写的代码 发现有点异常,值怎么是错误的呢?明明修改了的。
经过调试,发现原来 是构造函数里面的问题。
搜索:c++ 一个构造函数 调用 另一个 构造函数
发现,原来这就是一个普遍的问题,编译器也木有给警告,其实语法完全合理,如果是java的话,应该没问题。
那么C++ 如何 从一个构造函数调用另一个构造函数呢?
应该使用下面的方法。
new (this)构造函数(不同的参数);
参考自: http://www.cnblogs.com/chio/archive/2007/10/20/931043.html
我发现问题,还 在构造函数里 return 另一个构造函数,是错误的,因为构造函数没有返回值。
但是 你的 实例却可以直接 使用 构造函数复制。哦对,类 默认 有一个 = 的 操作符。
指针 也可以 指针=new 构造函数(); 都是内存的拷贝而已了。
new 操作符 ,与之前搜索到的 new 一定要delete么? 的一些答案类似。此new 是操作符。
标准库中定位new表达式(placement new)的定义
inline void *__cdecl operator new(size_t, void *_P)
{
return (_P);
}
STL中的原型如下:
2: void * operator new (size_t, void *) throw();
3: void * operator new[] (size_t, const std::nothrow_t &) throw();
4: void * operator new[] (size_t, void *) throw();
发现
http://forum.ubuntu.org.cn/viewtopic.php?t=315229
所讨论的 使用this->调用 其他 构造函数 应该也可以的吧。。。
经过实验 发现 貌似也不行: 提示错误 error C2273: “函数样式转换”: 位于“->”运算符右边时非法
如果使用 private 函数 应该可以的哦。。。不尝试了。
下面的讨论中的下段资料也不错:
http://topic.csdn.net/u/20091219/18/4973528c-b6dd-4479-975d-54072cbcef9e.html
下面内容引自
http://zh.wikipedia.org/zh-cn/C%2B%2B0x#.E7.89.A9.E4.BB.B6.E5.BB.BA.E6.A7.8B.E7.9A.84.E6.94.B9.E8.89.AF
对象建构的改良
在标准C++中,建构式不能调用其它的建构式;每个建构式必须自己初始化所有的成员或是调用一个共用的成员函数。基类的建构式不能够直接作为派生类的建构式;就算基类的建构式已经足够,每个衍伸的类仍必须实做自己的建构式。类中non-constant的数据成员不能够在声明的地方被初始化,它们只能在建构式中被初始化。 C++0x将会提供这些问题的解决方案。
C++0x允许建构式调用其他建构式,这种做法称作委托或转接(delegation)。 仅仅只需要加入少量的代码,就能让数个建构式之间达成功能复用(reuse)。 Java以及C#都有提供这种功能。C++0x 语法如下:
class SomeType { int number; string name; SomeType( int i, string& s ) : number(i), name(s){} public: SomeType( ) : SomeType( 0, "invalid" ){} SomeType( int i ) : SomeType( i, "guest" ){} SomeType( string& s ) : SomeType( 1, s ){ PostInit(); } };
C++03中,建构式运行退出代表对象建构完成; 而允许使用转接建构式的 C++0x 则是以"任何"一个建构式退出代表建构完成。 使用转接的建构式,函数本体中的代码将于被转接的建构式完成后继续运行(如上例的 PostInit())。 若基底类使用了转接建构式,则派生类的建构式会在"所有"基底类的建构式都完成后, 才会开始运行。
C++0x 允许派生类手动继承基底类的建构式, 编译器可以使用基底类的建构式完成派生类的建构。 而将基类的建构式带入派生类的动作, 无法选择性地部分带入, 要不就是继承基类全部的建构式,要不就是一个都不继承(不手动带入)。 此外,若牵涉到多重继承,从多个基底类继承而来的建构式不可以有相同的函数签名(signature)。 而派生类的新加入的建构式也不可以和继承而来的基底建构式有相同的函数签名,因为这相当于重复声明。
语法如下:
class BaseClass { public: BaseClass(int iValue); }; class DerivedClass : public BaseClass { public: using BaseClass::BaseClass; };
此语法等同于 DerivedClass 声明一个DerivedClass(int) 的建构式。 同时也因为 DerivedClass 有了一个继承而来的建构式,所以不会有默认建构式。
另一方面,C++0x可以使用以下的语法完成成员初始化:
class SomeClass { public: SomeClass() {} explicit SomeClass(int iNewValue) : iValue(iNewValue) {} private: int iValue = 5; };
若是建构式中没有设置iValue的初始值,则会采用类定义中的成员初始化,令iValue初值为5。在上例中,无参数版本的建构式,iValue便采用默认所定义的值; 而带有一个整数参数的建构式则会以指定的值完成初始化。
成员初始化除了上例中的赋值形式(使用"=")外,也可以采用建构式以及统一形的初始化(uniform initialization,使用"{}")。