浙大 C++ 课程学习笔记6 - 拷贝函数

44 阅读1分钟

浙大 C++

网易云课堂-C++

拷贝函数


static int countObject = 0;

class A
{
public:
    A():i(100){countObject++;cout << "A() count=" << countObject << endl;};
    ~A(){countObject--;cout << "~A() count=" << countObject << endl;};
private:
    int i;
};

A f(A a){
    cout << "f()" << endl;
    return a;
}

int main()
{
    A a;
    // A b = a;
    A c = f(a);
    cout << "main over" << endl;
}
/**
 * 运行结果:
A() count=1
f()
~A() count=0
main over
~A() count=-1
~A() count=-2
 */

添加拷贝函数

A(const A& a){countObject++;cout << "copy A() count=" << countObject << endl;};
/**
A() count=1
copy A() count=2
f()
copy A() count=3
~A() count=2
main over
~A() count=1
~A() count=0
 */

image.png

拷贝函数2

image.png

image.png

When are copy ctors called?

image.png

image.png

    
    int x(100); // 与 int x = 100; 等价
    cout << x << endl;
    // baby_b = baby_a 其实和 baby_b(baby_a) 也是等价的
    // 都是拷贝构造

image.png


optimize out

image.png

static int countObject = 0;

class A
{
public:
    A():i(100){countObject++;cout << "A() count=" << countObject << endl;};
    //A(const A& a){countObject++;cout << "copy A() count=" << countObject << endl;};
    ~A(){countObject--;cout << "~A() count=" << countObject << endl;};
private:
    int i;
};

A f(){
    A x;
    return x;
}

int main()
{
    A a = f();
    cout << "main over" << endl;
}
/**
A() count=1
main over
~A() count=0
*/

image.png

constructions vs. assignment

image.png

#include <string>

image.png

copy ctor guidelines (拷贝构造的指导方针)

image.png

不建议把拷贝构造写成 private 修饰的

只要定义一个类,不管有用没用,都把这三个方法写下来(构造,拷贝构造,析构);

java 里所有的对象的传递都是通过指针完成的,没有引用和拷贝构造这些事。