拷贝构造函数_多参数拷贝构造函数_TikiMyobSOF的博客-程序员秘密

技术标签: c++  编程语言    

#include <iostream>
using namespace std;
class C_score{
    
string course;
int score;
public:
C_score(string c, int s):course(c),score(s){
    
cout << "constructing C_score:" <<course<< endl;
}
~C_score(){
    
cout << "dstructing C_score:" <<course<< endl;
}
};
class aa{
    
    public:
        aa(){
    
            cout << "6666" << endl;
        }
};

class Student {
    
public:
    
    Student(string n, string c, int s) : c_score(c, s), name(n)
    {
    
        cout << "constructing Student:" << name << endl;
}
~Student(){
     
cout << "destructing Student:"<<name << endl;
}
private:
    aa a;
    string name;
    int age;
    C_score c_score;
};

int main()
{
    
Student * s = new Student("ZhangSan","c++",88);
Student ss("Lisi", "English", 85);
delete s;
return 0;
}

/*
output:
6666
constructing C_score:c++
constructing Student:ZhangSan
6666
constructing C_score:English
constructing Student:Lisi
destructing Student:ZhangSan
dstructing C_score:c++
destructing Student:Lisi
dstructing C_score:English
*/

以上述为例

在创建一个(含有组合类)对象的过程:

1.运行student类的成员
2.冒号引用,调出函数参数列表
3.执行C_score类
4.执行cscore的成员
5.执行cscore的构造函数
6.执行student的构造函数
按照声明顺序执行成员类的构造函数——>执行自己的构造函数

在析构一个对象的过程:

与自身构造时调用自己以及成员组合类时的构造函数顺序相反

不可以将拷贝构造函数看作一种特殊的构造,它与构造有着不同的规则:
如果我们设置一个构造函数参数是int i,这个时候我们在主函数如果声明这个类型的对象然后对这个对象使用该类型的其他对象进行赋值(拷贝)那么它不会因为没有参数为这个对象的构造函数报错。实践证明上述方法实现了,是因为调用了默认的拷贝构造函数(将对象中的静态成员进行拷贝)

拷贝函数的隐式类型转换

#include <iostream>
using namespace std;
class aa{
    
    public:
        aa(int a){
    
            cout << a << endl;
        }
        ~aa(){
    
            cout << "de" << endl;
        }
        int i;
};

class bb{
    
    public:
        bb(int a){
    
            i = -a;
        }
        int i;
};

void m(aa a){
    
    cout << "fun--m" << endl;
}

int main(){
    
    m(9);
    return 0;
}
/*
output:
9
fun--m
de
*/

m(9)中9不是aa类,但是存在隐式类型转换—产生了一个aa(9)的临时对象,以临时对象作为参数传入m函数中,执行m函数,执行结束后临时对象析构。

注意:
在上面代码区增加了一个m的重载函数

void m(bb a){
    
    cout << "fun--m" << endl;
}

上述程序就会报错,因为存在二义性,编译器不知道应该产生临时变量aa(9)还是bb(9)

#include <iostream>
using namespace std;
class HighWorker {
    
 float income;
public:
    HighWorker(float a = 2000.0){
    income = a;}
    float Getincome(){
    return(income);}
};
class Worker {
    
   float income;
    public:
        Worker(float a = 1200.0) {
     income = a; }
        Worker(HighWorker b) {
     income = 0.75 * b.Getincome(); }
        float Getincome() {
     return (income); }
};
void m(Worker a) {
     cout << a.Getincome() << endl; }
int main(){
      
    Worker a;  m(a); 
    HighWorker b;  m(b);
	return 0;
    }

同时编译器还会为自定义类的对象进行隐式转换,上述在m(b)中,将b转化为Worker(b)的临时对象,执行了*Worker(HighWorker b) { income = 0.75 * b.Getincome(); }*构造函数。
也就是自定义类A中存在以a,b,c,d类为唯一参数的构造函数,我们就可以将a,b,c,d类隐式转换成类A。
但是:转换不能太复杂,不允许多参数,不允许间接转换

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33526880/article/details/116171657

智能推荐

树莓派搭建rtmp服务器使用ffmpeg推流_树莓派ffmpeg推流_时光@印迹的博客-程序员秘密

首先需要下载nginx-1.8.1 : http://nginx.org/download/nginx-1.8.1.tar.gzwget http://nginx.org/download/nginx-1.18.0.tar.gznginx-rtmp-module : https://github.com/arut/nginx-rtmp-modulegit clone https://github.com/arut/nginx-rtmp-moduleopenssl :https://www.o

Caused by: java.lang.IllegalArgumentException: WebView cannot be used with device protected storage_webview不能与设备保护存储一起使用_小小米乐的博客-程序员秘密

