大连华南网站建设,微信网站公众平台,湖北做网站的公司,自己怎么创网站C类用三个特殊的成员函数#xff1a;复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程
复制构造函数首先是一个构造函数#xff0c;它同所有其他的构造函数一样与类同名#xff0…C类用三个特殊的成员函数复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程
复制构造函数首先是一个构造函数它同所有其他的构造函数一样与类同名没有返回值。它有一个唯一的参数错误是该类类型的引用一般将它声明为const源于用于赋值的对象一般不用改变它本身的值。于是复制构造函数的原型为
class BOOK
{public:BOOK(const BOOK rhs); //构造函数一BOOK(string name,float price 0):_bookName(name),_price(price){}; //构造函数二BOOK():_price(0),_bookName(){}; //构造函数三private:float _price ;string _bookName;//....
};什么时候被调用 复制构造函数在需要复制类对象的时候被调用这些调用情况可以总结为 根据一个同类型的对象显示或隐式地初始化一个对象。 1.当定义一个新对象并用一个同类型的对象对它进行初始化的时候将显式使用复制构造函数如 BOOK book1;
BOOK book2(book1);当将该类型的对象传递给函数或从函数返回该类型的对象时将隐式地调用复制构造函数。 1.作为值传递的实参传递给一个函数。 2.函数返回时复制一个对象。 3.初始化顺序容器中的元素。 如
vectorstring svec(5);编译器首先调用string类默认构造函数创建一个临时值再用复制构造函数将临时值复制到每一个元素。 1.根据元素初始化列表初始化数组元素。 如
BOOK books[]{string(book1),string(book2),string(book3),BOOK()
;book数组的前三个元素将调用构造函数二进行隐式类型转换C隐式类型转换然后调用复制构造函数进行数组元素的复制。如果类禁止隐式类型转换构造函数使用了explicit声明或希望不指定实参或多个实参需要使用完整的构造函数语法如数组最后一个元素的初始化。
如果没有为类声明复制构造函数会怎样
如果你没有声明一个复制构造函数那么编译器会给声明一个。实际上如果你自己没有声明编译器会为类声明一个复制构造函数 一个赋值操作符以及一个析构函数此外如果你没有声明任何构造函数的话编译器也会为你声明一个合成默认构造函数。错误所有这些编译器自动生成的类成员函数皆为pubilc 且 inline。编译器创建的复制构造函数单纯地将来源对象的每一个非static成员拷贝到目标对象这在很多时候是不能满足类需求的特别是类中含有指针时这时候就需要我们自己来写复制控制的三个特殊成员函数了。
编译器合成的复制构造函数做了什么
合成复制构造函数的行为是对每一个非static成员进行逐个成员初始化。成员类型不同初始化方式不一样 内置类型如int直接复制值。
类类型调用该类的复制构造函数进行复制。
数组这个比较特殊因为我们知道一般不能复制数组但在类中复制数组时合成复制构造函数将复制数组的每一个值。
另外合成复制构造函数对类数据成员的初始化都是放在构造函数初始化列表中进行的。
禁止复制
如果我们想禁止某个类的复制行为我们当然不会想去定义一个复制构造函数然而编译器却会自动为我们定义一个那么到底该如何阻止一个类的复制行为呢
我们可以将复制构造函数定义为private不允许用户代码复制该类类型的对象若进行复制将在编译时发生错误。然而类的友元和成员仍可以进行复制解决办法是我们可以声明一个private复制构造函数却不进行定义类成员或友元进行复制尝试时将在程序运行时发生错误。 推荐一个零声学院项目课个人觉得老师讲得不错分享给大家 零声白金学习卡含基础架构/高性能存储/golang云原生/音视频/Linux内核 https://xxetb.xet.tech/s/3Zqhgt