免费注册 查看新帖 |

Chinaunix

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

[函数] 编译器是否会提供一个缺省构造函数? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-05-29 16:37 |只看该作者
原帖由 emacsnw 于 2007-5-29 14:31 发表


为什么不会?

那麻烦解释一下为什么会吧?一个简单的空类,没有继承也没有virtual

论坛徽章:
0
12 [报告]
发表于 2007-05-29 16:47 |只看该作者
原帖由 feasword 于 2007-5-29 00:37 发表

那麻烦解释一下为什么会吧?一个简单的空类,没有继承也没有virtual


如果不定义自己的版本,下面四个函数将会被编译器创建:

  1. a constructor: A::A()
  2. a destructor:  A::~A()
  3. a copy constructor: A::A(const A &)
  4. and the operator=(): A &A::operator=(const A &)
复制代码

论坛徽章:
0
13 [报告]
发表于 2007-05-29 17:39 |只看该作者
原帖由 emacsnw 于 2007-5-29 16:47 发表


如果不定义自己的版本,下面四个函数将会被编译器创建:
[code]
a constructor: A::A()
a destructor:  A::~A()
a copy constructor: A::A(const A &
and the operator=(): A &A:perator=(co ...



class a{};

不会有拷贝构造函数和操作符重载的吧?这两个应该不会自动生成的吧?


会以以下两种方式之一copy。
默认copy方式
1,按位(bit)copy。
2,按成员copy。

当有operator=时,在=时调用operator=,
否则按默认copy方式。

当有拷贝构造函数,当对象作为参数传入函数,以及从函数返回时,会调用拷贝构造函数,
否则按默认copy方式。

论坛徽章:
0
14 [报告]
发表于 2007-05-29 17:51 |只看该作者

测试

//主函数,请注意断点位置。
int main(int argc, char* argv[])
{
        A a; //在这一行打断点。
        return 0;
}

//1,主函数能打断点。
class A
{
public:
    A()
    {
    };
};

//2,主函数不能打断点。
class A
{
};

//3,主函数不能打断点。
class A
{
public:
    ~A()
    {
    };
};

//4,主函数能打断点!!!
class A
{
public:
    virtual ~A()
    {
    };
};


为什么能打断点?有函数,构造函数!

[ 本帖最后由 yuanchengjun 于 2007-5-29 17:52 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2007-05-29 19:15 |只看该作者
原帖由 emacsnw 于 2007-5-29 16:47 发表


如果不定义自己的版本,下面四个函数将会被编译器创建:
[code]
a constructor: A::A()
a destructor:  A::~A()
a copy constructor: A::A(const A &
and the operator=(): A &A:perator=(co ...

你这是结论,我发帖子的目的就是想讨论一下两本书里结论的矛盾,麻烦看看前面几本书的相关内容。
而且你这个结论也是不完全的,按照effective c++的说法,还有两个取址运算符

论坛徽章:
0
16 [报告]
发表于 2007-05-29 20:06 |只看该作者
Inside the C++ Object Model 里有详细的讨论。试试编译下面的代码,有注释和去掉注释后,看看生成的汇编代码有什么不同。


  1. class test {
  2. public:
  3. //    test() { }
  4. //    test(test &t) { }
  5.     int i;
  6. };

  7. int main()
  8. {
  9.     test t1, t2;
  10.     t1 = t2;
  11. }
复制代码

论坛徽章:
0
17 [报告]
发表于 2007-05-29 22:36 |只看该作者
《Inside the C++ Object Model》是本一定要读的好书。可惜我已经忘了 9 成了。

论坛徽章:
0
18 [报告]
发表于 2007-05-30 22:15 |只看该作者
要注意区分两种讨论的前提:是语言语义还是语言的实现。

论坛徽章:
0
19 [报告]
发表于 2007-06-03 09:54 |只看该作者
《Inside the C++ Object Model》要经常翻翻,温故而知新.编译器产生出来的要看是在编译期间还是在运行期间.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP