匿名对象赋值-大神帮看一下代码,为什么t5 = addC(a1, a2)中,只调用了一次copy构造函数?

问题描述

大神帮看一下代码,为什么t5 = addC(a1, a2)中,只调用了一次copy构造函数?
 #include<iostream>

using namespace std;

class  ABC
{
public:
    ABC(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;
        printf("我是有参构造函数!n");
    }
    ABC(ABC &c)
    {
        this->a = c.a;
        this->b = c.b;
        printf("我是copy构造函数!n");
    }
    //成员函数
    ABC addC(ABC &c)
    {
        //1.实例化t1
        //2.实例化匿名对象
        //3.t1调用构造函数给匿名对象赋值
        //4.ti被析构
        ABC t1(this->a + c.a, this->b + c.b);
        return t1;
    }
    ABC& addC2(ABC &c)//返回一个引用,相当于自身
    {
        this->a = this->a + c.a;
        this->b = this->b + c.b;
        return *this; //把*(&调用者)回到了调用者元素
    }
    //成员函数
    void PrintABC()
    {
        printf("t2->a:%d,t2->b:%dn", this->a, this->b);
    }
    ~ABC()
    {
        printf("我是析构函数!n");
    }
public:
    int a;
    int b;
};
//全局函数
//成员函数 转为全局函数 多了一个参数
void PrintABC(ABC *t2)
{
    printf("t2->a:%d,t2->b:%dn", t2->a, t2->b);
}

//全局函数
//全局函数转成 成员函数 少了一个参数
ABC addC(ABC &c, ABC &d)
{
    //1.实例化temp
    //2.实例化匿名对象
    //3.temp调用构造函数给匿名对象赋值
    //4.temp被析构
    ABC temp(c.a + d.a, c.b + d.b);
    return temp;
}

void main()
{
    ABC a1(1, 2);
    ABC a2(3, 4);

    ABC a3;
    //全局函数方法
    a3 = addC(a1, a2);

    //成员函数方法
    {
        ABC a4 = a1.addC(a2); //匿名对象直接转化为 t4(直接转化,不调用copy构造函数)
        a4.PrintABC();
        ABC t5;
        printf("=====================n");
        t5 = addC(a1, a2);//匿名对象赋值给t5
        t5.PrintABC();
    }
    system("pause");
}

解决方案

John_ToString 你理解过了吧。这里没那么复杂,而且楼主也就是测试,应该编译的是debug版,不存在优化。addC函数内定义了一个temp对象,这个对象是用构造函数直接构造的,不需要调用拷贝构造。当函数范围时 把temp赋值给t5调用了一次拷贝构造。
如果真的是优化,编译的代码中不会有temp对象,而会用t5替换之。

另外楼主需要理解什么事拷贝构造函数以及什么时候会调用,这样你就会豁然开朗。

解决方案二:

t5 = addC(a1, a2);//匿名对象赋值给t5 这句话是不是有问题啊

解决方案三:

实例化temp的时候是有参构造咯,然后函数返回值赋值给t5就是copy构造咯

解决方案四:

  ABC addC(ABC &c)
    {
        //1.实例化t1
        //2.实例化匿名对象
        //3.t1调用构造函数给匿名对象赋值
        //4.ti被析构
        ABC t1(this->a + c.a, this->b + c.b);
        return t1;
    }

返回值应该是匿名对象,这个匿名对象不应该用copy构造函数赋值吗。

解决方案五:

且不看你的所有代码,就看你所说的点,首先参数是引用不会调用拷贝构造,进入函数体之后,掉一次构造,然后函数返回(因为返回的是对象)后经过
编译器优化后只调用一次拷贝构造,即就是直接用此对象去初始化t5这个对象,省去了编译器构造临时对象的过程,为什么呢?原因是编译器为了提高效
率,而当前的对象已经被构造出来并且放在某个寄存器或者缓存里面,编译器就不会再去访问此对象的内存空间,这样子效率提高了很多,但又会引发一
些其他的问题,尤其是在写网络通信以及端口方面的软件时,应该注意,应该尽可能的去制止编译器因为一味提高效率而牺牲准确性的可能性,因此c++
提出了voliate关键字,具体请自己去查阅相关文档...

