免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dream-girl
打印 上一主题 下一主题

[函数] 构造函数? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-12-27 17:54 |只看该作者

构造函数?

原帖由 "playmud" 发表:


晕,你怎么可以这么理解呢???并且表示反对.

那你说应该如何理解才对呢?
ps:playmud兄,不知道为什么,我感觉到自己对C++的理解和你的理解差别很大,我平时很少用C++,有什么不对的地方不请您多指教。

论坛徽章:
0
32 [报告]
发表于 2004-12-27 17:55 |只看该作者

构造函数?

我明白了,think一书说的并没有错,是我自己理解错了,最后的一段话正如kj501说的那样,是在“定义了构造函数而且没有定义缺省构造函数的时候”出错的。

所以尝试一下以下的代码就知道了:

  1. #include <iostream>;

  2. using namespace std;

  3. class test
  4. {
  5. private:
  6.         int i;
  7. public:
  8.         test(int b) { i = b; }
  9. };

  10. int main(void)
  11. {
  12.         test t, a[10];

  13.         return 0;
  14. }

复制代码

显示的错误是:
error: no matching function for call to `test::test()'

论坛徽章:
0
33 [报告]
发表于 2004-12-27 18:03 |只看该作者

构造函数?

至于是否在没有其它的构造函数而且没有缺省的构造函数的时候是否系统会自动产生一个,在primer中我在p572上看到的是:
没有定义缺省构造函数,也没有定义其它构造函数,该定义是合法的,类变量没有被初始化,没有构造函数被调用。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
34 [报告]
发表于 2004-12-27 18:03 |只看该作者

构造函数?

no不是这样的,

  1. class V {
  2.         int i;
  3.         //V(){}
  4. public:
  5.         V(int i)
  6.         {
  7.                 V::i =i;
  8.         }
  9. };

  10. int main() {
  11.         //V v, v2[10];
  12.         V a(5);
  13. } ///:~
复制代码


因为你自己有了expicit的构造函数,所以编译器不会给你合成缺省构造函数,然而只要你不调用缺省构造函数的话,编译器不会抱错。

而converse 得例子里面,他用test t;调用缺省构造函数,可是你没有提供,而且编译器没有生成,所以抱错。
改成test t(1);就没有问题。

论坛徽章:
0
35 [报告]
发表于 2004-12-27 18:08 |只看该作者

构造函数?

原帖由 "gvim" 发表:

而converse 得例子里面,他用test t;调用缺省构造函数,可是你没有提供,而且编?.........


是呀,think一书就是这样写的呀:
If any constructors are defined, however, and there’s no default constructor, the instances of V above will generate compile-time errors.
(粗译如下)如果没有定义构造函数,并且没有缺省的构造函数,那么编译器就会报错。

所以书中说的编译出错指的是这种情况呀。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
36 [报告]
发表于 2004-12-27 18:09 |只看该作者

构造函数?

所以,并不是你定义了其他的构造函数,就一定得要提供缺省构造函数。

下面的代码页可以说明:

  1. class V {
  2.         int i; // private
  3.         V(){}  //注意,调用缺省构造函数非法。
  4. public:
  5.         V(int i)
  6.         {
  7.                 V::i =i;
  8.         }
  9. }; // No constructor
  10. int main() {
  11.         //V v, v2[10]; //这里非法,因为调用缺省构造函数
  12.         V a(5);  //合法,调用V(int)。
  13. } ///:~
复制代码

如果将V(){}  注释掉也可以编译通过,因为这个缺省构造函数对编译器没有任何作用。

论坛徽章:
0
37 [报告]
发表于 2004-12-27 18:12 |只看该作者

构造函数?

gvim说得很清楚了.
但是也不完全正确.

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
38 [报告]
发表于 2004-12-27 18:13 |只看该作者

构造函数?

“如果没有定义构造函数,并且没有缺省的构造函数,那么编译器就会报错”
为什么会?

  1. class V {
  2.         int i; // private
  3.         //V(){} //没有缺省构造函数
  4. public:
  5.         /*V(int i) //没有构造函数
  6.         {
  7.                 V::i =i;
  8.         }*/
  9. }; // No constructor


  10. int main() {
  11.         V v, v2[10];
  12.         //V a(5);
  13. } ///:~
复制代码


编译通过。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
39 [报告]
发表于 2004-12-27 18:16 |只看该作者

构造函数?

原帖由 "playmud" 发表:
gvim说得很清楚了.
但是也不完全正确.

没错,我说的不完全。

论坛徽章:
0
40 [报告]
发表于 2004-12-27 19:37 |只看该作者

构造函数?

如果你自己定义了构造函数,那么编译器将不再给你生成默认的构造函数,一般来讲编译器给你做的构造函数基本上没什么用.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP