(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. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填 ...
随机推荐
- SQL之排序
1.按多个列排序 经常需要按不止一个列进行数据排序.例如,如果要显示雇员名单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序).如果多个雇员有相同的姓,这样做很有用. 要按多个列排序,简 ...
- 数据结构之Trie树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- hasattr(),getattr(),setattr()的使用
# 首先你有一个command.py文件,内容如下,这里我们假若它后面还有100个方法 class MyObject(object): def __init__(self): self.x = def ...
- 一个蒟蒻对FFT的理解(蒟蒻也能看懂的FFT)
建议同学们先自学一下"复数(虚数)"的性质.运算等知识,不然看这篇文章有很大概率看不懂. 前言 作为一个典型的蒟蒻,别人的博客都看不懂,只好自己写一篇了. 膜拜机房大佬 HY 一. ...
- E1
en表"使怎么样" engage 吸引,从事,订婚 be engaged in doing sth. 忙于 endure 忍耐,忍受 enforce 强制执行 enrol ...
- PHP While 循环
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- Docker容器的运用
Docker 利用容器来运行应用. 容器是从镜像创建的运行实例.它可以被启动.开始.停止.删除.每个容器都是相互隔离的.保证安全的平台. 可以把容器看做是一个简易版的 Linux 环境(包括root用 ...
- docker环境 快速使用elasticsearch-head插件
docker环境 快速使用elasticsearch-head插件 #elasticsearch配置 #进入elk容器 docker exec -it elk /bin/bash #head插件访问配 ...
- Dapper连接与事务的简单封装
增删改查方面,已经有Dapper.Extension这么强大的工具了,我也实在没啥好写的,就随手写了个看起来比较优雅的连接与事务的封装.在之后使用Dapper.Extension类库时,完全可以照搬进 ...
- Kafka系列之-Kafka Protocol实例分析
本文基于A Guide To The Kafka Protocol文档,以及Spark Streaming中实现的org.apache.spark.streaming.kafka.KafkaClust ...