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)
	{
		num=obj.num;
	}
	Base& operator=(const Base& obj);
public:
	int num;
};
Base& Base::operator=(const Base& obj)
{
	if(this!=&obj)
	{
		num=obj.num;
	}
	return *this;
}

class Derived:public Base
{
public:
	Derived(int i,int j):Base(i),num1(j)
	{}
	Derived(const Derived& obj):Base(obj)			//合法
	{
		//Base(obj);					//非法
		cout<<"Copy constructor"<<endl;
		num1=obj.num1;
	}
	Derived& operator=(const Derived& obj)
	{
		cout<<"Assign constructor"<<endl;
		if(this!=&obj)
		{
			Base::operator=(obj);
			num1=200;//obj.num1;
			return *this;
		}
	}
public:
	int num1;
};

int main()
{
	Derived obj(10,20);
	{
		Derived obj1(0,0);
		obj1=obj;
		cout<<obj1.num<<endl;
		cout<<obj1.num1<<endl;
	}
	{
		Derived obj1=obj;
		cout<<obj1.num<<endl;
		cout<<obj1.num1<<endl;
	}

	system("pause");
	return 0;
}


1、无论是在派生类的赋值函数还是拷贝构造函数中,都要显式调用基类的相应函数

2、派生类拷贝构造函数调用基类的拷贝构造函数时,只能在初始化列表中调用

3、下面的代码是赋值,调用赋值函数

obj1=obj;

下面的代码是初始化,调用的是拷贝构造函数。

Derived obj1=obj;

所谓初始化,即声明(分配存储空间),使用有操作数进行初始化。

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

时间: 2024-08-09 13:00:40

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

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

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

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) {