前两天我们的应用要集成到手机里作为系统应用添加了如下属性 android:directBootAware="true" android:defaultToDeviceProtectedStorage="true"然后打开webview就报错如下; java.lang.RuntimeException: Unable to start activity Com...

Python之路,Day1 - Python基础1_weixin_30877493的博客-程序员秘密

一、 Python介绍Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNUGeneral Public License)协议。...

【微信小程序】解决view标签内的文本不能自动换行问题_view 文字不换行_嘻嘻的妙妙屋的博客-程序员秘密

情景一行文字太多,用 view 标签包裹时,超出屏幕;解决方法简单粗暴&lt;view style=“overflow-wrap: break-word;”&gt;123213123123213213213213213213213213213213213211232131231232132132132132132132132132132132132112321312312321321321321321321321321321321321321&lt;/view&gt;...

[python]正则表达式实战,提取txt文档的指定内容,并输出为表格csv文件_正则表达式提取文本导出表格_不同的猴子的博客-程序员秘密

由于需求,需要将一些txt文本中的指定字符提取出来,并以表格形式保存。突然想到我学过一点python,由于数据量较多,写个脚本处理明显会效率更高。于是花了一个晚上的时间更改文件后缀名为txt,并将文件的部分内容进行删除,剩下需要提取的部分。大大小小的文件有几十个吧,花了不少功夫。较长时间没写python了,主要用到 正则表达式 和 文件读写功能。写的过程中还遇到不少问题,编码问题,空白...

Java学习四阶段-13 Docker技术基础应用实践_qq_43802023的博客-程序员秘密

文章目录 Docker技术简介概述版本说明Docker参考手册Docker 应用分析 Docker安装准备工作开启虚拟机系统离线安装docker在线安装Docker Docker入门实践基本操作核心对象分析镜像容器数据卷 Docker镜像操作实践下载运行镜像删除镜...

随便推点

PCIe PHYMAC--LTSSM详细讲解_pcie协商过程_maxwell2ic的博客-程序员秘密

Phy layer框图Byte striping of Tlp(transaction layer package),dllp(data link layer package),os(ordered set)下面是典型的tlp,dllp,os的格式。LtssmDetect检测电气连接Pipe_txdetrx,差分线波形检测端接阻抗,以确定是否有电气连接Polling实现bit lockPolling.active tx在gen1速率下至少发1024个ts1,让对端rx实现b

Java并发04:Thread的基本方法(1)-Name、ThreadGroup、activeCount、isAlive、守护线程等_hanchao5272的博客-程序员秘密

[超级链接:Java并发学习系列-绪论]本章主要对Java中Thread类的基本方法进行学习。1.序言Thread类作为线程的基类,提供了一系列方法,主要有:Thread.sleep(long):强制线程睡眠一段时间。Thread.activeCount():获取当前程序中存活的线程数。thread.start():启动一个线程。Thread.currentThread()...

mybatis-plus QueryWrapper自定义排序_五那几诺火库洛,火库洛!!的博客-程序员秘密

把自定义sql拼在orderByAsc()/orderByDesc() 中即可。例: wrapper.orderByAsc(" ( case status when 0 then 0 when 1 then 1 else 999 end ) ");

zabbix监控docker容器状态-附脚本_zabbix监控容器状态_地球空间-技术小鱼的博客-程序员秘密

zabbix监控docker容器状态前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : )废话我也就不多说,直接开始首选,zabbix_agentd 配置 vim /usr/local/zabbix/etc/zabbix_agentd.conf 1 2 UserParameter=docker.discovery,/usr/loca...

微信文章阅读数点赞数查询API接口及实现(小数据量)_Owen292的博客-程序员秘密

微信文章阅读数点赞数查询API接口及实现    研究过微信文章阅读和点赞数的同学都知道,如何获取这两个数字,关键在于获取微信有效的key.这个key的作用时间大概是2小时,而且也有访问频率的限制.访问频率可以用代码控制,大概10秒一次的速度就不会被屏蔽.接下来说如何完全自动获取有效的key. 可能大部分同学都会去搞手机上的key,一来我不知道怎么搞(Java开发不会Android囧

python周志_使用python按周汇总数据_初夏之菡的博客-程序员秘密

我有一个这样的数据,并且我不会在一周内将它聚合为两个日期:我确实有这个元组列表,它从我的交易表中显示每天的销售额Metadate = [(Day, 'totalSales By dollars')]data=[('2013-06-21', 14),('2013-06-20', 19),('2013-06-23', 11),('2013-06-22', 13),('2013-06-25', 6),(...

推荐文章

热门文章

相关标签