拷贝构造函数

设计模式:原型模式(C++)【克隆羊多莉】

别来无恙 提交于 2019-11-27 23:35:43
原型模式介绍 这节我们继续学习设计模式——原型模式。我们先看看原型模式的标准说法, 用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象 。 其实原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节而已 。 我们 先看看C++和其他一些面向对象的编程语言的区别 。 在java、C# 或者一些其他的面向对象编程语言,他们所有的类都是都会继承或者间接继承Object类 。比如说java中Object类 有一个clone方法,实现上就是原型模式的体现,子类需要根据情况进行实现罢了。而 我们的C++呢 没有Object(上帝类),所以呢 我们需要在我们自己的原型类中添加一个clone 克隆方法就行了 。有人或许会说, C++不是有拷贝构造函数么。确实有默认的拷贝构造函数呀,但是 默认的拷贝构造函数只提供基本的值拷贝 ,如果有在堆区开辟空间的成员呢? 所以我们要提供自己的拷贝构造函数进行深拷贝,方便用户,还应该提供一个clone方法(实际就是去调用拷贝构造函数) 。下面看 原型模式克隆羊多莉 案例 。 克隆羊多利代码实现 原型图就是不画了吧,就一个类。。。。 对外提供clone方法,如果类成员有在堆区开辟空间,需要重新拷贝构造函数进行深拷贝!clone方法本质还是调用拷贝构造函数 。注意,我们的 析构函数要释放堆区开辟的内容 哟。 #define _CRT

C++ 初始化列表

做~自己de王妃 提交于 2019-11-27 15:50:04
何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。 struct foo { string name ; int id ; foo(string s, int i):name(s), id(i){} ; // 初始化列表 }; /*--> */ /*--> */ 构造函数的两个执行阶段 构造函数的执行可以分成两个阶段,初始化阶段和计算阶段,初始化阶段先于计算阶段。 初始化阶段 所有类类型(class type)的成员都会在初始化阶段初始化,即使该成员没有出现在构造函数的初始化列表中。 计算阶段 一般用于执行构造函数体内的赋值操作,下面的代码定义两个结构体,其中Test1有构造函数,拷贝构造函数及赋值运算符,为的是方便查看结果。Test2是个测试类,它以Test1的对象为成员,我们看一下Test2的构造函数是怎么样执行的。 struct Test1 { Test1() // 无参构造函数 { cout << "Construct Test1" << endl ; } Test1(const Test1& t1) // 拷贝构造函数 { cout <<

C/C++:拷贝构造函数

☆樱花仙子☆ 提交于 2019-11-26 14:57:25
拷贝构造函数是一种特殊的构造函数,因为它也是用来构造对象的。它具有构造函数的所有特性。 拷贝构造函数的作用是用一个已经存在的对象去初始化另一个对象 ,这两个对象的类类型应该是一样的。定义拷贝构造函数的形式是: class 类名 { public : 类名(形参); //构造函数 类名(类名 &对象名); //拷贝构造函数 ... }; 类名::类(类名 &对象名) //拷贝构造函数的实现 { 函数体 } 拷贝构造函数的形参是本类的对象的引用。 拷贝构造函数在以下三种情况下会被调用: a.当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值 。 int main() { Point A(1,2); Point B(A); //拷贝构造函数被调用 cout<<B.GetX()<<endl; return 0; } b.若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数 。例如: void fun1(Point p) { cout<<p.GetX()<<endl; } int main() { Point A(1,2); fun1(A); //调用拷贝构造函数 return 0; } c.当函数的返回值是类对象时,系统自动调用拷贝构造函数 。例如: Point fun2() { Point A(1,2); return A; /

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

佐手、 提交于 2019-11-26 14:16:30
class string { public: string(const char *str=NULL); string(const string& str); //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*str = "")//默认构造参数//可以不用参数 { m_str = new char[strlen(str) + 1]; strcpy(m_str, str); cout << "create String" << endl; } String1(const String1 &s) { m_str = new char[strlen(s.m_str) + 1]; strcpy(strm_,s.m_str); cout << "copy String" << endl; } String1& operator=(const String1 &s) { delete[] m_str; m_ str = new char[strlen(s.m_str) + 1]; strcpy(m_str, s,m_str);