• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-05-04)  C++ |   2 条评论  11 
    文章评分 0 次,平均分 0.0

    构造函数,大家都很熟悉,但是关于默认构造函数,那就更有趣了,看代码:

    #include <iostream>
    using namespace std;
    class A  
    {  
    public:  
        A(){}    //1
        A(int){}  //2
        ~A(){}
    };  
    
    int main()
    {
    	A a1;
    	A a2(10);
    	A a3();
    	A a4(a2);
    	return 0;
    }

    这段代码是有错误的,具体什么错误,等下再解释。
    a1的定义是正确的,会默认调用1
    a2的定义是正确的,会调用2
    a3的定义是错误的
    a4的定义是正确的,编译器生成拷贝构造函数。

    那么为什么a3是错误呢?本意是想通过默认构造函数来定义对象a3,但是正是这个默认构造函数引发错误。看代码:

    #include <iostream>
    using namespace std;
    class A  
    {  
    public:  
        A(){}  
        A(int){}  
        ~A(){}
    };  
    
    A a3()
    {
    }
    int main()
    {
    	A a1;
    	A a2(10);
    	A a3();
    	A a4(a2);
    	return 0;
    }

    到这里,对于你自己来说,可能这么认为:a3是有歧义的,可以当作函数的声明,又可以当作定义对象。实际上这里只会当作函数声明,而不会当作定义,在这里a3的类型为返回值为Test的函数。

    结论:在使用默认构造函数定义对象时,一定不要使用()来企图调用默认构造函数,而是直接写对象名即可。
    再说直白点:默认构造函数不能手动调用,而是由编译器来自动调用。
    但是在定义指针的时候,这是可以有的。比如Test *a3 = new Test();

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1033.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享