• 拷贝构造函数与拷贝赋值


    通常来说,需要实现析构函数的类都需要实现拷贝构造函数和拷贝赋值。如果没有实现自定义的拷贝构造用函数和拷贝赋值,那么编译器会自动实现它们。在编译器的实现里,如果成员是builtin类型,那么就直接赋值,如果是类类型的,那么就会调用类的相应函数来实现。特别要注意的是,如果是指针,那么只拷贝指针的值,即使是类指针类型也不例外。这就是所谓的浅拷贝。这里有一篇文章Shallow vs. deep copying介绍地更详细。

    拷贝构造函数

    拷贝构造函数的形式

    class Foo{
    Foo(); Foo(
    const Foo&); };

     拷贝构造函数的参数一般是const限定的引用,也可以使用非const限定的引用(后果如何我尚未弄明白)。

    拷贝构造函数使用的场景

    1. 声明的同时用另一个同类型对象定义。如:Foo a=Foo();这里的'='就使用拷贝构造函数。

    2.以非引用的方式传递参数

    3.以非引用的方式返回返回值

    4.以花括号形式初始化对象数组或者给aggregate class的成员初始化。

    禁止拷贝

    如果设置拷贝构造函数为私有函数,那么外部类就无法实现此类对象的复制了。另外可以声明拷贝构造函数,但是不实现。那么试图拷贝该类的对象时,编译器会报错。

    赋值拷贝

    实现赋值拷贝就是实现参数形式为const限定的类引用的‘=’的重载。

    示例

    class Foo{
        Foo & operator=(const Foo &f);
    };

    示例中,返回值是左值的引用,如果设置返回值为void,那么就会阻止串联赋值(a=b=c)。一般应该返回左值的引用。

    小结

    不得不说,C++的语法细节太多,编译器常常在背后自动做了不少事情,很容易让程序员误入陷阱。相比之下,Java在语法这一块就简洁明晰很多了。

  • 相关阅读:
    第五周项目4-静态成员应用
    第五周项目3-用多文件组织多个类的程序
    python的wraps函数
    python函数加括号于不加括号的区别
    socket.error: [Errno 10048]
    tensorflow的MNIST教程
    cidr地址段
    mongodb数据库的存储问题
    搭建巡风扫描器
    mongodb的数据库,集合,数据可介绍。
  • 原文地址:https://www.cnblogs.com/richardustc/p/2970124.html
Copyright © 2020-2023  润新知