(copy)赋值构造函数的4种调用时机or方法

第一种调用方法:

demo

#include <iostream>
using namespace std;

class Text
{
public:
	Text() // 无参数构造函数
	{
		m_a = 0;
		m_b = 0;
		cout << "无参数构造函数" << endl;
	}

	Text(int a) // 有参数构造函数
	{
		m_a = a;
		m_b = 0;
		cout << "无参数构造函数" << endl;
	}

	Text(int a, int b) // 有参数构造函数,有三种调用方法
	{
		m_a = a;
		m_b = b;
		cout << "有参数构造函数" << endl;
	}

	// 赋值构造函数,也叫copy构造函数
	Text(const Text& obj)
	{
		cout << "这也是构造函数" << endl;
	}

	~Text();

	void printT()
	{
		cout << "普通成员函数" << endl;
		cout << "m_a" << m_a << " m_a" << m_b << endl;
	}

private:
	int m_a;
	int m_b;
};

// 1 赋值构造函数,用1个对象去初始化另外一个对象
int main()
{
	Text t1(1, 2);
	Text t0(1, 2);

	// 赋值 = 操作,不会调用构造函数
	t0 = t1;
	// 用t1给t0赋值,和初始化是两个不同的概念

	// 第一种调用时机
	Text t2 = t1; // 用t1来初始化t2
	t2.printT;
	return 0;
}

第二种调用方法:

demo

// 第二种调用方法
int main()
{
	Text t1(1, 2);
	Text t0(1, 2);

	Text t2(t1); // 用t1对象初始化t2对象
	t2.printT();

	return 0;
}

第三种调用方法:

demo

<pre name="code" class="cpp">#include <iostream>
using namespace std;

class Location
{
public:
	Location(int xx = 0, int yy = 0)
	{
		X = xx;
		Y = yy;
		cout << "Constructor Object.\n";
	}

	// copy构造函数,完成对象的初始化
	Location(const Location & obj)
	{
		X = obj.X;
		Y = obj.Y;
	}

	~Location()
	{
		cout << X << "," << Y << " Object destroyed." << endl;
	}

	int getX()
	{
		return X;
	}

	int getY()
	{
		return Y;
	}

private:
	int X, Y;
};

// 业务函数,形参是一个元素
void f(Location p)
{
	cout << p.getX() << endl;
}

void playObj()
{
	Location a(1, 2);
	Location b = a;
	cout << "b对象已经初始化完毕" << endl;
	// 可以设置断点看函数的调用跳转
	f(b); // b实参去初始化形参p,会调用copy构造函数
}

int main()
{
	playObj();

	return 0;
}

第四种调用方法:

demo

#include <iostream>
using namespace std;

class Location
{
public:
	Location(int xx = 0, int yy = 0)
	{
		X = xx;
		Y = yy;
		cout << "Constructor Object.\n";
	}

	// copy构造函数,完成对象的初始化
	Location(const Location & obj)
	{
		X = obj.X;
		Y = obj.Y;
	}

	~Location()
	{
		cout << X << "," << Y << " Object destroyed." << endl;
	}

	int getX()
	{
		return X;
	}

	int getY()
	{
		return Y;
	}

private:
	int X, Y;
};

//g函数返回一个元素
//结论1 : 函数的返回值是一个元素 (复杂类型的), 返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数)

//
//结论2: 有关 匿名对象的去和留
//如果用匿名对象,初始化另外一个同类型的对象, 匿名对象,转成有名对象
//如果用匿名对象,赋值给另外一个同类型的对象, 匿名对象,被析构

//
//这么写代码,设计编译器的大牛们:
//就返回一个新对象(没有名字 匿名对象)
Location g()
{
	Location A(1, 2);
	return A;
}

//
void objplay2()
{
	g();
}

//
void objplay3()
{
	//用匿名对象初始化m,此时c++编译器,直接把匿名对转成m;(扶正),从匿名转成有名字了m
	Location m = g();
	printf("匿名对象,被扶正,不会析构掉\n");
	cout << m.GetX() << endl;;
}

void objplay4()
{
	//用匿名对象,赋值给m2后,匿名对象被析构
	Location m2(1, 2);
	m2 = g();
	printf("因为用匿名对象=给m2, 匿名对象,被析构\n");
	cout << m2.getX() << endl;;
}
时间: 2024-10-28 07:55:58

(copy)赋值构造函数的4种调用时机or方法的相关文章

拷贝构造函数和赋值运算符的调用时机

摘自:http://www.2cto.com/kf/201211/166530.html #include <iostream> using namespace std; class Fraction{  private:      int fenmu; //分母      int fenzi; //分子  public:      Fraction(int x,int y){          fenzi = x;          fenmu = y;      }      Fracti

构造函数和析构函数的调用时机

第2章 两种调用JS的方法——在HTML中使用JavaScript

一. <script>标记 第一种方法是把 <sript></script>直接放到head和script两个标记之间(title下面,</head>上面) <head>... <title>demo</title> <script type=”text/java script”> /*type属性常被忽略掉.脚本默认是js,所以<script type=”text/java script”>可直接

asp.net 常用的几种调用存储过程的方法

(1)简单的无参数存储过程 create procedure ExpOneasselect top 10 * from Corpgo C#调用此存储过程        SqlConnection con = new SqlConnection(connstr);        string procedurestr = "存储过程名";        SqlCommand cmd = new SqlCommand(procedurestr, con);        con.Open(

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

C++拷贝构造函数的调用时机

一.拷贝构造函数调用的时机 ? 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填充数据,这个过程会调用构造函数,对象被创建后必须立即初始化.也就是说只要创建对象就会调用构造函数. 2.初始化和赋值的区别 初始化和赋值都是将数据写入内存中,从表面看,初始化在很多时候都是以复制的方式来实现的,很容易引起混淆.在定义的同时进行复制叫做初始化,定义完成以后再赋值(不管定义的时候有没有赋

构造函数的调用时机(一)

构造函数是C++类的重要组成部分,起着初始化对象的作用.当对象生成的时候,编译器会自动调用对象的构造函数,完成对象的初始化工作.根据对象的不同作用域和声明周期,可以将对象分为一下几种: 1.局部对象 2.堆对象 3.全局对象 4.静态对象 下面我们将以反汇编(VC6.0)的形式,查看局部对象的调用时机 #include <stdio.h> class CDemo { public: CDemo() { m_nInt = 100; } private: int m_nInt; }; int ma

构造函数的调用(其中不包括赋值构造函数)

1 #include<iostream> 2 3 using namespace std; 4 //解析和析构函数的调用 5 class Test 6 { 7 public: 8 Test() 9 { 10 cout<<"我是无参的构造函数\n\n"; 11 } 12 Test (int i) 13 { 14 t_a=i; 15 cout<<"i= "<<i<<endl; 16 cout<<&q

[C++]复制构造函数的定义格式和调用时机

1.复制构造函数定义形式 <类名>::<复制构造函数名>(const <类名>&<对象名>) Test(const Test&t) 2.调用时机 (1)用类的已知对象定义该类的一个正在被创建的对象 Test u; Test t = u;//调用复制构造 (2)对象作为实参传递给函数形参 Test u; Test t(u); (3)对象作为函数返回值 Test u; Test fun() { Test t; return t;//调用复制构造