昆山做网站多少钱网站开发vs2013
昆山做网站多少钱,网站开发vs2013,网站建设类型有哪些,前端静态网站开发拷贝构造函数是一种特殊的构造函数#xff0c;它在创建对象时#xff0c;是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于#xff1a;通过使用另一个同类型的对象来初始化新创建的对象。复制对象把它作为参数传递给函数。复制对象#xff0c;并从… 拷贝构造函数是一种特殊的构造函数它在创建对象时是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于通过使用另一个同类型的对象来初始化新创建的对象。复制对象把它作为参数传递给函数。复制对象并从函数返回这个对象。在默认情况下(用户没有定义但是也没有显式的删除)编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符这样的对象就不能通过值传递也不能进行赋值运算。class Person{public: Person(const Person p) delete; Person operator(const Person p) delete;private: int age; string name;};上面的定义的类Person显式的删除了拷贝构造函数和赋值运算符在需要调用拷贝构造函数或者赋值运算符的地方会提示_无法调用该函数它是已删除的函数_。还有一点需要注意的是拷贝构造函数必须以引用的方式传递参数。这是因为在值传递的方式传递给一个函数的时候会调用拷贝构造函数生成函数的实参。如果拷贝构造函数的参数仍然是以值的方式就会无限循环的调用下去直到函数的栈溢出。何时调用拷贝构造函数和赋值运算符的行为比较相似都是将一个对象的值复制给另一个对象但是其结果却有些不同拷贝构造函数使用传入对象的值生成一个新的对象的实例而赋值运算符是将对象的值复制给一个已经存在的实例。这种区别从两者的名字也可以很轻易的分辨出来拷贝构造函数也是一种构造函数那么它的功能就是创建一个新的对象实例赋值运算符是执行某种运算将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符主要是看是否有新的对象实例产生。如果产生了新的对象实例那调用的就是拷贝构造函数如果没有那就是对已有的对象赋值调用的是赋值运算符。调用拷贝构造函数主要有以下场景对象作为函数的参数以值传递的方式传给函数。 对象作为函数的返回值以值的方式从函数返回使用一个对象给另一个对象初始化代码如下class Person{public: Person(){} Person(const Person p) { cout Copy Constructor endl; } Person operator(const Person p) { cout Assign endl; return *this; }private: int age; string name;};void f(Person p){ return;}Person f1(){ Person p; return p;}int main(){ Person p; Person p1 p; // 1 Person p2; p2 p; // 2 f(p2); // 3 p2 f1(); // 4 Person p3 f1(); // 5 getchar(); return 0;}上面代码中定义了一个类Person显式的定义了拷贝构造函数和赋值运算符。然后定义了两个函数:f以值的方式参传入Person对象f1以值的方式返回Person对象。在main中模拟了5中场景测试调用的是拷贝构造函数还是赋值运算符。执行结果如下分析如下这是虽然使用了但是实际上使用对象p来创建一个新的对象p1。也就是产生了新的对象所以调用的是拷贝构造函数。首先声明一个对象p2然后使用赋值运算符将p的值复制给p2显然是调用赋值运算符为一个已经存在的对象赋值 。以值传递的方式将对象p2传入函数f内调用拷贝构造函数构建一个函数f可用的实参。这条语句拷贝构造函数和赋值运算符都调用了。函数f1以值的方式返回一个Person对象在返回时会调用拷贝构造函数创建一个临时对象tmp作为返回值返回后调用赋值运算符将临时对象tmp赋值给p2.按照4的解释应该是首先调用拷贝构造函数创建临时对象然后再调用拷贝构造函数使用刚才创建的临时对象创建新的对象p3也就是会调用两次拷贝构造函数。不过编译器也没有那么傻应该是直接调用拷贝构造函数使用返回值创建了对象p3。深拷贝、浅拷贝说到拷贝构造函数就不得不提深拷贝和浅拷贝。通常默认生成的拷贝构造函数和赋值运算符只是简单的进行值的复制。例如上面的Person类字段只有int和string两种类型这在拷贝或者赋值时进行值复制创建的出来的对象和源对象也是没有任何关联对源对象的任何操作都不会影响到拷贝出来的对象。反之假如Person有一个对象为int *这时在拷贝时还只是进行值复制那么创建出来的Person对象的int *的值就和源对象的int *指向的是同一个位置。任何一个对象对该值的修改都会影响到另一个对象这种情况就是浅拷贝。深拷贝和浅拷贝主要是针对类中的指针和动态分配的空间来说的因为对于指针只是简单的值复制并不能分割开两个对象的关联任何一个对象对该指针的操作都会影响到另一个对象。这时候就需要提供自定义的深拷贝的拷贝构造函数消除这种影响。通常的原则是含有指针类型的成员或者有动态分配内存的成员都应该提供自定义的拷贝构造函数在提供拷贝构造函数的同时还应该考虑实现自定义的赋值运算符对于拷贝构造函数的实现要确保以下几点对于值类型的成员进行值复制对于指针和动态分配的空间在拷贝中应重新分配分配空间对于基类要调用基类合适的拷贝方法完成基类的拷贝
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90412.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!