BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #25696同步于 2009/7/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[合集] about构造函数

shenlei
2009/7/1镜像同步0 回复
☆─────────────────────────────────────☆ summerday (summer) 于 (Tue Jul 29 17:00:56 2008) 提到: 1. pair的数据成员都是public,但 pair<int, int> p = {1, 2}; 不能通过编译,为什么? 2. f(const vector<int> &); int main() { f(42); //error return 0; } 其中f(42);这句是错误的 是不是因为vector的构造函数为explicit,强制要求显示地使用构造函数。 那么,如下,第二个初始化不能编译,可以从vector的定义得出什么推断? vector<int> v1(42); //ok vector<int> v2 = 42; //error 是和上面一个同一个原因么,还是有别的原因? 因为这个问题出现在C++ primer 复制构造函数 那一节 但我没想出来和复制构造函数有什么直接关系。 3. 类中不能有本类类型的对象成员,只能有指向本类型的指针,或者是引用 也就是说 class A { private: A *x, &y; //ok A a; //error }; A中不能有个A类型的对象。 是不是因为如果可以的话就会有无限循环? 一个对象里又有一个对象,如此下去,永远也没个头…… 复制构造函数的形参限制为,必须是引用类型,下面的定义无法工作: A::A( const A a); //error 这个限制的基本原理是什么呢? 是不是和我刚才提到的对类成员类型的限制有相似之处?没想明白。 好像好多问题哦~ ☆─────────────────────────────────────☆ hman (Wizard) 于 (Tue Jul 29 18:01:48 2008) 提到: 我就知道第三个 当然不能在A里面定义A啦。这样搞下去,没个头了 其他的俺不知道了 ☆─────────────────────────────────────☆ ericyosho (ericyosho) 于 (Tue Jul 29 19:57:43 2008) 提到: 1. pair 不是这样用的, pair<int, int> p(1, 2); 这样就可以了。 2. vector的构造函数 vector<int> v1(42) 意思不是说把42放入vector中,而是在vector里预留内存空间。 3. A都没有定义完全,当然不能作为一个成员,只能是A 的引用或者A的指针。有一个例外,如果是static的话,可以包含A作为成员。 ☆─────────────────────────────────────☆ rebirthatsix (茫犭者-算法盲) 于 (Tue Jul 29 22:04:13 2008) 提到: 最后一个必须为引用的原因是: 如果你直接传递对象本身,那么在函数调用时会默认进行参数复制,这时复制的是这个对象,从而再次调用复制构造函数,那么便一直递归下去吧。。。。 ☆─────────────────────────────────────☆ SuK (木有~) 于 (Wed Jul 30 08:48:17 2008) 提到: 莫于浮沙筑高台。 lz,好好看书吧。 ☆─────────────────────────────────────☆ summerday (summer) 于 (Thu Jul 31 12:27:41 2008) 提到: 1. 因为看到说类类型可以用class关键字定义,也可以用struct定义。 两者除了继承和封装方面,有很多类似的地方。 如果用struct定义类A, struct A { public: int x,y; }; 那么 A a = {1,2}; 这种用法就是对的,所以才想问pair这种类型是否也能有类似的用法。 2. 我知道vector<int> v2(42)是说预留42个int型空间 如果类A如下定义 class A { public: A(const string &);//具体内容省略 private: string s; }; 那么 A a1("abc");//ok A a2 = string("abc");//在A(const string &);不是explicit时也ok 都是可以的。 我不大确定vector<int> v2 = 42;不能用 是不是说明vector的构造函数是explicit的。 3. 第三个问题,明白了,谢谢ls们的耐心解答。 ☆─────────────────────────────────────☆ summerday (summer) 于 (Thu Jul 31 12:28:47 2008) 提到: 谢谢提醒,我知道自己很菜,这些问题我都仔细想过的,冒死虚心请教。 【 在 SuK 的大作中提到: 】 : 莫于浮沙筑高台。 : lz,好好看书吧。 ☆─────────────────────────────────────☆ ericyosho (ericyosho) 于 (Thu Jul 31 13:21:19 2008) 提到: 第二个问题,你很难从一个现象去推导出造成它的原因是什么。 看看你的那个STL实现的源代码,这是唯一真实的方案。 【 在 summerday 的大作中提到: 】 : 1. : 因为看到说类类型可以用class关键字定义,也可以用struct定义。 : 两者除了继承和封装方面,有很多类似的地方。 : ................... ☆─────────────────────────────────────☆ UnitTest (TDD) 于 (Thu Jul 31 13:39:11 2008) 提到: 【 在 ericyosho 的大作中提到: 】 : 第二个问题,你很难从一个现象去推导出造成它的原因是什么。 : 看看你的那个STL实现的源代码,这是唯一真实的方案。 就是声明成explicit了,以避免误导用户 VS下的STL: explicit vector(size_type _Count) : _Mybase() { // construct from _Count * _Ty() _Construct_n(_Count, _Ty()); } ☆─────────────────────────────────────☆ UnitTest (TDD) 于 (Thu Jul 31 14:16:08 2008) 提到: 【 在 summerday 的大作中提到: 】 : 1. : pair的数据成员都是public,但 : pair<int, int> p = {1, 2}; : ................... 至于第一个问题,是因为以前的标准规定这种初始化列表只能用于所谓的聚合体(aggregate),即只能用于数组和旧的结构体,主要是为了和C保持兼容。由于pair里面定义了构造函数,所以它是一个类,而不是像C里面的结构体,所以编译会出错。但是不知道新的标准是否已经对此作了修改 ☆─────────────────────────────────────☆ UnitTest (TDD) 于 (Thu Jul 31 14:22:20 2008) 提到: 【 在 UnitTest 的大作中提到: 】 : 至于第一个问题,是因为以前的标准规定这种初始化列表只能用于所谓的聚合体(aggregate),即只能用于数组和旧的结构体,主要是为了和C保持兼容。由于pair里面定义了构造函数,所以它是一个类,而不是像C里面的结构体,所以编译会出错。但是不知道新的标准是否已经对此作了修改 呃,看看这个 http://blog.csdn.net/oowgsoo/archive/2007/03/22/1537454.aspx ☆─────────────────────────────────────☆ rebirthatsix (茫犭者-算法盲) 于 (Thu Jul 31 14:29:42 2008) 提到: 【 在 summerday 的大作中提到: 】 : 1. : 因为看到说类类型可以用class关键字定义,也可以用struct定义。 : 两者除了继承和封装方面,有很多类似的地方。 : ................... class和struct关键字在你说的这个点没有区别 如果基础太薄,还是多写代码多测试比较好 ☆─────────────────────────────────────☆ rebirthatsix (茫犭者-算法盲) 于 (Thu Jul 31 14:33:28 2008) 提到: 【 在 UnitTest 的大作中提到: 】 : 呃,看看这个 : http://blog.csdn.net/oowgsoo/archive/2007/03/22/1537454.aspx 已经木有区别了,class同可 那个Non-aggregates cannot be initialized应该是因为class默认为private,而struct默认acl为public的原因 ☆─────────────────────────────────────☆ UnitTest (TDD) 于 (Thu Jul 31 14:40:40 2008) 提到: 【 在 rebirthatsix 的大作中提到: 】 : 已经木有区别了,class同可 : 那个Non-aggregates cannot be initialized应该是因为class默认为private,而struct默认acl为public的原因 呃,还是有点小区别的,比如你在里面定义个构造函数或者虚函数,还是编译不过去的 至于让class的成员变成public之后也能编过去,目的只是为了让class和struct保持语义上的一致 ☆─────────────────────────────────────☆ rebirthatsix (茫犭者-算法盲) 于 (Thu Jul 31 15:50:24 2008) 提到: 【 在 UnitTest 的大作中提到: 】 : 呃,还是有点小区别的,比如你在里面定义个构造函数或者虚函数,还是编译不过去的 : 至于让class的成员变成public之后也能编过去,目的只是为了让class和struct保持语义上的一致 额,有了构造函数之后ms都通不过,我再看看
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。