构造函数与析构函数
来源:互联网 发布:页面加载完成后执行js 编辑:程序博客网 时间:2024/05/21 19:51
构造函数与析构函数
浅拷贝:拷贝一赋值给另一个对象
深拷贝:指针地址重新开辟、再进行赋值
如果成员变量包含指针、一定完成深拷贝
深拷贝
避免自赋值 (if) 、释放旧空间、开辟新空间、赋值、返回*this
今天内容
构造函数:对创建的对象进行初始化。可重载。没有返回类型。返回的都是类的对象。
拷贝构造函数
析构函数
我们在类中定义了⼀一个构造函数,编译器不再提供默认构造函
数,这样在调用时可能出现错误,所以,这时我们也应该定义⼀一个默认构造函数;
拷贝构造函数:通过一个已经存在的对象来创建新对象(构造函数的参数是一个对象)Circle(const Circle &c)
编写过程:开辟空间、赋值 注意:拷贝构造函数的参数必须是一个引用(避免循环调用)
引用不会创建新对象,节省空间
**拷贝构造函数的调用情况
1.用一个对象初始化另一个对象 class Objcet(other_Objet);
class objcet=other xobjcet;//拷贝构造函数
class object; object=other object;//赋值运算符
2.函数参数以值传递的形式,实参赋值给形参,调用拷贝构造函数
void func(person p){…….}
func(object);
3.函数值返回形式返回一个对象,返回值会调用拷贝构造函数创建一个临时对象用来使用**
person function(){
person p;
return p;
} VC 测试
如果成员变量包含指针,源程原必须实现三个函数:拷贝构造,析构函数,赋值运算符重载
析构函数,先定义的变量后析构,后定义的变量先析构
构造函数和析构函数的调用
#include <iostream>using namespace std;class Person{ friend ostream& operator<<(ostream& out,const Person& p);public: Person(){ //this->name=new char[20]; this->name=NULL; } Person(char *_name,int _age){ this->name=new char[strlen(_name)+1]; strcpy(name,_name); age=_age; cout<<"普通构造函数"<<endl; } Person(Person &p){ this->name=new char[strlen( p.name)+1]; strcpy(this->name,p.name); this->age=p.age; cout<<"调用拷贝构造函数"<<endl; } ~ Person(); Person& operator=(const Person& p);private: char *name; int age;};Person::~ Person(){ if(this->name!=NULL) { delete [] name; name=NULL; }}ostream& operator<<(ostream& out,const Person& p){ out<<p.name<<endl; out<<p.age<<endl; out<<"______________________"<<endl; return out;}Person& Person:: operator=(const Person& p){ if(this!=&p){ if(this->name!=NULL) { delete [] this->name;} this->name=new char [strlen(p.name)+1]; strcpy(this->name,p.name); this->age=p.age; } return *this;}void func(Person p){}int main(int argc, const char * argv[]) { Person p1((char*)"shangguan",20);//普通构造函数调用 cout<<p1<<endl; Person p2=p1;//拷贝构造函数 cout<<p2<<endl; Person p3(p1);//调用拷贝构造函数 cout<<p3<<endl;// Person p4;// p4=p1;//调用普通构造函数// // cout<<p4<<endl;// p2=p1;// cout<<p1<<endl;// cout<<p2<<endl; func(p3); std::cout << "Hello, World!\n"; return 0;}
构造函数和类型转换:当构造函数只有一个人参数,可以做转换工作。
#include <iostream>using namespace std;class Person{public: Person (char *_name){ name=new char [strlen(_name)+1]; strcpy(name,_name); } char* getName()const{ return name; }private: char *name;};void print(const Person &p){ cout<<p.getName()<<endl; }int main(){ Person p1((char*)"sdfsa"); print(p1); print((char*)"asdsaf");//类型转换 Person p2="hello"; print(p2); Person array[]={(char*)"sdfsa”,(char*)"asdsaf”}//默认类型转换}
- 构造函数与析构函数
- 构造函数与析构函数
- c#构造函数与析构函数
- 构造函数与析构函数
- 构造函数与析构函数(整理)
- 构造函数与析构函数
- 构造函数与析构函数
- c#构造函数与析构函数
- 构造函数与析构函数研究
- 构造函数与析构函数(读书笔记)
- 构造函数与析构函数
- 构造函数与析构函数
- 构造函数与析构函数
- 构造函数与析构函数
- C++ 构造函数与析构函数
- 构造函数与析构函数
- 构造函数与析构函数
- 使用构造函数与析构函数
- 如何使用一个textview控件使字体出现两种颜色
- $.ajax()方法详解
- Android的基本问题及答案
- PHP判断一天打卡的第一个时间和最后的时间
- 【Android问题】Android导入一个工程时提示 Invalid project description的解决方法
- 构造函数与析构函数
- PowerDesigner入门教程
- 老司机谈APK瘦身套路-图片资源篇
- 读源码时,我们到底在读什么?
- HDOJ 5226 Tom and matrix
- 重建二叉树
- Hive 学习笔记 (二)
- 分页
- 多线程 - 定时任务及启动