拷贝构造

来源:互联网 发布:摩天轮票务 知乎 编辑:程序博客网 时间:2024/05/21 06:39

前文中提及到了拷贝构造,本文将进行详细探讨。
拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。

Test6_1 (int a){    m_a = a;    printf ("普通构造函数\n");}// 拷贝构造Test6_1(const Test6_1 &obj){    // m_a = obj.m_a;    m_a = -100;    printf ("拷贝构造被调用\n");}~Test6_1(){    printf ("***********析构函数被调用: m_a = %d\n", m_a);}void print(){    printf ("a = %d\n", m_a);}

拷贝构造函数的调用时机:
在以下几种几种情况会调用拷贝构造函数
1)拿 t1 取初始化 t2

Test6_1 t1(10);Test6_1 t2(t1); 

2)等于号

Test6_1 t1(10);Test6_1 t3 = t1;

3)当对象作为函数参数传递的时候会调用拷贝构造

void test(Test6_1 t){    t.print();}test(t1);

4)函数返回值返回对象
写一个返回值为对象的函数:

Test6_1 test6_1(){    Test6_1 t(10);    return t;}
// 一个函数返回一个对象的时候会创建一个匿名对象,拿返回的那个对象对匿名对象进行初始化,会调用拷贝构造// 如果没有去接收函数的返回值的话,匿名对象会立马被销毁test6_1();
// 如果用一个对象去接收函数的返回值,先用函数返回的对象去初始化匿名对象,调用一次拷贝构造,然后拿新的对象的名字去命名这个匿名对象,匿名对象从无名转成有名Test6_1 t1 = test6_1();
Test6_1 t2(10);// 用函数返回的对象对匿名对象进行初始化,调用拷贝构造// 用匿名对象对  t2  进行赋值,调用 赋值运算符  = t2 = test6_1();
原创粉丝点击