第一种调用方法:

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;;
}

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

  1. unity3D笔记の四种调用其他脚本方法

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名() 第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...

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

    一. <script>标记 第一种方法是把 <sript></script>直接放到head和script两个标记之间(title下面,</head>上 ...

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

    (1)简单的无参数存储过程 create procedure ExpOneasselect top 10 * from Corpgo C#调用此存储过程        SqlConnection co ...

  4. c++——对象的构造和析构函数、构造函数的分类及调用

    1构造函数和析构函数的概念 有关构造函数 1构造函数定义及调用 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数: 2)构造函数在定义时可以有参数: 3)没有任何 ...

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

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

  6. 【转】JavaScript中的this关键字使用的四种调用模式

    http://blog.csdn.net/itpinpai/article/details/51004266 this关键字本意:这个.这里的意思.在JavaScript中是指每一个方法或函数都会有一 ...

  7. 关于javascript中this 指向的4种调用模式

    this指向问题绝对可以排js 的top 5最难和最重点的问题,初学者常常搞不清楚this指向哪里,特别是学过java和c#的人,想当年俺也迷糊了好久,直到遇到蝴蝶书,主要是因为js和主流的面向对象语 ...

  8. python中子类调用父类的方法

    1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...

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

    一.拷贝构造函数调用的时机 ​ 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填 ...

随机推荐

  1. Mysql中where条件一个单引号引发的性能损耗

    日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. ...

  2. 重写轮子之 GaussionNB

    我仿照sk-learn 中 GaussionNB 的结构, 重写了该算法的轮子,命名为 MyGaussionNB, 如下: # !/usr/bin/python # -*- coding:utf-8 ...

  3. DEV中svg图标的使用

    0.开始之前 先看看使用效果 在操作栏的使用: 在菜单中的使用 1.简述SVG图标 中文名:可缩放矢量图形 外文名:Scalable Vector Graphics 外语缩写:SVG 开发商:万维网联 ...

  4. Linux 管理软件

    公司的openfire先前运行在windows上的,但由于在windows上openfire内存机制问题,最多只能占用2GB内存,且时间稍微长久一些就会自动挂掉,用户无法登陆和连接,因此迁移到了Cen ...

  5. iOS多线程编程--NSOperation(转)

    这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...

  6. Python中strip()、lstrip()、rstrip()用法详解

    Python中有三个去除头尾字符.空白符的函数,它们依次为: strip: 用来去除头尾字符.空白符(包括\n.\r.\t.' ',即:换行.回车.制表符.空格)lstrip:用来去除开头字符.空白符 ...

  7. DotnetSpider (二) Downloader的设置 Request自定义数据字典

    本篇主要分享自定义Downloader和Request信息,实现自定义请求内容,及将自定义内容存储. ** 温馨提示:如需转载本文,请注明内容出处.**     本文连接:http://www.cnb ...

  8. SSA-一种适合中小型企业的新型服务架构

    写在前面 好久好久没写了,最近刚换了工作,花了几天的时候熟悉了项目,接着就是功能的完善,随后就是对新项目的基础架构搭建. 看过Po主博客的都知道,Po主一直致力于推广.Net Core在微服务架构上的 ...

  9. Node.js 模块

    稳定性: 5 - 锁定 Node 有简单的模块加载系统.在 Node 里,文件和模块是一一对应的.下面例子里,foo.js 加载同一个文件夹里的 circle.js 模块. foo.js 内容: va ...

  10. 用豆瓣镜像解决pip安装慢的问题

    pip3 install django==1.9 -i http://pypi.douban.com/simple/