首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >确定在C++代码中调用哪个复制构造函数

确定在C++代码中调用哪个复制构造函数
EN

Stack Overflow用户
提问于 2013-05-19 15:21:45
回答 1查看 195关注 0票数 7

我编写了一个简单的C++类示例,其中包含1个非参数构造函数、1个参数构造函数、2个复制构造函数、1个赋值运算符和1个加号运算符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Complex {
protected:
    float real, img;
public:
    Complex () : real(0), img(0) {
        cout << "Default constructor\n";
    }

    Complex (float a, float b) {
        cout << "Param constructor" << a << " " << b << endl;
        real = a;
        img = b;
    }

    // 2 copy constructors
    Complex( const Complex& other ) {
        cout << "1st copy constructor " << other.real << " " << other.img << endl;
        real = other.real;
        img = other.img;
    }

    Complex( Complex& other ) {
        cout << "2nd copy constructor " << other.real << " " << other.img << endl;
        real = other.real;
        img = other.img;
    }

    // assignment overloading operator
    void operator= (const Complex& other) {
        cout << "assignment operator " << other.real << " " << other.img << endl;
        real = other.real;
        img = other.img;
    }

    // plus overloading operator
    Complex operator+ (const Complex& other) {
        cout << "plus operator " << other.real << " " << other.img << endl;
        float a = real + other.real;
        float b = img + other.img;
        return Complex(a, b);
    }

    float getReal () {
        return real;
    }

    float getImg () {
        return img;
    }
};

我在main中使用了这个类,就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main() {
    Complex a(1,5);
    Complex b(5,7);
    Complex c = a+b; // Statement 1
    system("pause");
    return 0;
}

结果打印为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Param constructor 1 5
Param constructor 5 7
plus operator 5 7
Param constructor 6 12

我认为必须在语句1中使用复制构造函数,但我真的不知道调用哪个构造函数。请告诉我是哪一个,为什么?非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-19 15:24:43

编译器省略了对复制构造函数的调用(实际上是两个调用)。这是允许的(但不是强制的!)根据C++11标准的第12.8/31段,即使构造函数或析构函数有副作用:

当满足某些条件时,允许实现省略类对象的复制/移动构造,,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用。。。这种拷贝/移动操作的省略,称为拷贝省略,在以下情况下是允许的(可以组合起来以消除多个拷贝):

-在具有类返回类型的函数中的return语句中,当表达式是具有与函数返回类型相同的cv未限定类型的非易失性自动对象(函数或catch子句参数除外)的名称时,可以通过将自动对象直接构造到函数的返回值中来省略复制/移动操作

..。

-当尚未绑定到引用(12.2)的临时类对象将被复制/移动到具有相同的cv未限定类型的类对象时,可以通过将临时对象直接构造到被省略的复制/移动的目标中来省略复制/移动操作

如果编译器没有省略对复制构造函数的调用,那么第一个将被选中两次,即具有以下签名的那个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Complex( const Complex& other )

原因是:

  • operator +返回的值是从临时(Complex(a, b))复制初始化的,并且只有对const的左值引用才能绑定到临时变量。如果operator +是这样写的,事情就不一样了:

