c++ 关于构造函数 和 复制构造函数
来源:互联网 发布:淘宝刷单权重 编辑:程序博客网 时间:2024/06/05 15:53
1 构造函数
在c++中构造函数是特殊的成员函数,只要创建了类的实例都要执行构造函数,构造函数的名称与类名相同,且没有返回值,可以没有形参,也可以有多个形参。
构造函数可以包含一个构造函数的初始化列表:
A::A(int a ):b(a),c(a)
构造函数的初始化次序为就是定义成员的次序,第一个成员首先被初始化,然后第二个,初始化测次序往往无关紧要,但如果一个成员是根据其他成员初始化的,就要考虑次序了。
2 复制构造函数
只有一个形参,并且该形参是对本类型对象的引用,这样的构造函数时复制构造函数。
复制构造函数可用于:
1 根据另一个同类型的对象显式或隐式初始化一个对象
2 复制一个对象 将他作为一个实参传给一个函数
3 对象作为函数的返回值
4 初始化顺序容器的元素
若一个类需要完全禁止复制,类必须显式声明其复制构造函数为private
3 关于构造函数和复制构造函数的调用
先看如下代码
class People{private:int m;int n;public:People(){cout<<"构造函数调用"<<endl;} ~People() { cout<<"析构函数调用"<<endl; } People(const People&s) { m = s.m; n = s.n; cout<<"复制构造函数调用"<<endl; } People operator =(const People&w) { m = w.m; n = w.n; cout<<"复制运算符重载调用"<<endl; return *this; }void SetM(int m){this->m = m;}void SetN(int n){this->n = n;}void show(){cout<<"M:"<<m<<endl;cout<<"N:"<<n<<endl;}};People func3(){People people;//调用构造函数people.SetM(10);people.SetN(5);return people;//产生临时变量,调用复制构造函数,和析构函数}<pre name="code" class="cpp">void main(){ People p = func3(); p.show();
//运行结束后调用析构函数}运行的结果为:
构造函数调用
复制构造函数调用
析构函数调用
M:10
N:5
析构函数调用
对比
<span style="color:#666666;">class People{private:int m;int n;public:People(){cout<<"构造函数调用"<<endl;} ~People() { cout<<"析构函数调用"<<endl; } People(const People&s) { m = s.m; n = s.n; cout<<"复制构造函数调用"<<endl; } People operator =(const People&w) { m = w.m; n = w.n; cout<<"复制运算符重载调用"<<endl; return *this; }void SetM(int m){this->m = m;}void SetN(int n){this->n = n;}void show(){cout<<"M:"<<m<<endl;cout<<"N:"<<n<<endl;}};People* func3(){People *p = new People();//调用构造函数p->SetM(10); p->SetN(10);return p;}int main(){People *p = func3();p->show(); delete p;//调用析构函数}</span><span style="color:#ff6666;"></span>运行结果为:
构造函数调用
M:10
N:10
析构函数调用
因在func3() 中返回的是指针,复制的是指针的指向,因此不会调用复制构造函数,C++ 中 new出的对象都会调用构造函数,不会自动调用析构函数析构,需手动的delete该对象才会析构
对比
<span style="color:#666666;">class People{private:int m;int n;public:People(){cout<<"构造函数调用"<<endl;} ~People() { cout<<"析构函数调用"<<endl; } People(const People&s) { m = s.m; n = s.n; cout<<"复制构造函数调用"<<endl; } People operator =(const People&w) { m = w.m; n = w.n; cout<<"复制运算符重载调用"<<endl; return *this; }void SetM(int m){this->m = m;}void SetN(int n){this->n = n;}void show(){cout<<"M:"<<m<<endl;cout<<"N:"<<n<<endl;}};People* func3(){People *p = new People();//调用构造函数p->SetM(10); p->SetN(10);return p;}int main(){ People *p = func3(); People *w = new People; *w = *p; delete p; delete w;}</span>
结果:
构造函数调用
构造函数调用
复制运算符重载
复制构造函数调用
析构函数调用
析构函数调用
析构函数调用
在func3()中会调用一此构造函数,在People *w = new People 中调用构造函数,在*w = *p中,调用赋值运算符重载,又因在赋值运算符重载中,返回*this,固会调用复制构造函数和析构函数,delete p和delete w调用两次析构函数
0 0
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- C++: 复制构造函数
- c++ 关于构造函数 和 复制构造函数
- 关于构造函数与复制构造函数
- 【C++】This指针和复制构造函数
- 构造函数和复制构造函数
- 复制构造函数和赋值构造函数
- 复制构造函数和赋值构造函数
- 复制构造函数和赋值构造函数
- 复制构造函数和赋值构造函数
- C++:关于构造函数
- 构造函数 复制构造函数
- C/C++——构造函数、复制构造函数和析构函数的执行时刻
- C++_浅层复制构造函数和深层复制构造函数
- Openstack+Hadoop详细操作步骤
- VC创建线程
- iOS拨打电话并且能返回当前应用的方法
- linux软件中断机制
- 二叉查找树Java实现
- c++ 关于构造函数 和 复制构造函数
- 隐藏文件夹
- 学习网络基础ccna
- 周鸿弈自述-我的互联网方法论 读后感
- 计算四则表达式(中缀式转后缀式,然后计算结果)
- 读懂Spring核心系列3(自动装配属性)
- 数学建模高级方法(三):灰色关联分析,复相关系数
- poj 1679 The Unique MST
- yum 常用参数