解决方案六:

有空上机看看你的这段代码

时间: 2024-10-06 20:08:40

匿名对象赋值-大神帮看一下代码,为什么t5 = addC(a1, a2)中,只调用了一次copy构造函数?的相关文章

arraylist-求大神帮看下代码,怎么做才能接收自己输入的字符串进行判断呢?

问题描述 求大神帮看下代码,怎么做才能接收自己输入的字符串进行判断呢? public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("请输入你要查询出现单词或字母次数句子"); ArrayList<Object> arrayList = new ArrayList<Object>(); String f = s.nextLine()

javascript-深夜了还有前端的大神吗,我写了一个Demo但是没调明白,求大神帮看下?

问题描述 深夜了还有前端的大神吗,我写了一个Demo但是没调明白,求大神帮看下? <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <style type="text/css&q

java小白求大神帮看一下为什么会发生数组越界。代码如下:

问题描述 java小白求大神帮看一下为什么会发生数组越界.代码如下: package arraytest; public class ArrayTestSort { public static void main(String[] args) { int i,j=0; int[] arr = new int[]{100,40,60,87,34,11,56,0}; int temp = 0; for(i = 0;i<arr.length;i++){ for(j = 0;j<arr.length-

大神帮看一下这个算法的实现思路?

问题描述 大神帮看一下这个算法的实现思路? 字符串 = "a/b/c_d/e/f_m/n/k_o/p": 字符串的长度是不确定的,通过组合把字符串 拆分成a/d/m/o, a/d/m/p,a/d/n/o,... 依次这样组合. 解决方案 参考:http://bbs.csdn.net/topics/390951529 解决方案二: 非常感谢 ,算法不错

jedis-好好的,什么都没有做,突然就报这个错误,大神帮看一下

问题描述 好好的,什么都没有做,突然就报这个错误,大神帮看一下 求大神帮我看一下怎么回事,是连不上服务那边了吗?还是怎么回事,本来启动着项目好好的,什么都没有做,就出去吃了个饭,回来就这样了 刚才ping了一下dubbo:registry 这个地址,显示请求超时,是因为服务那边出的问题吗? 解决方案 spring的配置文件或者jar包不对 解决方案二: ping不通的话,,那就是服务那边的问题,,问下项目经理就知道了

equals-Arraylist 去重复时编写去重方法没有运行找不到错误在哪?求大神帮看一下

问题描述 Arraylist 去重复时编写去重方法没有运行找不到错误在哪?求大神帮看一下 class Person { private String name; private int age; Person (String nameint age) { this.name = name; this.age =age; } public void setName(String name) { this.name = name; } public void setAge(int age) { th

代码分析-JAVA 求大神帮看下这段代码 怎么修改 救命啊

问题描述 JAVA 求大神帮看下这段代码 怎么修改 救命啊 真心看不懂 public static char[] a(char[] paramArrayOfChar) { char[] arrayOfChar1 = new char[12]; char[] arrayOfChar2 = new char[12]; arrayOfChar2[0] = '?'; arrayOfChar2[1] = '?'; arrayOfChar2[2] = 'o'; arrayOfChar2[3] = '/';

c-有没有大神帮看下鄙人写的高斯完全主元素消元法代码哪里出了问题,真心感谢啊!

问题描述 有没有大神帮看下鄙人写的高斯完全主元素消元法代码哪里出了问题,真心感谢啊! /*矩阵A用于存放线性方程组的增广矩阵,向量X表示线性方程组的解 #include #include int main() { double m,p,A[10][10],X[10]; int n,i,j,k,q,l,c,w; char a; printf("请输入方程的阶数(小于等于8):n"); scanf("%d",&n); for(i=1;i<=n;i++)//

java 调用cmd 执行读取sql文件问题?求大神帮看下

问题描述 java 调用cmd 执行读取sql文件问题?求大神帮看下 Runtime run =Runtime.getRuntime(); Process process = run.exec("cmd /cmysql -u root -pssdlh test <d:/test.sql"); InputStreamReader ir = new InputStreamReader(process .getInputStream()); LineNumberReader input