V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smallghost
V2EX  ›  程序员

c++这样的构造函数怎么使用?

  •  
  •   smallghost · 2013-10-25 17:08:13 +08:00 · 3461 次点击
    这是一个创建于 4049 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class A {
    public:
    A(A&);
    };

    A::A(A&) {
    // 这里的A&表示啥?怎么使用呢?
    }
    9 条回复    1970-01-01 08:00:00 +08:00
    timonwong
        1
    timonwong  
       2013-10-25 17:11:57 +08:00
    拷贝构造函数。

    A a1 = A();
    A a2 = a1;
    yujnln
        2
    yujnln  
       2013-10-25 17:15:32 +08:00
    楼上例子错了吧?
    A a2 = A(a1);

    A&代表class A对象的引用
    smallghost
        3
    smallghost  
    OP
       2013-10-25 17:24:06 +08:00
    class A {
    public:
    A(A&);
    int i;
    };

    int main() {
    A a;
    a.i = 100;
    A c(a);
    A b = a;
    // 这里 c.i 和 b.i 是多少呢?
    return 0
    }
    pagict
        4
    pagict  
       2013-10-25 17:25:36 +08:00
    都是100啊
    dorentus
        5
    dorentus  
       2013-10-25 17:27:55 +08:00
    @yujnln 没错的。

    就拿你这个「A a2 = A(a1);」为例,A(a1) 可以理解成把 a1 转型为 A 类型,但是 a1 本身就是 A 的实例,于是直接写 a1 就足够了。

    另外如果没有特殊原因,拷贝构造函数最好写成这样吧:A(const A&); 这样写你就表明了你这个函数里面不会对传入的参数作修改。
    66beta
        6
    66beta  
       2013-10-25 18:20:23 +08:00
    复制/拷贝构造函数

    A&表示一个A类对象的引用
    函数参数分为:传值和传引用(地址)


    上周刚考过C++,我感觉能过 XD
    Golevka
        7
    Golevka  
       2013-10-25 18:45:14 +08:00
    C++ 11又多了一个move constructor (A::A(A &&)), 于是情形变得乱上加乱.

    "Only a computer scientist would create a copy, and then destroy the original" --Bjarne Stroustrup on GoingNative 2013 Keynote
    Ricepig
        8
    Ricepig  
       2013-10-25 20:54:00 +08:00 via iPhone
    @dorentus 这个代码多初始化了一个A对象

    A a;
    A b=a;

    或者

    A b(a)
    jiangtao92
        9
    jiangtao92  
       2013-10-27 18:36:03 +08:00
    如果你要表达的是复制构造函数的话,至少是应该这样 A(const A & copy)

    为什么是 A(const A & copy) 而不是 A(const A copy)

    c++ 的复制构造函数 在实参传到形参(非引用类型)的时候 会被隐式的调用 比如:
    A a1;
    A a2(a1);// 如果你是A(const A copy) 就是无限的递归调用

    A(const A & copy) 因为是引用类型,不会隐式的调用复制构造函数.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3331 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:26 · PVG 20:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.