27.c/c++程序员面试宝典-复制构造函数
2015-11-23 09:48
405 查看
27.c/c++程序员面试宝典-复制构造函数
c++中对象的复制就如同“克隆”,使用一个已有的对象快速地复制出多个完全相同的对象。在c++中,类除了提供默认构造函数和析构函数外,编译器还提供一个默认复制构造函数,每当创建对象的复制时,都将调用复制构造函数。
面试题112 什么是深复制与浅复制***
分析:浅复制又称为浅拷贝,指的是在对象复制时,只是对对象中的数据成员进行简单的赋值,默认复制构造函数执行的也是浅复制。浅复制的示例代码如下:
#include <iostream>
using namespace std;
class Test
{
public:
Test(int temp)
{p1=temp;}
Test(Test &c_t) //自定义的拷贝构造函数
{
cout<<"进入copy构造函数"<<endl;
p1=c_t.p1; //复制过程的核心语句
}
public:
int p1;
};
void main()
{
Test a(99);
Test b=a;
cout<<b.p1;
cin.get();
}
深复制又称为深拷贝,对于对象中的动态成员,就不仅仅是简单的赋值了,而是重新动态分配空间。深复制的示例代码如下:
class Rect
{
public:
Rect() //构造函数,p指向堆中分配的空间
{p =new int(100);}
Rect(const Rect &r)
{
width=r.width;
height=r.height;
p=new int; //为新对象重新动态分配空间
*p =*(r.p);
}
~Rect() //析构函数,释放动态分配的空间
{
if(p!=NULL)
{delete p;}
}
private:
int width;
int height;
int *p;
};
上面代码中的rect1的p和rect2的p各自指向一段内存空间,但是它们指向的空间具有相同的内容。
【答案】如果一个类拥有资源,当这个类的对象发生复制过程的时候,这个过程就可以叫做深复制,如果对象存在资源但在复制过程中并未复制资源就是浅复制。
面试题113 什么是复制构造函数**
分析:复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建以及初始化。它存在唯一的一个参数是不可变的。这个函数经常用在函数调用期间于用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。一般它使用常量方式调用,另外,它也可以用非常量方式调用。
在c++中,有3种对象需要复制的情况,这时,复制构造函数将会被调用,具体如下:
第一:一个对象以值传递的方式传入函数体;
第二:一个对象以值传递的方式从函数返回;
第三:一个对象需要通过另外一个对象进行初始化。如果在前两种情况下不使用复制构造函数的时候,就会导致一个指针指向已经被删除的内存空间。
对于第三种情况来说,初始化和赋值的不同含义是构造函数调用的原因。事实上,复制构造函数是由普通构造函数和赋值操作符共同实现的。复制构造函数的示例代码如下:
#include<iostream>
using namespace std;
class A
{
private:
int x,y;
public:
A(int ix, int iy)
{
x=ix,y=iy;
cout<<"构造函数调用"<<endl;
}
A()
{cout<<"无参数构造函数调用"<<endl;}
A(A &a)
{
x=a.x;
y=y.y;
cout<<"复制构造函数调用"<<endl;
}
}
int main()
{
A a(2,3);
A b(4,5);
a=b;
A c=b; //调用复制构造函数
cout<<"b 地址="<<&b<<"c 地址="<<&c<<endl;
cout<<"第二种情况"<<endl;
A aa;
aa=A(3,4); //复制构造函数调用
cout<<"第三种情况"<<endl;
A a2=A(a); //复制构造函数调用
return 0;
}
【答案】有3种情况会使用复制构造函数:
1)一个对象以值传递的方式传入函数体。
2)一个对象以值传递的方式从函数返回。
3)一个对象需要通过另外一个对象进行初始化。
c++中对象的复制就如同“克隆”,使用一个已有的对象快速地复制出多个完全相同的对象。在c++中,类除了提供默认构造函数和析构函数外,编译器还提供一个默认复制构造函数,每当创建对象的复制时,都将调用复制构造函数。
面试题112 什么是深复制与浅复制***
分析:浅复制又称为浅拷贝,指的是在对象复制时,只是对对象中的数据成员进行简单的赋值,默认复制构造函数执行的也是浅复制。浅复制的示例代码如下:
#include <iostream>
using namespace std;
class Test
{
public:
Test(int temp)
{p1=temp;}
Test(Test &c_t) //自定义的拷贝构造函数
{
cout<<"进入copy构造函数"<<endl;
p1=c_t.p1; //复制过程的核心语句
}
public:
int p1;
};
void main()
{
Test a(99);
Test b=a;
cout<<b.p1;
cin.get();
}
深复制又称为深拷贝,对于对象中的动态成员,就不仅仅是简单的赋值了,而是重新动态分配空间。深复制的示例代码如下:
class Rect
{
public:
Rect() //构造函数,p指向堆中分配的空间
{p =new int(100);}
Rect(const Rect &r)
{
width=r.width;
height=r.height;
p=new int; //为新对象重新动态分配空间
*p =*(r.p);
}
~Rect() //析构函数,释放动态分配的空间
{
if(p!=NULL)
{delete p;}
}
private:
int width;
int height;
int *p;
};
上面代码中的rect1的p和rect2的p各自指向一段内存空间,但是它们指向的空间具有相同的内容。
【答案】如果一个类拥有资源,当这个类的对象发生复制过程的时候,这个过程就可以叫做深复制,如果对象存在资源但在复制过程中并未复制资源就是浅复制。
面试题113 什么是复制构造函数**
分析:复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建以及初始化。它存在唯一的一个参数是不可变的。这个函数经常用在函数调用期间于用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。一般它使用常量方式调用,另外,它也可以用非常量方式调用。
在c++中,有3种对象需要复制的情况,这时,复制构造函数将会被调用,具体如下:
第一:一个对象以值传递的方式传入函数体;
第二:一个对象以值传递的方式从函数返回;
第三:一个对象需要通过另外一个对象进行初始化。如果在前两种情况下不使用复制构造函数的时候,就会导致一个指针指向已经被删除的内存空间。
对于第三种情况来说,初始化和赋值的不同含义是构造函数调用的原因。事实上,复制构造函数是由普通构造函数和赋值操作符共同实现的。复制构造函数的示例代码如下:
#include<iostream>
using namespace std;
class A
{
private:
int x,y;
public:
A(int ix, int iy)
{
x=ix,y=iy;
cout<<"构造函数调用"<<endl;
}
A()
{cout<<"无参数构造函数调用"<<endl;}
A(A &a)
{
x=a.x;
y=y.y;
cout<<"复制构造函数调用"<<endl;
}
}
int main()
{
A a(2,3);
A b(4,5);
a=b;
A c=b; //调用复制构造函数
cout<<"b 地址="<<&b<<"c 地址="<<&c<<endl;
cout<<"第二种情况"<<endl;
A aa;
aa=A(3,4); //复制构造函数调用
cout<<"第三种情况"<<endl;
A a2=A(a); //复制构造函数调用
return 0;
}
【答案】有3种情况会使用复制构造函数:
1)一个对象以值传递的方式传入函数体。
2)一个对象以值传递的方式从函数返回。
3)一个对象需要通过另外一个对象进行初始化。
相关文章推荐
- C++中的全局namespace
- C++标准库::拾遗
- C++的运算符重载
- 《C++ Primer 5th》读书笔记4---文本查询程序
- C++递归之汉诺塔
- glm 中 数据类型 与 原始数据(c++ 数组)之间的转换
- Effective C++ 笔记 第六部分 继承与面对对象设计
- C++ 三种常见的管理类中指针成员的方法
- 栈 (Stack) 的C++实现(链表方法)
- 017--VS2013 C++ 排序贴图
- 016--VS2013 C++ 透明动画
- 015--VS2013 C++ 游戏循环的另一种方式
- 014--VS2013 C++ c++定时动画
- C++写的一个链表程序
- [C++/STL] string字符串关于copy函数的C4996错误
- C++编译运行多个文件形式的程序
- 常见排序算法的C语言实现之堆排序
- Basic Calculator II | LeetCode 48ms C++ Solution
- 在C++中使用GOLANG的协程
- C++迭代开发流程的理解