免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3489 | 回复: 11
打印 上一主题 下一主题

[低级]C++构造函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-24 20:15 |只看该作者 |倒序浏览
  1. #include <ostream>
  2. #include <iostream>
  3. using namespace std;

  4. class A {
  5.   int a_;

  6.   friend ostream& operator<<(ostream& os, const A& a);

  7. public:
  8.   A() {
  9.     A(1);
  10.   }
  11.   A(int a):a_(a) {
  12.   }
  13. };

  14. ostream& operator<<(ostream& os, const A& a) {
  15.   return os << a.a_;
  16. }

  17. int main(int argc, char *argv[])
  18. {
  19.   A a(1);
  20.   cout << a << "\n";

  21.   A a2;
  22.   cout << a2 << "\n";

  23.   A a3();
  24.   cout << a3 << "\n";

  25.   return 0;
  26. }
复制代码
编译和运行程序的结果如下:


现有问题如下:
1. 构造函数内调用构造函数是什么意思?
2. 为什么a2和a3输出的结果不一样。

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-10-24 20:38 |只看该作者
1. 那是临时匿名对象,
A() {
    A(1);
  }
相当于
A() {
    { A noname(1); }
  }

2. a3是个函数名称
A a3();
相当于
A a3( void );
是个函数声明

论坛徽章:
0
3 [报告]
发表于 2011-10-24 21:03 |只看该作者
回复 2# bruceteen


既然A a3();为函数声明,那么为什么 cout << a3 <<"\n" 输出1呢?

论坛徽章:
0
4 [报告]
发表于 2011-10-24 21:25 |只看该作者
1. 那是临时匿名对象,
A() {
    A(1);
  }
相当于
A() {
    { A noname(1); }
  }

bruceteen 发表于 2011-10-24 20:38


竟然这样也可以,因为C++不允许在一个构造函数中调用另一个构造函数。我还以为会报错……

论坛徽章:
0
5 [报告]
发表于 2011-10-24 21:34 |只看该作者
回复  bruceteen


既然A a3();为函数声明,那么为什么 cout
sudayly 发表于 2011-10-24 21:03



    这个好像因为COUT在输出对象为函数指针的情况下输出值就是为1.

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2011-10-25 09:17 |只看该作者
竟然这样也可以,因为C++不允许在一个构造函数中调用另一个构造函数。我还以为会报错……
liwangli1983 发表于 2011-10-24 21:25


你没看明白吧,A(1)是构造一个临时对象,然后把这个临时对象扔掉。

C++11允许在构造函数中调用构造函数,但是语法不是这样的。

论坛徽章:
0
7 [报告]
发表于 2011-10-25 11:39 |只看该作者
本帖最后由 danssion 于 2011-10-25 11:42 编辑

没其他提示   

论坛徽章:
0
8 [报告]
发表于 2011-10-25 11:43 |只看该作者
你没看明白吧,A(1)是构造一个临时对象,然后把这个临时对象扔掉。

C++11允许在构造函数中调用构造函 ...
koolcoy 发表于 2011-10-25 09:17



    3楼说了后明白了,不过没想到这样也可以……话说0x的委托构造好像g++目前还不支持

论坛徽章:
0
9 [报告]
发表于 2011-10-25 12:14 |只看该作者
本帖最后由 sudayly 于 2011-10-25 12:17 编辑

回复 1# sudayly
  1. #include <ostream>
  2. #include <iostream>
  3. using namespace std;

  4. class A {
  5.   int a_;

  6.   friend ostream& operator<<(ostream& os, const A& a);

  7. public:
  8.   A() {
  9.     A(1);
  10.   }
  11.   A(int a):a_(a) {
  12.   }
  13.   int GetA() {
  14.     return a_;
  15.   }
  16. };

  17. ostream& operator<<(ostream& os, const A& a) {
  18.   return os << a.a_;
  19. }

  20. int main(int argc, char *argv[])
  21. {
  22.   A a(1);
  23.   cout << a << "\n";
  24.   cout << a.GetA() << "\n";

  25.   A a2;
  26.   cout << a2 << "\n";
  27.   cout << a2.GetA() << "\n";

  28.   A a3();
  29.   cout << a3 << "\n";
  30.   //  cout << a3.GetA() << "\n"; // compile error
  31.   return 0;
  32. }
复制代码
按照楼上的提示,重新写了下该代码,得到以下结果
1. A a3();是个函数声明,因为a3.GetA()编译会出错。
2. A() { A(1);  }中创建了个临时对象,在作用域后该对象就释放了,但是在A()中并没有初始化成员变量a_,怎么a_的值为0呢?编译器会自动初始化类的成员变量的值?

论坛徽章:
0
10 [报告]
发表于 2011-10-25 12:22 |只看该作者
加个 这个  你就知道为何是 0 了

int i;
  cout << i << "\n";
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP