拷贝构造函数

Java的深拷贝和浅拷贝

余生长醉 提交于 2020-01-26 23:15:24
熟悉C++的朋友对这个话题应该很熟悉,浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象。深拷贝就是两个对象的值相等,但是互相独立。本来想把以前写的一篇文章扩充一下,没想到居然牵扯出很多复杂的问题。本文测试环境是windows xp sp3中文版、NetBeans6.7.1,JDK1.6-update16。这里抛砖引玉,希望大家能提宝贵意见。 首先,Java中常用的拷贝操作有三个,operator = 、拷贝构造函数 和 clone()方法。由于Java不支持运算符重载,我们无法在自己的自定义类型中定义operator=。拷贝构造函数大家应该很熟悉,现在看一下如何支持clone方法: 实现 Cloneable 接口,因为 Object 的 clone 方法将检查类是否实现了 Cloneable 接口,如果没有将抛出异常 CloneNotSupportedException 对象。 Cloneable 接口没有任何方法,只是个标志,所以只需要简单的写上 implements Cloneable 即可。 改写从 Object 继承而来的 clone 方法,使它的访问权限为 public ,因为为了防止意外的支持 clone 操作, Object 的 clone 方法是 protected 权限。 通过上面的分析,可以看出,如果我们要给自己的类添加拷贝功能

C++-Record20—构造函数的调用规则

左心房为你撑大大i 提交于 2020-01-22 05:18:34
目录 基本概念 二个特殊的构造函数 调用规则 涉及代码 写在前面:本篇博客所提到的赋值构造函数等同于拷贝构造函数及复制构造函数 基本概念 二个特殊的构造函数 1)默认无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空 2)默认拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值复制 调用规则 1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数 2)当类中定义了拷贝构造函数时,c++编译器 不会提供 无参数构造函数 3) 当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器 不会提供 默认无参构造函数 4 )默认拷贝构造函数成员变量简单赋值 总结:只要你写了构造函数,那么你必须用。 涉及代码 dm08_构造函数调用规则研究.cpp #include <iostream> using namespace std; class Test { public: // Test(const Test& obj) //copy构造函数 作用: 用一个对象初始化另外一个对象 // { // a = obj.a + 100; // b = obj.b + 100; // } // Test(int _a, int _b) // { /

C++中构造函数,拷贝构造函数和赋值函数的区别和实现

不羁的心 提交于 2020-01-22 00:59:57
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 ·默认构造函数和拷贝构造函数 ·析构函数 ·赋值函数(赋值运算符) ·取值函数 **即使程序没定义任何成员,编译器也会插入以上的函数! 注意:构造函数可以被重载,可以多个,可以带参数; 析构函数只有一个,不能被重载,不带参数 而默认构造函数没有参数,它什么也不做。当没有重载无参构造函数时, A a就是通过默认构造函数来创建一个对象 下面代码为构造函数重载的实现 <span style="font-size:14px;">class A { int m_i; Public: A() { Cout<<”无参构造函数”<<endl; } A(int i):m_i(i) {} //初始化列表 }</span> 2.拷贝构造函数 拷贝构造函数是C++独有的,它是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。 当没有重载拷贝构造函数时,通过默认拷贝构造函数来创建一个对象 A a; A b(a); A b=a;

C++拷贝构造函数(浅拷贝、深拷贝)

一曲冷凌霜 提交于 2020-01-18 23:43:52
下面举一个简单的例子说明对象之间的拷贝(此例中没有自定义拷贝构造函数,在调用拷贝构造函数的时候,编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝) 浅拷贝 : #include<iostream> using namespace std; class CExample { private: int a; public: CExample(int b) { a=b; } void Show() { cout<<a<<endl; } }; int main() { CExample A(100); CExample B=A; B.Show(); return 0; } 输出结果: 100 系统为对象B分配了内存并完成了与对象A的复制过程。形同类型对象是通过拷贝构造函数来完成整个过程的。 自定义构造函数(自定义拷贝构造函数是一种良好的编程风格,他可以组织编译器形成默认的拷贝构造函数,提高源码效率): 示例: #include<iostream> using namespace std; class CExample { private: int a; public: CExample(int b) { a=b; } CExample(const CExample& C) { a=C.a; } void Show() { cout<<a<<endl; } }; int

C++拷贝构造函数详解

此生再无相见时 提交于 2020-01-18 03:40:58
一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100 ; int b = a ; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象拷贝的简单例子。 # include <iostream> using namespace std ; class CExample { private :   int a ; public : //构造函数   CExample ( int b ) { a = b ; } //一般函数   void Show ( )   { cout << a << endl ; } } ; int main ( ) {  CExample A ( 100 ) ;  CExample B = A ; //注意这里的对象初始化要调用拷贝构造函数,而非赋值   B . Show ( ) ;   return 0 ; } 运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象 B 分配了内存并完成了与对象 A 的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。 下面举例说明拷贝构造函数的工作过程。 # include <iostream> using namespace std ; class CExample { private :

C++深拷贝与浅拷贝

早过忘川 提交于 2020-01-14 03:41:31
转自: http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include <iostream> using namespace std; class CExample { private:  int a; public:  CExample(int b)  { a=b; }  void Show ()  { cout<<a<<endl; } }; int main() {  CExample A(100);  CExample B=A;  B.Show ();  return 0; } 运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。 #include <iostream> using namespace std; class CExample { private: int a; public: CExample(int b) { a=b;} CExample

对象的构造

夙愿已清 提交于 2020-01-13 00:27:14
从程序设计的角度,对象只是变量,因此: 在栈上创建对象时,成员变量初始值为随机值 在堆上创建对象时,成员对象初始值为随机值 在静态存储区创建对象时,成员变量初始为0值 一般而言,对象都需要一个确定的初始状态 解决方案:在类中提供一个public的initialize函数,对象创建后立即调用initialize函数进行初始化 class Test { private: int i; int j; public: void initialize(){i = 0;j = 0;} int getI(){return i;} int getJ(){return j;} }; 存在的问题 initialize只是一个普通的函数,必须显示调用 如果未调用initialize函数,运行的结果是不确定的 C++中可以定义与类名相同的特殊成员函数 这种特殊的成员函数叫做 构造函数 构造没有任何返回类型的声明 构造函数在对象定义时自动被调用 1 #include <stdio.h> 2 class Test 3 { 4 private: 5 int i; 6 int j; 7 public: 8 int getI(){ return i; } 9 int getJ(){ return j; } 10 //构造函数 11 Test() 12 { 13 i = 1; 14 j = 2; 15 } 16 };

【C++】寒假学习-类和对象

回眸只為那壹抹淺笑 提交于 2020-01-11 08:54:50
1. C++内存布局分为几个区域,各自具备什么特点? 在C++中,程序在内存中的存储被分为五个区: 1)、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2)、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3)、全局/静态区(static):全局变量和静态变量的存储是 放在一块的,在程序编译时分配 4)、文字常量区:存放常量字符串 5)、程序代码区:存放函数体(类的成员函数、全局函数) 的二进制代码 2. 当定义类时,编译器会为类自动生成哪些函数?这些函数各自都有什么特点? 对于一个空类,C++编译器默认生成四个成员函数:默认构造函数、析构函数、拷贝(复制)构造函数、赋值函数。 1)、默认构造函数(default constructor): 在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化式就会使用默认构造函数。如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数(synthesized default constructor)。C+

