拷贝构造函数及其参数类型

转载 2012年03月28日 23:34:50

拷贝构造函数的参数类型必须是引用,而且通常情况下还是const的,但是const并不是严格必须的。

#include <iostream>

#include <string>

using namespace std;

 

class CClass

{

public:

         CClass() : a(1), b("Hello, world.")

         {

         }

 

         // 拷贝构造函数,参数中的const不是严格必须的,但引用符号是必须的

         CClass(const CClass& c_class)

         {

                   a = c_class.a;

                   b = c_class.b;

         }

 

         void setValues(int a, string b)

         {

                   this->a = a;

                   this->b = b;

         }

 

         void printValues()

         {

                   cout << "a = " << a << endl;

                   cout << "b = " << b << endl;

         }

private:

         int a;

         string b;

};

 

int main(void)

{

         CClass c;

         c.setValues(100, "Hello, boys!");

         CClass d(c);              // 此处调用拷贝构造函数

 

         d.printValues();

 

         return 0;

}

 

如果将拷贝构造函数中的引用符号去掉&,编译将无法通过,出错的信息如下:

非法的复制构造函数第一个参数不应是“CClass

没有可用的复制构造函数或复制构造函数声明为“explicit

 

原因:

如果拷贝构造函数中的参数不是一个引用,即形如CClass(const CClass c_class),那么就相当于采用了传值的方式(pass-by-value),而传值的方式会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。因此拷贝构造函数的参数必须是一个引用。

 

需要澄清的是,传指针其实也是传值,如果上面的拷贝构造函数写成CClass(const CClass* c_class),也是不行的。事实上,只有传引用不是传值外,其他所有的传递方式都是传值。

 

附带说明,在下面几种情况下会调用拷贝构造函数:

a.       显式或隐式地用同类型的一个对象来初始化另外一个对象。如上例中,用对象c初始化d

b.       作为实参(argument)传递给一个函数。如CClass(const CClass c_class)中,就会调用CClass的拷贝构造函数;

c.        在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数;

d.       初始化序列容器中的元素时。比如 vector<string> svec(5)string的缺省构造函数和拷贝构造函数都会被调用;

e.       用列表的方式初始化数组元素时。string a[] = {string(“hello”), string(“world”)}; 会调用string的拷贝构造函数。

 

如果在没有显式声明构造函数的情况下,编译器都会为一个类合成一个缺省的构造函数。如果在一个类中声明了一个构造函数,那么就会阻止编译器为该类合成缺省的构造函数。和构造函数不同的是,即便定义了其他构造函数(但没有定义拷贝构造函数),编译器总是会为我们合成一个拷贝构造函数。

 

如果想阻止拷贝构造函数发生作用,那么一个类,必须显式声明其拷贝构造函数,并且将其设为private 并且其实现体是空的。因为仅仅是private的话,友元函数或者友元类还是有机会调用到这个拷贝构造函数。

 

通常情况下,如果一个类实现了拷贝构造函数,那么这个类也需要实现缺省构造函数。

相关文章推荐

拷贝构造函数的参数类型必须是引用(转)

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。那么 拷贝构造函数的参数为什么必须使用引用类型? 原因:        如果拷贝构造函数中的...

拷贝构造函数及其参数类型

拷贝构造函数的参数类型必须是引用,而且通常情况下还是const的,但是const并不是严格必须的。 #include #include using namespace std;   ...

拷贝构造函数的参数类型必须是引用

转自:http://blog.csdn.net/hackbuteer1/article/details/6545882        在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(...

拷贝构造函数及其参数类型

拷贝构造函数的参数类型必须是引用,而且通常情况下还是const的,但是const并不是严格必须的。 #include  #include  using namespace std; cla...

拷贝构造函数的参数类型必须是引用

拷贝构造函数的参数类型必须是引用

拷贝构造函数的参数类型必须是引用

原文:http://blog.csdn.net/hackbuteer1/article/details/6545882

【C++】C++中拷贝构造函数的参数类型必须是引用

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你...

拷贝构造函数及其参数类型

原文:http://patmusing.blog.163.com/blog/static/1358349602010182232781/ 拷贝构造函数的参数类型必须是引用,而且通常情况下还是co...

拷贝构造函数的参数类型必须是引用

在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你...
  • jw903
  • jw903
  • 2014-08-20 12:00
  • 500

拷贝构造函数的参数为什么必须使用引用类型

转自:http://blog.csdn.net/tunsanty/article/details/4264738  在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)