c++ 关于构造函数 和 复制构造函数
2014-09-04 20:23
246 查看
1 构造函数
在c++中构造函数是特殊的成员函数,只要创建了类的实例都要执行构造函数,构造函数的名称与类名相同,且没有返回值,可以没有形参,也可以有多个形参。
构造函数可以包含一个构造函数的初始化列表:
A::A(int a ):b(a),c(a)
构造函数的初始化次序为就是定义成员的次序,第一个成员首先被初始化,然后第二个,初始化测次序往往无关紧要,但如果一个成员是根据其他成员初始化的,就要考虑次序了。
2 复制构造函数
只有一个形参,并且该形参是对本类型对象的引用,这样的构造函数时复制构造函数。
复制构造函数可用于:
3 对象作为函数的返回值
4 初始化顺序容器的元素
若一个类需要完全禁止复制,类必须显式声明其复制构造函数为private
3 关于构造函数和复制构造函数的调用
先看如下代码
运行的结果为:
构造函数调用
复制构造函数调用
析构函数调用
M:10
N:5
析构函数调用
对比
构造函数调用
M:10
N:10
析构函数调用
因在func3() 中返回的是指针,复制的是指针的指向,因此不会调用复制构造函数,C++ 中 new出的对象都会调用构造函数,不会自动调用析构函数析构,需手动的delete该对象才会析构
对比
结果:
构造函数调用
构造函数调用
复制运算符重载
复制构造函数调用
析构函数调用
析构函数调用
析构函数调用
在func3()中会调用一此构造函数,在People *w = new People 中调用构造函数,在*w = *p中,调用赋值运算符重载,又因在赋值运算符重载中,返回*this,固会调用复制构造函数和析构函数,delete p和delete w调用两次析构函数
在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调用两次析构函数
相关文章推荐
- 关于C++中构造函数的说明
- 关于C++的构造函数
- 关于C++ 构造函数的那点小事
- C++:关于构造函数
- C++:关于构造函数
- [原创]关于C++的构造函数, 复制构造函数 和 operator =
- 一道关于C++ 的面试题目(继承、构造函数以及析构函数)
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- 关于C++中构造函数的调用顺序
- 【c++基础】关于继承关系中构造函数的粗略理解
- 关于C++中构造函数的说明
- C++ 关于构造函数
- 关于C++的构造函数的几点注意
- c++ 关于类和构造函数
- 关于C++ 构造函数调用构造函数的问题
- 关于C++构造函数的FAQ
- 第二章构造函数语义学——关于构造函数和复制构造函数
- 关于C++的构造函数, 复制构造函数 和 operator =
- 【C\C++学习】之十八、C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)
- C++在单继承、多继承、虚继承时,复制构造函数。赋值构造函数、析构函数的执行顺序