cpp拷贝构造函数

来源:互联网 发布:提取背景音乐的软件 编辑:程序博客网 时间:2024/04/18 08:07

1.当类含有指针时,必须自定义拷贝构造函数。
坑点:

    class DoubleTest {        double *d;    public:        DoubleTest() :d(new double(123)) {            cout << "constructor" << endl;        }        //DoubleTest(const DoubleTest& D) {        //  d = new double(*D.d);        //}        ~DoubleTest() {            cout << "destruct" << endl;            delete d;            d = 0;        }    };
    DoubleTest d1;    DoubleTest d2(d1);

如果没有拷贝构造函数,d2(d1) 执行位拷贝。d2与d1的指针*d 指向同一个位置。析构函数会对同一个位置delete 两次,那不得鸟 会报错!

2.声明拷贝构造函数后,默认构造函数系统将不自动生成需要人工创建。另外当拷贝构造函数中 额外有默认值的参数,这时仍然作为拷贝构造函数被使用

    class CopyConStr {    public:        CopyConStr() {            cout << "constructor" << endl;        }        CopyConStr(CopyConStr&c, int x = 100) {            cout << "CopyConStrunctor" << endl;        }    };
    CopyConStr c;    CopyConStr c1(c);

3.自动调用成员对象的拷贝构造函数

    class CopyConStr {    public:        CopyConStr() {            cout << "constructor" << endl;        }        CopyConStr(CopyConStr&c, int x = 100) {            cout << "CopyConStrunctor" << endl;        }    };    class TestConstr {        CopyConStr c;    };
    TestConstr tc;    TestConstr tc1(tc);

4.拷贝构造初始化列表并非可选!!!!

    class CopyConStr {        int i;    public:        CopyConStr(int ii):i(ii) {            cout << "constructor :"<<i << endl;        }        CopyConStr(CopyConStr&c, int x = 100) {            this->i = c.i;            cout << "CopyConStrunctor:"<< c.i<< endl;        }    };    class TestConstr {        CopyConStr c;    public:        TestConstr():c(100){        }        TestConstr(TestConstr& tc):c(tc.c){        }       };

TestConstr(TestConstr& tc):c(tc.c) 这里 CopyConStr 没有默认构造函数,之前我一直以为初始化列表是可选的。可以在函数里面用等号赋值。可是在这里,如果不在初始化列表里面赋值 居然编译器会报错。
简直是666。这里的初始化列表保证了进入拷贝构造函数体之前,对类成员对象的初始化。

5.vs大流氓,居然对临时变量为const 。在函数调用临时变量必须为const ref这一条 居然 不遵守编译器也过去的。。。 真是。。。日
这里写图片描述
调用为:

    useReturnVa(getReturnVa());

还好GCC 4.9还是遵循这个规则的。 vs里面应该是做了优化能够保存临时对象的地址与值。

ReturnValue *r = &(useReturnVa(getReturnVa()));

大写的服气……vs有毒………………

原创粉丝点击