精华内容
下载资源
问答
  • 拷贝构造函数调用的时机: 1、当用类的一个对象初始化该类的另一个对象时 2、 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时. 3、如果函数的返回值是类的对象,函数执行完成返回调用者时. 4、需要...

    链接:https://www.nowcoder.com/questionTerminal/a0f69e79a60d45f2b441c7e92f8f6ad3
    来源:牛客网
     

    拷贝构造函数调用的时机:

    1、当用类的一个对象初始化该类的另一个对象时

    2、 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时. 

    3、如果函数的返回值是类的对象,函数执行完成返回调用者时. 

    4、需要产生一个临时类对象时

    展开全文
  • 当不使用任何初始值定义一个类非静态变量时,会调用该类默认构造函数。 Aa; 此时,会调用类A默认构造函数。在《C++中类合成默认构造函数2-1》https://blog.csdn.net/hou09tian/article/details/108072603...

    1 不指定类对象的初始值时

    当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。

    A a;

    此时,会调用类A的默认构造函数。在《C++中类的合成默认构造函数2-1》https://blog.csdn.net/hou09tian/article/details/108072603中提到,如果类中没有显式地定义默认构造函数,则C++编译器会为其创造一个合成的默认构造函数,如果类中已经定义了其他格式的构造函数,此时C++编译器不会再为其合成默认构造函数。所以,如果此时类A的定义为

    class A {
    public:
      A(int i){}
    };

    此时,程序会报错,报错信息为“error C2512: “A”: 没有合适的默认构造函数可用”。

    2 类本身含有类的对象且使用该类的默认构造函数时

    当类B含有类A的对象,并且使用类B的默认构造函数时,会调用类A的默认构造函数。

    class A {
      public:
        A(int i){}
    };
    
    class B {
      A m_a;
    };

    使用类B的默认构造函数来创建该类的对象

    B b;

    此时,会调用类B的合成默认构造函数,并调用类A的默认构造函数。因为类A没有默认构造函数,所以此时程序报错信息为“ error C2280: “B::B(void)”: 尝试引用已删除的函数”。

    3 类本身含有类的对象且没有在构造函数中显式初始化该对象时

     

    class A {
      public:
        A(int i){}
    };
    
    class B {
      public:
        B(int i){
    }
        A m_a;
    };

    此时,类B的构造函数没有显式地初始化类A的对象m_a,那么则需要调用类A的默认构造函数来初始化m_a,但是类A没有定义默认构造函数,因此,程序的报错信息为“ error C2512: “A”: 没有合适的默认构造函数可用”。

    展开全文
  • #include <stdio.h> #include <iostream&...A无参构造函数" << endl; } A(const A& a){cout << "A拷贝构造函数" <&
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
    	A(){ cout << "A的无参构造函数" << endl; }
    	A(const A& a){cout << "A的拷贝构造函数" << endl;}
    	~A(){ cout << "A的析构函数" << endl; }
    	void method(){ cout << "A的普通方法" << endl; }
    };
    
    A& f1()
    {
    	A a;
    	printf("f1函数的局部对象的地址为:%p\n",&a);
    	return a;
    }
    
    int main()
    {
    	A a = f1();//注意,拷贝构造函数的调用发生在此处
    	printf("%p\n", &a);
    	getchar();
    	return 0;
    }
    

    输出结果:
    A的无参构造函数
    f1函数的局部对象的地址为:0018F7FF
    A的析构函数
    A的拷贝构造函数
    0018F8EF

    展开全文
  • 一次在ReturnRvalue()函数中,构造好了Copyable对象,返回时候会调用拷贝构造函数生成一个临时对象,在调用AcceptVal()时,又会将这个对象拷贝给函数局部变量a,一共调用了两次拷贝构造函数。而AcceptRef()...

    首先看下如下代码:

    #include <iostream>
    using namespace std;
    
    class Copyable {
    public:
        Copyable(){}
        Copyable(const Copyable &o) {
            cout << "Copied" << endl;
        }
    };
    
    Copyable ReturnRvalue() {
        return Copyable(); //返回一个临时对象
    }
    
    void AcceptVal(Copyable a) {
    
    }
    
    void AcceptRef(const Copyable& a) {
    
    }
    
    int main() {
        cout << "pass by value: " << endl;
        AcceptVal(ReturnRvalue()); // 应该调用两次拷贝构造函数
    
        cout << "pass by reference: " << endl;
        AcceptRef(ReturnRvalue()); //应该只调用一次拷贝构造函数
    }

    为了更好的观察结果,可以在编译的时候加上-fno-elide-constructors选项(关闭返回值优化)。

    [root@k8s-80 test]# g++ test.cpp -o test -fno-elide-constructors

    [root@k8s-80 test]# ./test

    pass by value:

    Copied

    Copied

    pass by reference:

    Copied

    [root@k8s-80 test]#

    AcceptVal(ReturnRvalue())需要调用两次拷贝构造函数,一次在ReturnRvalue()函数中,构造好了Copyable对象,返回的时候会调用拷贝构造函数生成一个临时对象,在调用AcceptVal()时,又会将这个对象拷贝给函数的局部变量a,一共调用了两次拷贝构造函数。而AcceptRef()的不同在于形参是常量左值引用,它能够接收一个右值,而且不需要拷贝。

    上面部分不变,对main()函数里的类型做如下修改再次测试:

    int main() {
    
        cout << "pass by value: " << endl;
    
        ReturnRvalue();//不接收返回值
    
    }

    重新编译后运行,从结果可知调用了一次拷贝构造函数。函数内构造好一个对象,在函数返回时,调用拷贝构造函数创建一个匿名临时对象,即使没有使用变量去接收返回值。

    int main() {
    
        cout << "pass by value: " << endl;
    
        Copyable  tmp = ReturnRvalue(); //接收返回值,且是用返回值来初始化一个对象
    
    }

    编译运行结果是调用了二次拷贝构造函数。函数内构造好一个对象,在函数返回时,调用拷贝构造函数创建一个匿名临时对象。再将该匿名对象用来对tmp初始化时,会调用拷贝构造函数。

    当函数参数类型为引用时:

    int main() {
    
        cout << "pass by reference: " << endl;
    
        AcceptRef(ReturnRvalue()); //
    
    }

    只调用了一次拷贝构造函数。该调用发生在函数返回时生成匿名对象(函数返回值非常量,所以该匿名对象是右值)。函数参数直接引用该匿名对象,不产生拷贝。

    结论:函数参数为引用时可以避免一次数据的拷贝,节省性能开销。

     

    那如果把函数返回值也设为引用,是否可以避免生成匿名对象时产生的拷贝操作?

    我们将上面的代码稍做修改,将函数返回值修改为引用类型:

    #include <iostream>
    using namespace std;
    
    class Copyable {
    public:
        Copyable(){}
        Copyable(const Copyable &o) {
            cout << "Copied" << endl;
        }
    };
    
    Copyable tmp;
    
    Copyable& ReturnRvalue() {
            return tmp; //返回值类型为引用
    }
    
    void AcceptVal(Copyable a) {
    
    }
    
    void AcceptRef(const Copyable& a) {
    
    }
    
    int main() {
        cout << "pass by value: " << endl;
        AcceptVal(ReturnRvalue()); // 应该调用一次拷贝构造函数
    
        cout << "not recevie value: " << endl;
        ReturnRvalue();            //应该调用0次拷贝构造函数
    
        cout << "pass by reference: " << endl;
        AcceptRef(ReturnRvalue()); //应该调用0次拷贝构造函数
    }
    
    

    [root@k8s-80 test]# g++ test.cpp -o test -fno-elide-constructors

    [root@k8s-80 test]# ./test

    pass by value:

    Copied

    not recevie value:

    pass by reference:

    [root@k8s-80 test]#

    可以看到,当函数返回值为引用类型时,函数返回时不会产生拷贝操作。函数参数为引用类型时,也不会产生拷贝操作。

    展开全文
  • 题目:下面哪种情况下不会调用拷贝构造函数? A:当用类一个对象初始化该类另一个对象时 B:如果函数形参是类对象,调用函数时,进行形参和实参结合时 C:如果函数返回值是类对象,函数执行完成返回调用者...
  • C++中拷贝构造函数调用时机,通常有三种情况: 使用一个已经创建完毕对象来初始化一个新对象。 值传递方式给函数参数传值。 以值方式返回局部对象。 示例: class Person { public: Person() { cout &...
  • C++拷贝构造函数的调用时机

    千次阅读 2019-02-21 22:41:00
    一、拷贝构造函数调用的时机 ​ 当以拷贝的方式初始化对象时会调用拷贝构造函数,这里需要注意两个关键点,分别是以拷贝的方式和初始化对象 1. 初始化对象 初始化对象是指,为对象分配内存后第一次向内存中填充...
  • // 构造函数的分类及调用 #include <iostream> using namespace std; // 分类 // 按照参数进行分类 无参构造函数 (默认构造函数) 有参构造函数 // 按照类型进行分类 普通构造函数 拷贝构造函数 class ...
  • 复制构造函数的调用时机 //每日心得:独上高楼,望尽天涯路 //日期:12.14 //学习内容:复制构造函数的调用时机 //重点: //1、用已知变量 去复制 新定义变量 //2、值传递方式给函数参数传值 //3、以值方式...
  • 深入理解构造函数,拷贝构造函数的调用时机 #include "pch.h" #include <iostream> using namespace std; class A { public: int ia; A(){ cout << "默认构造函数" << endl; } A(int var) :ia...
  • 拷贝构造函数的调用时机 #include <iostream> using namespace std; class Person { public: Person() { cout << "Person默认构造函数。" << endl; } Person(int age) { m_Age = age; ...
  • 构造函数的调用: 括号法 显示法 隐式法 匿名对象创建 注意事项: 不要用 person p()调用无参构造,编译器会看成函数声明 不要用拷贝构造函数初始化 匿名对象,编译器会看成 对象实例化,如果这个...
  • 1.c++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕对象来初始化一个新对象 值传递方式给函数参数传值 以值方式返回局部对象 #include<iostream> using namespace std; class Person ...
  • 12.2.3 拷贝构造函数调用时机 只要在用一个类对象给另一个类对象赋值时,都会调用拷贝构造函数。 通常在以下两种情况调用: 作为函数参数时;... "person默认构造函数调用" << endl; } per
  • 关于构造函数和复制构造函数以及重载复制操作何时会被调用,我做了一个小例子来进行测试。#include <iostream>using namespace std;class AAA { public: AAA() { cout; } AAA(const AAA & a) { cout<<
  • C++拷贝构造函数的调用时机有4种: class Test{ private: int a; int b; public: Test(int _a, int _b) { a = _a; b = _b; } Test...
  • 了解构造函数调用时机后规避浅拷贝引发错误 前言 小白我最近学习了c++类作为函数参数或返回值,对这两种情况下类构造函数调用感到很迷惑,所以专门写这篇文章来理一理。如果有错误或不足之处,欢迎大家指出,...
  • "默认构造函数调用" << endl; } Person(int a) { cout << "有参构造函数调用" << endl; } Person(const Person& p) { cout << "拷贝构造函数调用" <&l
  • 关于复制构造函数的调用时机 1.当用类一个对象去初始化该类另一个对象时。 2.如果函数形参是类对象,调用函数时,进行形参和实参结合时(只有进行值传递时才会调用复制构造函数,引用传递时则不会调用) ...
  • C++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕对象来初始化一个新对象 值传递方式给函数参数传值 以值方式返回局部对象 示例: class Person { public: Person() { cout << "无参...
  • C++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕对象来初始化一个新对象 值传递方式给函数参数传值 以值方式返回局部对象 例如: class Person { public: Person() { cout << "无参...
  • #include<... "person 默认构造函数的调用" << endl; } person(int age) { cout << "person 有参构造函数的调用" << endl; m_age = age; } person(const person &p)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 720
精华内容 288
关键字:

构造函数调用的时机