C++ 赋值运算符和拷贝构造函数
拷贝构造函数
class Foo{
public:
Foo();
Foo(const Foo&); //自己定义的拷贝构造函数
};
如果不自己定义,编译器会自己合成一个默认拷贝构造函数:
class Foo{
public:
int a,b,c;
Foo();
Foo(const Foo&); //合成的拷贝构造函数
};
Foo::Foo(const Foo& f) : a(f.a), b(f.b), c(f.c) {}
拷贝构造函数总是用在初始化的时候,不要和赋值搞混。
string dots(10,'.');//构造函数初始化
string s(dots); //构造函数初始化
string s2 = dots; //拷贝构造函数初始化,不是赋值
string s3 = string(10, '.');//拷贝构造函数初始化
但在一下情况,也会隐式调用拷贝构造函数:
- 将对象作为实参传递。
- 返回一个对象(非引用)。
- 用花括号初始化数组中的元素或者一个聚合类的成员。
- 容器的push(), push_back()等就是拷贝初始化,而emplace_back()是直接初始化。
拷贝赋值运算符:“=”
class Foo{
public:
Foo();
Foo& operator=(const Foo&); //重载赋值运算符
};
如果不自己定义,编译器会自己合成一个默认拷贝赋值运算符:
class Foo{
public:
int a,b,c;
Foo();
Foo& operator=(const Foo&); //合成的拷贝构造函数
};
Foo& Foo::operator=(const Foo& f)
{
a = f.a;
b = f.b;
c = f.c;
return *this;
}
一般情况下,如果类需要自定义的析构函数,那么必定需要自定义赋值运算符和拷贝构造函数。
如果需要自定义赋值运算符(拷贝构造函数),那么必定需要自定义拷贝构造函数(赋值运算符),但不一定必须定义析构函数。
自定义赋值运算符要注意自赋值的情况
禁止拷贝、赋值
一些情况下类禁止拷贝,赋值,例如cin,cout。
class Foo
{
public:
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
}
链接一个以前写过的:
https://www.cnblogs.com/hellozhangjz/p/12347628.html
C++ 赋值运算符和拷贝构造函数的更多相关文章
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- C++ 拷贝构造函数、拷贝赋值运算符、析构函数
每一次都会忘,做个笔记吧.想到哪里写到哪里. 拷贝构造函数 第一个参数必须是自身类类型的引用,且任何额外参数都有默认值.(为什么必须是引用?见后解释) 合成拷贝构造函数:如果我们没有为一个类定义拷贝构 ...
- 赋值运算符、拷贝初始化和this指针
一.赋值运算符和拷贝构造函数(重载技术) 赋值运算符和拷贝构造函数有编译器默认提供,但如果想做更复杂的事,需要重载. 1.下面用一个简单的例子先区分一下赋值运算符和拷贝构造函数: #include&l ...
- C++的转换构造函数、拷贝构造函数、赋值运算符重载
1 转换构造函数 C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...
- 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...
- C++禁止使用拷贝构造函数和赋值运算符方法
1.将拷贝构造函数和赋值运算符声明为私有,并不予实现 class Uncopyable { private: Uncopyable(const Uncopyable &); // 阻止copy ...
- 拷贝构造函数 & 拷贝赋值运算符
一.拷贝构造函数 1. 形式 class A { public: // ... A(const A &); // 拷贝构造函数 }; 2. 合成拷贝构造函数 编译器总会为我们合成一个拷贝构造函 ...
- 《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数
题中已给出CMyString的类定义,要求写赋值运算符函数. #include<iostream> #include<cstring> using namespace std; ...
- C++ 构造函数、拷贝构造函数、赋值运算符
<C++ Primer Plus> 12.1 动态内存和类 12.1.1 复习示例和静态类成员 不能在类声明中初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存 如果在头文 ...
- C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...
随机推荐
- Docker从认识到实践再到底层原理(八)|Docker网络
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...
- laravel生成二维码,并添加背景图片,图标logo
1.安装组件 composer require simplesoftwareio/simple-qrcode 1.3.* 在 config/app.php 注册服务提供者: SimpleSoftwar ...
- 应用--WebApplication
应用--Program中的WebApplication 在6.0,微软团队对于NetCore做了很大的改变,其中有一个改变就是推出了新的托管模型--最小托管模型,使用该模型可以创建最小的web应用.( ...
- ch57x/ch58x开启仿真
本次使用的平台是MounRiver Studio,使用的是WCH的CH582m与WCH-LinkE 仿真之前确保LinkE处在Risc-V模式下 空闲时蓝灯常灭 Step1:首先通过ISP工具开启两 ...
- shell 两个数组比较,得到元素的并集、交集等
linux shell 实现数组比较,取元素的并集.交集时,可以使用sort排序.uniq统计和awk数据过滤. shell 实现如下 file_list_1=("test1" & ...
- clickhouse-备份表结构
clickhouse导出表结构 #!/bin/bash OUTDIR=/root/backup/ clickhouse-client -q "SHOW DATABASES" > ...
- typescript 实现enum枚举值定义为对象
壹 ❀ 引 最近因为有一些闲散时间,所以一直在做将Class组件重构为typescript + hooks组件的工作,结果今天就遇到一个有趣的问题.我们知道react Class组件一般都会定义Com ...
- 48.DRF版本控制
版本控制 版本控制是前后端分离开发一个非常重要的内容,比如说我们重要服务修改.升级等发生版本变化v1.v2.v3等,但是版本发生了变化比如 v1升级到了v2版本,v1版本还有业务在继续使用,相当于同时 ...
- react实战 系列
react实战 系列(未完结,持续更新中...) 前言 学习 react 的方法,比较常规的是跟着官方文档边看边做,可是 react 的官网教程有点难(至少比 vue 的难),亦或买几本讲基础的或实战 ...
- SpringBoot使用git-commit-id-maven-plugin打包
简介 git-commit-id-maven-plugin 是一个maven 插件,用来在打包的时候将git-commit 信息打进jar中. 这样做的好处是可以将发布的某版本和对应的代码关联起来,方 ...