精华内容
下载资源
问答
  • C++——复制构造函数的形参为什么要是const引用

    千次阅读 多人点赞 2017-04-24 14:17:41
    //复制构造函数一开始想到的原型 CBox cigar; CBox myBox(cigar); //如果编写这样一条语句 //那么将生成这样一条对复制构造函数的调用CBox::CBox(cigar);因为实参是通过按值传递机制传递的。在可以传递对象cigar之前...

    1.首先来说重要的一点, 为什么要是引用
    如对于

    CBox(CBox initB);//复制构造函数一开始想到的原型
    CBox cigar;
    CBox myBox(cigar); //如果编写这样一条语句
    //那么将生成这样一条对复制构造函数的调用CBox::CBox(cigar);

    因为实参是通过按值传递机制传递的。在可以传递对象cigar之前,编译器需要安排创建该对象的副本。因此,编译器为了处理复制构造函数的这条调用语句,需要调用复制构造函数来创建实参的副本。但是,由于是按值传递,第二次调用同样需要创建实参的副本,因此还得调用复制构造函数,就这样持续不休。最终得到的是对复制构造函数的无穷调用。(其实就是创建副本也是需要调用复制构造函数的
    所以解决办法先是要将形参改为引用形参:

    CBox (CBox &initB);

    2.再来说为什么要用const
    其实,这里,如果不去改变实参的值的话,不加const的效果和加const的效果是一样的,而且不加const编译器也不会报错,因为函数的形参是引用,则调用函数时不需要复制实参,函数是直接访问调用函数中的实参变量的。但是为了整个程序的安全,还是加上const,防止对实参的意外修改~所以这里再将复制构造函数原型改为以下这种形式:

    CBox (const CBox &initB);

    测试程序:

    #include<iostream>  
    using namespace std;  
    
    class Test  
    {  
    public:  
       Test(const Test &t) { //如果这里为Test(t);则会报错
       /*使用t来拷贝数据成员*/ 
       }  
       Test() {
        /*初始化数据成员*/ 
       }  
    };  
    
    Test fun()  
    {  
        cout << "fun() Called\n";  
        Test t;  
        return t;  
    }  
    
    int main()  
    {  
        Test t1;  
        Test t2 = fun();  
        return 0;  
    }  
    展开全文
  • 如果我们的拷贝构造函数的参数不是引用,那么拷贝构造函数又会重复调用拷贝构造函数,就这样永远的递归调用下去了。   所以, 拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的。 为...
    #include <iostream>
    
    using namespace std;
    
    class A{
    public:
        A(){
            cout<<"default construct"<<endl;
        }
    
        ~A(){
            cout<<"destructed"<<endl;
        }
    
        A(int i):m_data(i){
            cout<<"constructed by parameter" << m_data <<endl;
        }
    
        A(const A &a){
            cout<< "copy constructor" <<endl;
            m_data = a.m_data;
        }
    
        A& operator =(const A &a){
            cout<<"copy assignment operator"<<endl;
    
            if(this==&a){
                return *this;
            }
    
            this->m_data = a.m_data;
            return *this;
        }
    
    private:
        int m_data;
    };
    
    A function(A a){
        return a;
    }
    
    
    int main(int argc, char *argv[])
    {
        A a1 = function(10);
        cout << "----------------------" << endl;
        A a2 = function(a1);
        cout << "----------------------" << endl;
        A a3;
        a3 = a2;
        cout << "----------------------" << endl;
        return 0;
    }
    


    为什么要用引用?

    【错误答案】个人第一反应:为了减少一次内存拷贝。

    【正确答案】在执行function(a1)时,其实会调用拷贝构造函数在函数内创建一个临时对象。如果我们的拷贝构造函数的参数不是引用,那么拷贝构造函数又会重复调用拷贝构造函数,就这样永远的递归调用下去了。

     所以, 拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的。


    为什么要用const?

    【正确答案】加上const,防止对引用类型参数值的意外修改。

    展开全文
  • 在函数中自动调用复制构造函数 #include #include #include using namespace std; class A { public: A(string name):_name(name) { cout << 类名为: << _name << ,调用构造函数,构造对象地址...
  • 一般来讲出现这个错误时,是因为复制构造函数的参数没有加const,加上就好了

    一般来讲出现这个错误时,是因为复制构造函数的参数没有加const,加上就好了

    展开全文
  • 先从一个小测试开始 #include<iostream> using namespace std; class CExample { ... CExample(int x) : m_nTest(x) //带参数构造函数 { cout << "constructor with argumen...

    先从一个小测试开始

    #include<iostream>
    using namespace std;
     
    class CExample
    {
    private:
    	int m_nTest;
     
    public:
    	CExample(int x) : m_nTest(x)      //带参数构造函数
    	{ 
    		cout << "constructor with argument"<<endl;
    	}
     
    	// 拷贝构造函数,参数中的const不是严格必须的,但引用符号是必须的
    	CExample(const CExample & ex)     //拷贝构造函数
    	{
    		m_nTest = ex.m_nTest;
    		cout << "copy constructor"<<endl;
    	}
     
    	CExample& operator = (const CExample &ex)   //赋值函数(赋值运算符重载)
    	{	
    		cout << "assignment operator"<<endl;
    		m_nTest = ex.m_nTest;
    		return *this;
    	}
     
    	void myTestFunc(CExample ex)
    	{
    	}
    };
     
    int main(void)
    {
    	CExample aaa(2);
    	CExample bbb(3);
    	bbb = aaa;
    	CExample ccc = aaa;
    	bbb.myTestFunc(aaa);
     
    	return 0;	
    
    }

    运行结果为:

    
    constructor with argument        // CExample aaa(2);
    constructor with argument        // CExample bbb(3);
    assignment operator              // bbb = aaa;
    copy constructor                 // CExample ccc = aaa;
    copy constructor                 //  bbb.myTestFunc(aaa)
    

    如果你能一眼看出就是这个结果的话, 恭喜你,可以站起来扭扭屁股,不用再往下看了。

    如果你的结果和输出结果有误差, 那拜托你谦虚的看完。

    第一个输出: constructor with argument      // CExample aaa(2);

    如果你不理解的话, 找个人把你拖出去痛打一顿,然后嘴里还喊着“我是二师兄,我是二师兄.......”

    第二个输出:constructor with argument     // CExample bbb(3);

    分析同第一个

    第三个输出: assignment operator                // bbb = aaa;

    第四个输出: copy constructor                      // CExample ccc = aaa;

    这两个得放到一块说。 肯定会有人问为什么两个不一致。原因是, bbb对象已经实例化了,不需要构造,此时只是将aaa赋值给bbb,只会调用赋值函数,就这么简单,还不懂的话,撞墙去! 但是ccc还没有实例化,因此调用的是拷贝构造函数,构造出ccc,而不是赋值函数,还不懂的话,我撞墙去!!

     

    第五个输出: copy constructor                      //  bbb.myTestFunc(aaa);

    实际上是aaa作为参数传递给bbb.myTestFunc(CExample ex), 即CExample ex = aaa;和第四个一致的, 所以还是拷贝构造函数,而不是赋值函数, 如果仍然不懂, 我的头刚才已经流血了,不要再让我撞了,你就自己使劲的再装一次吧。

    通过这个例子, 我们来分析一下为什么拷贝构造函数的参数只能使用引用类型。

    看第四个输出: copy constructor                      // CExample ccc = aaa;

    构造ccc,实质上是ccc.CExample(aaa); 我们假如拷贝构造函数参数不是引用类型的话, 那么将使得 ccc.CExample(aaa)变成aaa传值给ccc.CExample(CExample ex),即CExample ex = aaa,因为 ex 没有被初始化, 所以 CExample ex = aaa 继续调用拷贝构造函数,接下来的是构造ex,也就是 ex.CExample(aaa),必然又会有aaa传给CExample(CExample ex), 即 CExample ex = aaa;那么又会触发拷贝构造函数,就这下永远的递归下去。

    所以绕了那么大的弯子,就是想说明拷贝构造函数的参数使用引用类型不是为了减少一次内存拷贝, 而是避免拷贝构造函数无限制的递归下去。
     

    转载自:https://blog.csdn.net/hackbuteer1/article/details/6545882 

     

    因此:

    一、为何要用引用:

    由上节的第五个输出分析可知,在执行bbb.myTestFunc(aaa);时,其实会调用拷贝构造函数。如果我们的拷贝构造函数的参数不是引用,那么在bbb.myTestFunc(aaa);时,调用CExample ex = aaa;,又因为ex之前没有被创建,所以又需要调用拷贝构造函数,故而又执行CExample ex = aaa;,就这样永远的递归调用下去了。

      所以, 拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的。

    二、为何要要用const

    如果在函数中不会改变引用类型参数的值,加不加const的效果是一样的。而且不加const,编译器也不会报错。但是为了整个程序的安全,还是加上const,防止对引用类型参数值的意外修改。(提示这是一个输入参数)

    展开全文
  • 下例中,复制构造函数如果不加const会出错,error C2558: class 'Asdf' : no copy constructor available or copy constructor is declared 'explicit'。 (1)我传的asd1不是个临时对象,为什么需要const? (2)...
  • C++类用三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。  复制...
  • 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义; 2.复制构造函数和重载赋值操作符的调用时机; 3.复制构造函数和重载赋值操作符的实现要点; 4....
  • 1、有关复制构造函数相关点,下面这篇博客解释的很清楚。 http://blog.csdn.net/lwbeyond/article/details/6202256/ 2、有关C++ const的相关知识点下面博客有比较全面的总结 ...
  • 在C++中,只有单个形参,而且该类型是对本类类型的引用(常用const修饰),这样的构造函数称为复制构造函数。  复制构造函数既可以自己定义又可以像默认构造函数一样被编译器隐式调用。但大多数时候,特别是类中...
  • 复制构造函数

    千次阅读 多人点赞 2018-09-03 11:11:35
    复制构造函数是一种特殊构造函数,在生成一个实例时,一般会同时生成一个默认的复制构造函数复制构造函数完成一些基于同一类的其他对象的构建及初始化工作。 特点 复制构造函数名与类名同名,因为它是一种...
  • 什么是复制构造函数复制构造函数是一个成员函数,它使用同一个类的另一个对象初始化一个对象。函数原型如下: ClassName(const ClassName &old_obj); 下面是一个复制构造函数的简单示例: #include <...
  • map使用std::map, CArray,int> > 错误, 解决: 重写CArray, 重载构造函数并加const 添加操作 operator =
  • C++ 复制构造函数

    2020-03-19 12:47:07
    1. 复制构造函数定义 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用,作用是用一个已存在的对象去初始化同类型的新对象。 class 类名{ public: 类名(形参); //构造函数 类名(const 类名 & ...
  • 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“Sample” 1>已完成生成项目“vslabcpp.vcxproj”的操作 - 失败。 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =====...
  • #include &...class CExample{public: CExample(int x) :m_nTest(x) //带参数构造函数 { cout&lt;&lt; "constructor with argument."&lt;&lt;endl; } CExample(const C...
  • C++中类的构造函数与复制构造函数

    千次阅读 2017-04-27 10:52:42
    在网络上有朋友提到“主要原因在于编译器的优化,当复制构造函数是public时,编译器就会根据这个特性来对代码进行优化。当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,此时就会通过...
  • c++ 构造函数详解

    万次阅读 多人点赞 2019-05-31 17:20:58
    c++构造函数详解。(构造函数的分类、拷贝构造函数
  • #include <iostream> using namespace std; class CExample ... CExample(int x) :m_nTest(x) //带参数构造函数 { cout<< "constructor with argument."<<endl; } CExamp...
  • 复制构造函数重载

    千次阅读 2019-12-21 13:33:35
    以下代码编译时要加:-fno-elide-constructors 来关闭编译器优化,否则可能看不到复制构造函数的调用。 #include <iostream> using std::cout; using std::endl; class A { public: A() = default; A(A&...
  • 类的赋值构造函数和复制构造函数

    千次阅读 2016-10-31 22:41:49
    C++的初学者经常会对复制构造函数一知半解,我曾经对复制构造函数和赋值函数就很是迷茫。闲来无事,整理一下,一个对象的赋值构造函数和赋值构造函数。整体的说一下,复制构造函数和赋值构造函数的相同点是: 赋值...
  • 构造函数const关键字

    千次阅读 2016-06-24 19:11:00
    C++中const主要存在的三个位置 const int func(const int a) const 1)const 返回值:修饰返回值是一个常量(只读,不能更改) ... 3)函数末尾的const:用于修饰成员函数函数体内不能修改成员变量的值)
  • C++拷贝构造函数(复制构造函数

    千次阅读 2018-12-22 14:03:33
    复制构造函数是构造函数的一种特殊情况。因为类的对象包含各种成员变量,在发生拷贝时不能和普通对象一样来拷贝,所以我们需要使用拷贝构造函数来进行对象拷贝。拷贝构造函数只有一个参数,参数类型是本类的引用。 ...
  • 错误提示 error: C2558: struct“my_info”: 没有可用的复制构造函数复制构造函数声明为“explicit” 错误原因 复制构造函数的参数必须为常引用。 解决方案 复制构造函数的参数加const修饰符。 ...
  • class class_base { int* pt; public: ...//复制构造函数 virtual void show_info(); virtual ~class_base();//析构函数 };举例所用的类class_base如上面所示,具体的定义下面会给出。如果类的数据
  • C++ 赋值构造函数 复制构造函数

    千次阅读 2018-08-25 15:29:11
    默认构造函数 编译器提供一个不接受任何参数,也不执行任何操作的构造函数,称之为默认构造函数 这是因为创造对象的时候总会调用默认构造函数 Klunk::Klunk() {} //定义 Klunk lunk; //声明 使用默认构造函数 ...
  • C++ 复制构造函数与函数返回对象

    千次阅读 2018-08-26 12:05:05
    C++ 复制构造函数与函数返回对象 函数返回内部局部对象,例如 A fun1() { A a(20); // 调用自定义构造函数,构造a对象 return a; } 函数调用时,自动调用复制构造函数,赋值给左端对象.例如: // 调用...
  • C++ primer的习题,被复制构造函数和赋值符的区别弄晕了。简单地说,有一道题目如下描述: class t1; class t2 = t1; 我先看见有一个等号,以为就是赋值符来做的,其实并不是这样的。做一个实验好了: [cpp]...
  • 一、深拷贝和浅拷贝 ...这个默认的拷贝构造函数采用的是“位拷贝”(浅拷贝),而非“值拷贝”(深拷贝)的方式,如果类中含有指针变量,默认的拷贝构造函数必定出错。 浅拷贝:只是对指针的拷贝,拷贝后两个

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,877
精华内容 35,950
关键字:

复制构造函数const