复杂operator+ (常量复杂和其他){ // ...复数c(a,b);返回c;}

在这种情况下,将调用第二个复制构造函数,因为c不是左值,而是一个左值,因此它可以绑定到对const-qualified的左值引用。main()中的c是从右值复制构造的( operator +返回的值也是临时的)。无论operator +如何返回其Complex对象,只要它是按值返回的,都是如此。因此,只要不执行复制省略,就会选择第一个复制构造函数。

如果您使用的是GCC,并想验证此行为,请尝试设置-fno-elide-constructors编译标志(Clang也支持它,但3.2版有一个bug,我不知道它是否已修复)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16636236

复制
相关文章
如何在 Python 中创建静态类数据和静态类方法?
在这里,为静态类数据定义一个类属性。如果要为属性分配新值,请在赋值中显式使用类名 -
很酷的站长
2023/02/25
3.5K0
如何在 Python 中创建静态类数据和静态类方法?
python中类的静态方法和类的类方法
类的静态方法,不需要self这类参数,因为类的静态方法,不需要进行实例化,就可以进行调用。
刘金玉编程
2019/08/30
3.2K0
如何对类中的private方法进行测试?
问题:如何对类中的private方法进行测试? 大多数时候,private都是给public方法调用的,其实只要测试public即可。但是有时由于逻辑复杂等原因,一个public方法可能包含了多个private方法,再加上各种if/else,直接测public又要覆盖其中每个private方法的N多情况还是比较麻烦的,这时候应该考虑单对其中的private方法时行测试了。那么如何进行呢?
跑马溜溜的球
2020/12/07
3.5K0
Python中类的静态方法、类方法及实例方法
经过测试可以发现 实例属性需要通过实例对象来访问,类属性通过类来访问,但在测验中 stu1.school 实例对象也能访问类属性,为什么呢?
ZackSock
2021/04/13
3K0
Python中类的静态方法、类方法及实例方法
Python中类的静态方法、类方法及实例方法
经过测试可以发现 实例属性需要通过实例对象来访问,类属性通过类来访问,但在测验中 stu1.school 实例对象也能访问类属性,为什么呢?
忆想不到的晖
2021/04/04
3K0
Python中类的静态方法、类方法及实例方法
Junit测试Service类方法教程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
SmileNicky
2019/09/25
9880
python 类中的方法
上一篇中讲到 创建了类,并且重点讲述了构造函数以及类实例,特别是对那个self,描述了不少。在讲述构造函数的时候特别提到,init()是一个函数,只不过在类中有一点特殊的作用罢了,每个类,首先要运行它,它规定了类的基本结构。
全栈程序员站长
2022/06/29
1.4K0
类中的构造方法
构造方法是正常开发中不可或缺的一部分,是语法上必须存在的。是一个具有特殊格式的方法,且有特殊的调用方式。
星哥玩云
2022/09/14
1.1K0
类中的构造方法
验证码类
工具类 package com.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; impor
码客说
2019/10/22
8690
如何对类中的protected方法进行单元测试
也许很多同学写单元测试时遇到这样的问题,一个类方法是 protected ,如何测呢 ? 当然,你可以说把 protected 改成 public 就可测了!没错,是可测了,可是 ......
跑马溜溜的球
2020/12/07
4K0
软件测试方法 -- 等价类边界值
测试用例是为了特定的目的而设计的一组测试输入、执行条件和预期的结果,以便测试是否满足某个特定需求。通过大量的测试用例来检验软件的运行效果,他是指导测试工作进行的依据。
EXI-小洲
2022/12/13
8520
软件测试方法 -- 等价类边界值
java中类中多个Synchronized方法
下面给出一个例子,说明一个class中有两个方法synchronized的情况。它们互相阻挡的用法和上面的“一个方法有synchronized”的情况是一样的。
马克java社区
2021/04/23
9070
java中类中多个Synchronized方法
java测试类的创建方法_java编写一个类
单元测试(unit testing) ,是指对软件中的最小可测试单元进行检查和验证。
全栈程序员站长
2022/11/02
5.3K0
springBoot中static类引用普通类的方法【工作】
需求: 要在一个工具类中引用其他项目包提供的一个API,直接引用会报错。 解决方案: 直接贴代码,主要是注意注解的使用; import com.test.api.basecode.BaseCodeAPI; /** * 功能描述:获取用户的工具类 * * @author: LIUY * @create: 2019-01-21 17:15 */ @Component @Slf4j public class SessionUtil { @Autowired private Login
用户5640963
2019/07/25
1.4K0
如何在 Django 中创建抽象模型类?
Django 中的抽象模型类是一个模型,它用作其他模型继承的模板,而不是一个旨在创建或保存到数据库的模型。在应用程序中,可以使用抽象模型定义多个模型共享的相似字段和行为。使用 Django,您可以定义一个派生自 Django.db.models 的模型类,以建立一个抽象模型类。
很酷的站长
2023/08/11
2650
如何在 Django 中创建抽象模型类?
如何在Vue中动态添加类名
能够向组件添加动态类名是非常强大的功能。它使我们可以更轻松地编写自定义主题,根据组件的状态添加类,还可以编写依赖于样式的组件的不同变体。
前端小智@大迁世界
2020/05/12
6.3K0
如何在java中创建不可变类?
今天我们将学习如何在java中创建不变的类。不可变对象是在初始化之后状态不变的实例。例如,String是一个不可变类,一旦实例化,它的值不会改变。
三产
2021/01/12
1.9K0
构造方法、类方法、类的复合
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/46794991
用户1451823
2018/09/12
1.2K0
python类:类方法和静态方法
http://blog.csdn.net/pipisorry/article/details/49516185
用户7886150
2020/12/01
8880
Dart 中类的静态成员、类的继承、覆写父类方法
1. Dart中的静态成员 定义静态成员 非静态方法可以访问静态成员以及非静态成员 静态方法没法访问非静态成员。 2. Dart中与方法有关的操作符 ? 条件运算符 is 类型判断 as 类型转换 .
越陌度阡
2020/12/08
3.3K0

相似问题

如何在测试其他类方法的测试中模拟类方法?

12

如何在RSPEC中测试类方法

50

如何在类组件中测试方法?

13

在不同的测试类中测试类的方法

11

如何在Scala中测试私有类方法?

84
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文