C++中赋值函数和拷贝构造函数(举例说明)

拷贝构造函数发生在对象还没有创建,需要创建时

如:   MyClass obj1(1);

MyClassobj3 = obj1;

赋值操作符重载仅发生在对象已经执行过构造函数,即已经创建的情况下

如:

MyClass obj1(1);

MyClass obj3;

obj3 = obj1;

具体代码如下:

class MyClass

{

public:

MyClass( int i = 0)

{

cout << i;

}

MyClass( const MyClass &x)

{

cout << 2;

}

MyClass &operator=(const MyClass & x)

{

cout << 3;

return *this ;

}

~MyClass()

{

cout << 4;

}

};

int main()

{

MyClass obj1(1);

MyClass  obj2(2);

MyClass obj3;

obj3 = obj1;

return 0;

}

输出:1203444

先创建对象obj1,调用构造函数并初始化为1,输出1

再创建对象obj2,调用构造函数并初始化为2,输出2

创建对象obj3,调用构造函数,使用默认值为0,输出0

obj1赋值给obj3时,调用赋值函数,输出3

再依次析构,析构的顺序和调用构造的顺序相反

先析构obj3,在析构obj2,最后析构obj1

class MyClass

{

public:

MyClass( int i = 0)

{

cout << i;

}

MyClass( const MyClass &x)

{

cout << 2;

}

MyClass &operator=(const MyClass & x)

{

cout << 3;

return *this ;

}

~MyClass()

{

cout << 4;

}

};

int main()

{

MyClass obj1(1);

MyClass   obj2(2);

MyClass obj3 = obj1;

return 0;

}

输出:122444

依次创建对象obj1,obj2,调用两次构造,分别输出初始化的值1,2

MyClass obj3 = obj1;由于赋值的时候obj3还没有创建,所以会调用拷贝构造函数,输出2

再依次析构三个对象

时间: 2024-08-10 23:27:38

C++中赋值函数和拷贝构造函数(举例说明)的相关文章

C++赋值函数与拷贝构造函数应注意的问题

<pre name="code" class="cpp"><pre name="code" class="cpp">#include "stdafx.h" #include <iostream> using namespace std; class Base { public: Base(int i):num(i) {} Base(const Base& obj)

赋值函数与拷贝构造的差异

C++ 拷贝构造函数 赋值构造函数 ================================= 一句话,赋值函数的前提是对象已定义:而拷贝构造是执行时才会创建一个对象.拷贝构造需要的是深拷贝. 赋值函数一般模式: type& operator =(const type& par) { // (1) 检查自赋值 if( this == &par ) return *this; // (2) 释放原有的内存资源 //(3)分配新的内存资源,并复制内容 ,2.3顺序没讲究,注意释

C++语言笔记系列之十一——友元函数与拷贝构造函数

1.友元函数 (1)友元函数是定义在一个类外的普通函数. 友元函数和普通函数的定义一样:在类内必须将该普通函数声明为友元. (2)友元函数不是成员函数. 不能通过对象来调用,而是直接调用:友元函数可以访问类的公有.受保护以及私有成员,但是必须通过对象.对象指针或者对象引用来访问. 2.友元函数的声明 friend 返回值类型 函数名(参数表): 在类中只需要将这个声明放置在公有部分即可. class Point http://www.zjshenghuo.com/article-82622-1.

拷贝构造函数和赋值函数

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

拷贝构造函数(三)——重载赋值运算符

拷贝构造函数(一)--哲学三连:http://www.cnblogs.com/tenjl-exv/p/8017814.html 拷贝构造函数(二)--深拷贝与浅拷贝:http://www.cnblogs.com/tenjl-exv/p/8017909.html 拷贝构造函数(三)--重载赋值运算符:http://www.cnblogs.com/tenjl-exv/p/8017983.html 关于拷贝函数中的赋值操作符重载  以下讨论中将用到的例子: 1 class CExample 2 { 3

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修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用拷贝构造函数.为啥形参必须是对该类型的引用呢?试想一下,假如形参是该类的一个实例,由于是传值参数,我们把形参复制到实参会调用拷贝构造函数,如果允许拷贝构造函数传值,就会在拷贝构造函数内调用拷贝构造函数,从而形成无休止的递归调用导致栈溢出. 赋值函数,也是赋值操作符重载,因为赋值必须作为类成员,那

拷贝构造函数 和 赋值操作符重载

什么时候需要定义自己的拷贝构造函数: 当类中包含有,动态分配成员 或者 指针 的时候. 如果使用默认构造函数,则新构造出来的 新类 和 旧类 里面的指针成员 指向同一个空间, 而当其中一个类 清空掉那个空间 .另一个类的指针就会变成野指针(因为空间已经被清空) , 也就是说默认构造函数是复制值(地址也是值) ps.基本数据类型的数组可以直接使用默认复制构造函数.也就是说有涉及到 自行开辟额外空间 的数据类型 和 指针 的类就需要 什么时候调用拷贝构造函数: 1.一个对象以 值传递 的方式 传入

拷贝构造函数与赋值运算符重载函数要点

拷贝构造函数 一个小例子 最近在<剑指Offer>上看到了一道题(程序如下),要求我们分析编译运行的结果,并提供3个选项: A. 编译错误: B. 编译成功,运行时程序崩溃:C. 编译运行正常,输出10. 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 private: 7 int value; 8 9 public: 10 A(int n) { value = n; } 11 A(A other) {