(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;;
}
(copy)赋值构造函数的4种调用时机or方法的更多相关文章
- unity3D笔记の四种调用其他脚本方法
第一种,被调用脚本函数为static类型,调用时直接用 脚本名.函数名() 第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...
- 第2章 两种调用JS的方法——在HTML中使用JavaScript
一. <script>标记 第一种方法是把 <sript></script>直接放到head和script两个标记之间(title下面,</head>上 ...
- asp.net 常用的几种调用存储过程的方法
(1)简单的无参数存储过程 create procedure ExpOneasselect top 10 * from Corpgo C#调用此存储过程 SqlConnection co ...
- c++——对象的构造和析构函数、构造函数的分类及调用
1构造函数和析构函数的概念 有关构造函数 1构造函数定义及调用 1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数: 2)构造函数在定义时可以有参数: 3)没有任何 ...
- C++C++中构造函数与析构函数的调用顺序
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...
- 【转】JavaScript中的this关键字使用的四种调用模式
http://blog.csdn.net/itpinpai/article/details/51004266 this关键字本意:这个.这里的意思.在JavaScript中是指每一个方法或函数都会有一 ...
- 关于javascript中this 指向的4种调用模式
this指向问题绝对可以排js 的top 5最难和最重点的问题,初学者常常搞不清楚this指向哪里,特别是学过java和c#的人,想当年俺也迷糊了好久,直到遇到蝴蝶书,主要是因为js和主流的面向对象语 ...
- python中子类调用父类的方法
1子类调用父类构造方法 class Animal(object): def __init__(self): print("init Animal class~") def run( ...
- C++拷贝构造函数的调用时机
一.拷贝构造函数调用的时机 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填 ...
随机推荐
- Head First Java设计模式思维导图总结
关于Head First Java设计模式的思维导图总结:
- DataOutputStream&DataInputStream
DataOutputStream&DataInputStream是对输出输入流的扩展,可以直接读写int double等数据类型 下面是今天的练习,细节都写到注释里面了: package Zh ...
- vue2.0+ 从插件开发到npm发布
vue: V2.5.11 此篇尽量详细,清楚的讲解vue插件的开发到npm的发布,想想将你自己做的东西展示给广大"网民",心里还是有点小激动的...-^_^ 先上一下插件效果图-- ...
- python常用执行方式&变量&input函数
linux系统中执行py文件方式: ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...
- python类(class)中参数self的解释说明
python类(class)中参数self的简单解释 1.self只有在类的方法中才会有,其他函数或方法是不必带self的. 2.在调用时不必传入相应的参数.3.在类的方法中(如__init__),第 ...
- python笔记二(数据类型和变量、编码方式、字符串的编码、字符串的格式化)
一.数据类型 python可以直接处理的数据类型有:整数.浮点数.字符串.布尔值.空值. 整数 浮点数 字符串:双引号内嵌套单引号,可以输出 i'm ok. 也可以用\来实现,\n 换行 \t tab ...
- ng-book札记——依赖注入
依赖注入是一种使程序的一部分能够访问另一部分的系统,并且可以通过配置控制其行为. "注入"可以理解为是"new"操作符的一种替代,不再需要使用编程语言所提供的& ...
- 制定一个apk路径 然后跳出安装界面
制定一个apk的路径 然后跳出界面让用户选择是否安装 我们系统有一个写好的Activity来协助我们完成这一功能 我们来看看它的清单文件 <?xml version="1.0" ...
- 【SSH系列】spring中为什么要使用IOC
开篇前言 在前面的博文中,小编主要简单的介绍了spring的入门知识,随着学习的深入,我们知道spring最核心的两大技术,IOC和AOP,这两个技术也是spring最耀眼的地方,在后续的博文中小编将 ...
- Scala:数据类型和变量
http://blog.csdn.net/pipisorry/article/details/52902158 Scala数据类型 Scala 与 Java有着相同的数据类型,下表列出了 Scala ...