C++提高:拷贝构造函数

简介: C++提高:拷贝构造函数

拷贝构造函数里能调用 private 成员变量吗?


解答:拷贝构造函数其时就是一个特殊的构造函数,操作的还是自己类的成员变量,所以不受 private 的限制。


一个类中可以存在多于一个的拷贝构造函数吗?


解答:类中可以存在超过一个拷贝构造函数。


例子:


class X {
public:
  X(const X&); // const 的拷贝构造 
  X(X&); // 非 const 的拷贝构造 
};


调用拷贝构造函数的情形


1. 一个对象作为函数参数,以值传递的方式传入函数体


例如下面案例



#include<iostream>
using namespace std;
class A {
public:
  A() {};//构造函数
  A(A&a)//复制构造函数
  {
    cout << "Copy constructer called" << endl;
  }
};
void Func(A a)//普通函数
{
}
int main()
{
  A b;
  Func(b);//此语句相当于是将b复制给Func(a)中的a,导致调用复制构造函数
  return 0;
}


2. 一个对象作为函数返回值,以值传递的方式从函数返回


例如下面案例,Func函数得到的是返回值a



#include<iostream>
using namespace std;
class A {
public:
  int v=0;
  A(int i) {
    v = i;
  };//构造函数
  A(A&a)//复制构造函数
  {
    cout << "Copy constructer called" << endl;
  }
};
A a(4);
A Func()//普通函数
{
  return a;
}
int main()
{
  cout << Func().v << endl;//此语句中的Func()是一个类A的对象,但是不是a,只是用a初始化。
  return 0;
}


3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化)


例如这样就会调用


Complex c1(c2);
Complex c1=c2;


这样就不会调用(这是浅复制)


Complex c1,c2;
c1=c2;
相关文章
|
5月前
|
存储 编译器 C++
【C++从0到王者】第三站:类和对象(中)拷贝构造函数
【C++从0到王者】第三站:类和对象(中)拷贝构造函数
29 0
|
5月前
|
存储 编译器 C++
C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)(上)
C++类与对象 - 3(拷贝构造函数和运算符重载)(超详细)
28 0
|
3天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
1月前
|
存储 编译器 C++
『C++成长记』拷贝构造函数
『C++成长记』拷贝构造函数
|
1月前
|
存储 编译器 C语言
【C++】类和对象之构造函数、析构函数、拷贝构造函数(二)
【C++】类和对象之构造函数、析构函数、拷贝构造函数(二)
|
2月前
|
存储 编译器 C++
【c++】拷贝构造函数
【c++】拷贝构造函数
【c++】拷贝构造函数
|
3月前
|
存储 安全 编译器
【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函数)
这一篇文章是上一篇的续集(这里有上篇链接)前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数。也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点——类和对象(拷贝构造函数、赋值运算符重载、const成员、取地址及const取地址操作符重载)。
60 0
|
3月前
|
C++
C++拷贝构造函数和运算符重载--5
C++拷贝构造函数和运算符重载--5
|
3月前
|
编译器 C++
C++拷贝构造函数和运算符重载--4
C++拷贝构造函数和运算符重载--4
|
3月前
|
C++
C++拷贝构造函数和运算符重载--3
C++拷贝构造函数和运算符重载--3