不要轻视拷贝构造函数与赋值函数

由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数 有些轻视。请先记住以下的警告,在阅读正文时就会多心:

本章开头讲过,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝” 的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐 含了错误。以类 String 的两个对象 a,b 为例,假设 a.m_data 的内容为“hello”, b.m_data 的内容为“world”。 现将 a 赋给 b,缺省赋值函数的“位拷贝”意味着执行 b.m_data = a.m_data。 这将造成三个错误:一是 b.m_data 原有的内存没被释放,造成内存泄露;二是 b.m_data 和 a.m_data 指向同一块内存,a 或 b 任何一方变动都会影响另一方;三是 在对象被析构时,m_data 被释放了两次。

拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对 象被创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三 个语句和第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋 值函数吗?

 1 #include <iostream>
 2
 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 4 using namespace std;
 5
 6     //定义结构类型
 7 struct student
 8 {
 9     int   num;
10     char  name[20];
11     float grade;
12 };
13 int main(int argc, char** argv)
14 {
15     //声明数组
16     int i,size;
17     char str[]="This is a string.";
18     int int_values[] = {51, 23, 2, 44, 45,0,11};
19     float float_values[] = {15.1, 13.3, 22.2, 10.4, 1.5};
20     student st_arr[]={101,"WangLin",92,102,"LiPing",85,103,"ZhaoMin",88};
21
22     //显示char类型数组元素及其大小
23     size=sizeof(str) / sizeof(char);
24     cout<<"Number of elements in str: ";
25     cout<<size<<endl;
26     for(i=0;i<size;i++) {
27         cout<<str[i];
28     }
29     cout<<endl;
30
31     //显示int类型数组元素及其大小
32     size=sizeof(int_values) / sizeof(int);
33     cout<<"Number of elements in int_values: ";
34     cout<<size<<endl;
35     for(i=0;i<size;i++) {
36         cout<<int_values[i]<<" ";
37     }
38     cout<<endl;
39
40     //显示float类型数组元素及其大小
41     size=sizeof(float_values) / sizeof(float);
42     cout<<"Number of elements in float_values: ";
43     cout<<size<<endl;
44     for(i=0;i<size;i++) {
45         cout<<float_values[i]<<" ";
46     }
47     cout<<endl;
48
49     //显示student类型数组元素及其大小
50     size=sizeof(st_arr) / sizeof(student);
51     cout<<"Number of elements in st_arr: ";
52     cout<<size<<endl;
53     for(i=0;i<size;i++) {
54         cout<<st_arr[i].num<<" ";
55         cout<<st_arr[i].name<<" ";
56         cout<<st_arr[i].grade<<endl;
57     }
58     return 0;
59 }

原文地址:https://www.cnblogs.com/borter/p/9406558.html

时间: 2024-08-03 01:23:42

不要轻视拷贝构造函数与赋值函数的相关文章

C++中拷贝构造函数和赋值函数被调用的时机

一.拷贝构造函数被调用的时机: 1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值. 2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数. 3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数. 二.赋值函数被调用的时机: 当用一个对象赋值给另一个对象时 注意一.二中初始化和赋值的区别 C++中拷贝构造函数和赋值函数被调用的时机,布布扣,bubuko.com

拷贝构造函数和赋值函数

在 C++ 中,赋值和拷贝是不同的, 1)拷贝构造函数是对未初始化的内存进行初始化操作 2)而赋值是对现有的已经初始化的对象进行操作.(这里我对"已经初始化"的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可),赋值函数应该给所有数据成员都初始化. 3)重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 4)可以说,C++中什么时候有临时对象产生,此时刻c++一定要调用拷贝构造函数.(临时对象产生时有一个特例,此时不需要调用拷

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对象相同,而复制操作符需要这个操作,另外赋值运算符中如果原来对象中有内存分配,要先把内存释放掉. 下面是String类的一个实现的部分函数,可以看出二者的区别. 1 class String{ 2 public:

C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转

对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存.构造函数的命名必须和类名完全相同,构造函数可以被重载,可以多个,可以带参数. eg: class A { public: A(){cout<<"无参构造函数";} A(int i){cout<<"带参构造函数";} }; A();//调用默认构造

CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 class Person{ public : Person():age(10), name(NULL); Person(int myage, char *myname); Person(const Person &a); ~Person(void); void set_age(int myage); void get_age(void); void set_other_age(Person &a, int b); private: i

C++ 拷贝构造函数与赋值函数的区别(很严谨和全面)

这里我们用类String 来介绍这两个函数: 拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用拷贝构造函数.为啥形参必须是对该类型的引用呢?试想一下,假如形参是该类的一个实例,由于是传值参数,我们把形参复制到实参会调用拷贝构造函数,如果允许拷贝构造函数传值,就会在拷贝构造函数内调用拷贝构造函数,从而形成无休止的递归调用导致栈溢出. 赋值函数,也是赋值操作符重载,因为赋值必须作为类成员,那

拷贝构造函数与赋值函数的区别

1.从概念上区分:复制构造函数是构造函数,而赋值操作符属于操作符重载范畴,它通常是类的成员函数 2.从原型上来区分:复制构造函数原型ClassType(const ClassType &);无返回值赋值操作符原型ClassType& operator=(const ClassType &);返回值为ClassType的引用,便于连续赋值操作 3.从使用的场合来区分:复制构造函数用于产生对象,它用于以下几个地方:函数参数为类的值类型时.函数返回值为类类型时以及初始化语句,例如(示例了

类string的拷贝构造函数与赋值函数

//参考高质量c++编程 复制构造函数 1 String ::String (const String &other) 2 { 3 4 5 int length=strlen(other.m_date); 6 //other对象的字符长度,其不包括‘\0’ 7 m_data=new char[length+1]; 8 //在堆上开辟一块内存,内存大小包括'\0' 9 strcpy(m_data, other.m_data); 10 11 } 赋值构造函数 1 String &String

复制构造函数 与 赋值函数 的区别(转)

转自:jihite 构造函数.析构函数.赋值函数是每个类最基本的的函数.每个类只有一个析构函数和一个赋值函数.但是有很多构造函数(一个为复制构造函数,其他为普通构造函数.对于一个类A,如果不编写上述四个函数,c++编译器将自动为A产生四个默认的函数,即: A(void)                                    //默认无参数构造函数 A(const A &a)                         //默认复制构造函数 ~A(void);