类的直接构造和拷贝构造

C++类的拷贝(复制)构造函数深入理解 拷贝构造函数的基本使用以及更深入的理解 阅读详情

先看代码:

#include <iostream>
using namespace std;

class A
{
public:

	A(int k): m_k(k)
	{
	}

	A(const A&a): m_k(a.m_k)
	{
	    cout << "copy ctor" << endl;
	}

private:

	int m_k;
};

int main()
{
    A a1(1);
    A a2 = 1;

    return 1;
}

A a1(1);    A a2 = 1;这两句代码有啥区别?

A a1(1);  调用A::A(int),这是直接初始化。

重点说说下面的拷贝初始化:

A a2 = 1;语义上相当于 A a2 (A(1)); 即先调用A::A(const A&),再调用A::A(int)。但是编译器会进行优化,略掉A(1)临时变量的构造,直接使用A::A(int)。

这种优化不意味着A::A(const A&)是可有可无的,不信把A::A(const A&)声明成private,然后再编译看看:)。这意味着编译器会对拷贝构造函数的声明(不是实现)进行合法性检查。

事实上,拷贝初始化允许编译器先调用一个用户自定义的转换,然后再调用拷贝构造函数。上面的A::A(int)相当于一个用户自定义转换:从int到A的转换。如果把A::A(int)声明成explicit,照样编译不通过。

另外operator type()也是用户自定义转换的一种,比如:

class B
{
public:

    operator A()
    {
        return A(1);
    }
};
C++对象构造的三种方式:直接构造or拷贝构造or移动构造 文章目录背景知识示例说明测试环境对象创建流程直接声明方式new操作符方式对象构造直接构造拷贝构造移动构造一些建议源码下载相关推荐 背景知识 构造函数(Constructor)就是用来构造对象的函数。C++对象在创建的过程中会调用构造函数对类中成员进行初始化。 构造函数包含有普通构造函数、拷贝构造(Copy Constructor)函数以及C++11以后新增的移动构造(Move Constructor)函数三种。通常,我们说构造函数只特指普通构造函数。 示例说明 文中示例均使用下面的自定义Test类,该类包含 阅读详情

相关推荐

C++技术点积累(2)——拷贝构造函数、深拷贝、浅拷贝

