由于最近写的代码 发现有点异常,值怎么是错误的呢?明明修改了的。
经过调试,发现原来 是构造函数里面的问题。 搜索: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中的原型如下:
1: void * operator new (size_t, const std::nothrow_t &)
throw();
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./viewtopic.php?t=315229 所讨论的 使用this->调用 其他 构造函数 应该也可以的吧。。。 经过实验 发现 貌似也不行: 提示错误 error C2273: “函数样式转换”: 位于“->”运算符右边时非法 如果使用 private 函数 应该可以的哦。。。不尝试了。
下面的讨论中的下段资料也不错: http://topic.csdn.net/u/20091219/18/4973528c-b6dd-4479-975d-54072cbcef9e.html 下面内容引自 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())。 若基底类使用了转接建构式,则派生类的建构式会在"所有"基底类的建构式都完成后, 才会开始运行。 class BaseClass { public: BaseClass(int iValue); }; class DerivedClass : public BaseClass { public: using BaseClass::BaseClass; }; 此语法等同于 DerivedClass 声明一个DerivedClass(int) 的建构式。 同时也因为 DerivedClass 有了一个继承而来的建构式,所以不会有默认建构式。 class SomeClass { public: SomeClass() {} explicit SomeClass(int iNewValue) : iValue(iNewValue) {} private: int iValue = 5; }; 若是建构式中没有设置iValue的初始值,则会采用类定义中的成员初始化,令iValue初值为5。在上例中,无参数版本的建构式,iValue便采用默认所定义的值; 而带有一个整数参数的建构式则会以指定的值完成初始化。 |
|