C语言:浅拷贝与深拷贝

最后都变了- 提交于 2020-01-10 15:23:27
这里先简单讲一讲c中的浅拷贝与深拷贝,关于更深层使用的拷贝构造函数,深拷贝构造函数,浅拷贝构造函数等,以及其他语言的深拷贝这里就不赘述了。结构体跟类其实很类似,不管是使用或者作用域上。 浅拷贝:表层的引用,实际指向同一块内存 深拷贝:存放在不同的内存空间当中 typedef struct{ char name[20]; int age; }student; student stu1; student stu2; stu1.name="kkk"; stu1.age=20; stu2=stu1; printf("stu1 addr=%p, addr stu1.name=%p\n",&stu1,stu1.name); printf("stu2 addr=%p, addr stu2.name=%p\n",&stu2,stu2.name); 调试可以发现stu1和stu2地址相同,因为二者指向的是同一块内存,如果后面调用 free(stu1); free(stu2); 则会挂掉,因为重复释放了 至于深拷贝,可以给stu2单独分配一块空间,然后再把内容拷贝过去。 参考: https://blog.csdn.net/q2519008/article/details/88310012 https://blog.csdn.net/sinat_35297665/article/details

欢乐C++ —— 5. 类的初始化

坚强是说给别人听的谎言 提交于 2020-01-10 11:16:08
本文测试内容大部分都是参考该博文 https://www.cnblogs.com/cposture/p/4925736.html 该博文作者深入汇编,写的十分详细,感谢作者大大。 之所以挪一次,是想精简一下,并且补充一些东西。 简述 先简单看看直接初始化和拷贝初始化的定义,然后再详细试验一下不同的拷贝初始化场景会调用哪种拷贝函数。实验环境 vs2017 已关闭编译器优化。 直接初始化和拷贝初始化 类的初始化分为直接初始化和拷贝初始化。 直接初始化就是在定义对象时不使用 = 号的初始化方式。调用普通构造函数。 string s1("123"); string s2(s1); 在c++11中,容器调用 emplace 成员函数创建的元素也进行直接初始化。 而拷贝初始化分很多情况,将会在以下情况发生。 在用 = 定义变量时。 函数调用时将 实参对象 传给 非引用的形参对象。 函数返回时返回非引用类型的对象。 用花括号列表初始化一个数组中的元素或聚合类中的成员。 某些类的某些函数也会拷贝初始化,例如容器的 insert 和 push 成员。 需要注意的是 拷贝初始化将跟据不同的情况调用不同的拷贝构造函数。 直接初始化有时会调用拷贝构造函数。例如 String s3(s1); 拷贝初始化过程中类类型的隐式转化不可忽略。许多时候,比较奇怪的语法往往是类类型隐式转化造成。 开始实验