C++技术点积累: 1、因为在A类外的B类是无法使用A类的private成的,但是有的时候又有这种需求(A类和B类有一些业务数据联系),一般我们可以A类中编写一些get()函数,getAx(){ return x;//把A类的成员变量甩出去},这样,我们在B类就可以调用A类的getAx()函数来使用A类的成员变量x。 2、拷贝构造函数的四种调用情景(拷贝构造函数调用时机) 3、深拷贝、浅拷贝

松狮 1682

类和对象(中)——拷贝构造函数详解

拷贝构造函数介绍

qq_48042235的博客 832

C++:10---再议拷贝构造函数

一、概念使用一个已经存在的对象,去构造(初始化)另一个对象二、格式参数加上const&,因为拷贝构造函数在几种情况下都会被隐式地使用,因此拷贝构造函数不应该是explict的c...

yolo模型训练找我,AI游戏合作找我 395

C++基础——拷贝构造函数

C++类成员函数之拷贝构造函数

weixin_69283129的博客 2万+

ATE测试基础——直流参数测试

芯片测试在发展过程中诞生了许多术语,初次接触的人大部分都会被绕晕。因此为方便广大读者理解,在开始介绍测试项之前,需要对测试领域的名词进行解释。还有部分较为抽象的内容,需要略作展开。DUT——Device Under Test,正在被测试的器件Pin——器件引脚,信号引脚分为输入,输出,三态和双向四类,负责与外界进行信息交互;电源引脚分为电源和地两类,结构与信号引脚不同,负责给器件内部运行和外部输出提供电平。输入:在外部信号和器件内部逻辑之间起缓冲作用的信号输入通道;

你骄傲地飞远的博客 1万+

IEEE PHM 2012轴承数据实战:用LSTM预测剩余寿命的完整流程与调参心得

本文详细解析了如何利用IEEE PHM 2012轴承数据集和LSTM模型进行轴承剩余寿命预测。从数据预处理、特征工程到LSTM模型架构设计和调参技巧,提供了完整的实战流程。特别分享了FEMTO-ST数据集的处理方法、RUL标签构建策略以及提升预测精度的关键技巧,帮助工程师实现更准确的预测性维护。

weixin_31100517的博客 368

拷贝构造(深拷贝、浅拷贝)

简单理解一下深拷贝和浅拷贝

qq_42981122的博客 3676

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1074

c++类和对象三部曲——(2)

默认成员函数(拷贝构造,编译器实现的拷贝构造,默认拷贝构造)(析构,默认析构),(拷贝构造,默认拷贝构造,初识深拷贝浅拷贝问题)

m0_73904148的博客 920

GraphSense介绍

GraphSense是一个跨账本加密货币分析平台 它的介绍在这里 代码也是开源的 graphsense-dashboard 用于交互式加密货币分析的Web仪表板。 可以看导进数据的情况 graphsense-transformation 基于spark/cassandra/java服务运行 GraphSense转换管道,用于将加密货币的区块/交易/标签等数据导入,可以看它指定的json格式: t...

幸福诗歌的博客 1083

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4945

【C++第二阶段】调用拷贝构造函数时机

有三种不同的情况会由编译器自动调用‘拷贝’构造函数。

诚 1596

GEM5教程--gem5开始之旅(一)

GEM5系列教程--gem5开始之旅一、建立GEM5 GEM5模拟器是一个用于计算机系统结构研究的模块化平台,包含系统级别的结构以及处理器的微体系结构。读者若想详细的了解,请查看其官方文档GEM5文档 读者如果想要入门GEM5的话,可以参考Learning_GEM5这个网站,这里面有较为详细的教程,可以带读者从入门到精通。小编我对GEM5的入门学习也是从这个Learning_GEM5这个网站学习的...

qq_43381135的博客 3万+

C++拷贝构造函数与拷贝赋值运算符

拷贝构造函数 拷贝构造函数定义了当同类型的另一个对象初始化本对象时做什么,如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。拷贝构造函数的参数类型最好是const 引用。 如果我们没有为一个类定义拷贝构造函数,编译器会为我们生成一个,与合成默认构造函数不同,即使我们定义了其它构造函数,编译器也会为我们合成一个拷贝构造函数。 一般情况下,合成的拷贝...

天道酬勤 2659

功率开关管驱动串扰(Crosstalk):深度解析与优化方案

介绍了功率开关器件驱动串扰产生机理,并整理了常见的工程应用优化措施

qq_38326420的博客 559

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4586

C++默认初始化和值初始化、 直接初始化和拷贝初始化

默认初始化和值初始化一一对应 前提知识 声明: 在环境/上下文中指定一个变量的名字。也就是说,声明仅仅是让编译器知道,而没有实际分配空间。 初始化:给一个声明后尚未初始化的变量一个有意义的初始值。 赋值 : 销毁一个变量原来的值,并赋予一个新值。相当于改变了一个变量的状态。 默认初始化: 对象可能产生未定义的值(是否绝对尚待确定,例如类类型(定义了默认构造函数)的默认初始化是否属于值初始化等)。 值初始化: 对象的值是确定(预设)的。 值初始化出现场景: 1.数组初始化时初始值数量小于维度,剩下的元素会进行

qq_38231713的博客 2321

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++ 拷贝构造函数

基本类型赋值的时候很简单,直接使用 = 即可,例如 int a = 10; int b = 10; 但是类不一样,类里面包含着许多的成员,不能像基本类型一样赋值。 例如: class test{ test(int x.int t){ a = x; b = t; } public: int a = 0; int b = 2; } 如果我直接 test t1(5,2); ...

TomCat的播客 128

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

构造函数,拷贝构造函数,和赋值

这个问题似乎有些老生长谈,但是今天做了一下实验,发现坑的地方还挺不少。 直接看例子 class A { public: A(int a):s(a){cout<<"int construct!"<<s<<endl;} A(char *a){cout<<"char construct"<<endl;} A(const A& a){s=a.s;cout<<"copy!"<<endl;} A

answen的专栏 571

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++:String对象的构造及深拷贝

C++中String对象的构造以及深拷贝 拷贝构造的实现方式 先释放掉_str的内存,然后再申请一个要拷贝的内存空间,再将原对象的值拷贝到目标对象中 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<string> #include<list> #include<assert.h> #include<vld.h> using namespace std; names

qq_42613519的博客 745

阻止拷贝构造和拷贝赋值

 如果一个类需要自己定义析构函数,往往需要自己定义拷贝构造和拷贝赋值,系统默认合成的拷贝构造和拷贝赋值知识简单的拷贝指针成员,意味着可能会造成多个指针指向同一个内存。class A{private: B* m_data;}A a1;A a2(a1);delete a2; // a1和a2同时被销毁A a3(a1); // a3指向无效内存解决方法一: 将拷贝构造函数和拷贝赋值函数设置为 p...

lihaidong的博客 791

C++拷贝构造函数与移动构造函数

C++ 拷贝构造函数与移动构造函数

u012159565的专栏 566

拷贝构造函数和拷贝赋值函数例子

#include struct aa { int num = 2; double d = 1.23; }; class ABC { public: ABC(); ~ABC(); ABC(ABC &abc);//拷贝构造函数 ABC& operator= (const ABC& abc);//拷贝赋值函数 void set(int num, double d) { a.nu...

qq_38689346的博客 293

C++11新特性:移动构造函数和移动赋值

移动构造函数就是从拷贝构造函数演化而来的。 拷贝构造函数又分为浅拷贝和深拷贝: 浅拷贝:当类中有指针时,浅拷贝会发生错误 深拷贝:每次都是重新赋值一份,在某些情况下这种方法可能内存消耗较大 因此就产生了移动构造函数, 将原来对象的东西移动到新的对象上 移动后当对象销毁时不能发生错误 移动后原对象不再指向被移动的资源,这些资源的所有权已经归属新创建的对象 A(A&x){ this->num = new int(*x.num); cout &l...

双鱼座boyy的博客 7860

C++每日一练(拷贝构造函数、友元函数)

本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/lxy_2011/article/details/52672111 一、今日课题 1.拷贝构造函数 2.友元函数 二、实战演练 1.拷贝构造函数 拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用...

u012923807的博客 281

拷贝构造函数

一、用对象来初始化对象 (1)简单变量定义时,可以直接初始化,也可以用另一个同类型的变量初始化。 (2)用class定义一对象时,可以直接初始化,也可以用另一个对象来初始化 二、为什么可以用 (1)变量的直接初始化就是在变量分配内存后直接用初始化的值对分配的内存赋值(也就是把初始化的值存储在该内存中) (2)变量给变量初始化就是新定义的变量在分配内存会执行一个复制操作,将另一个变量的值复制到新定义变量的内存中。 (3)对象的直接初始化就是对象在分配内存后调用了相应的constructor来完成初始化。 (4

weixin_44764479的博客 188
上一篇: 模拟C++11的新关键字decltype
HardIOCP
博客等级 码龄16年 7粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值