C++构造函数、拷贝构造函数
2016-07-28 11:26
323 查看
构造函数
,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。(摘自百度百科 构造函数 )。
构造函数无返回值类型,函数名和类型相同。
拷贝构造函数传递参数为引用。
拷贝构造函数,一般不需要自己编写,系统默认的拷贝构造函数就能抗住了,但是有些情况需要在构造的时候开辟空间,这时候就需要拷贝构造函数了,如下代码是摘自 林锐 博士的 高质量C++编程指南 一文。
关于虚析构
虚析构一般伴随着多态而产生,多态主要方式就是用基类的指针或引用指向或引用派生类,而形成多态。
但是这样就会存在一个问题,当我们析构的时候,由于是基类的指针,就会调用的是基类的构造函数,从而造成派生内存溢出。为了解决这个问题,引入了虚析构的概念。将基类的构造函数声明为虚,从而使其在调用析构函数的时候能够准确的调用派生类的析构函数。
如下代码必须用到虚析构才能准确的析构派生类,并释放其占有内存。
,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。(摘自百度百科 构造函数 )。
class Base { public: Base(int var) : m_Var(var) { } private: int m_Var; };
构造函数无返回值类型,函数名和类型相同。
拷贝构造函数传递参数为引用。
1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 //拷贝构造函数 8 Base(Base &ref) : m_Var(ref.m_Var) 9 { 10 } 11 private: 12 int m_Var; 13 };
拷贝构造函数,一般不需要自己编写,系统默认的拷贝构造函数就能抗住了,但是有些情况需要在构造的时候开辟空间,这时候就需要拷贝构造函数了,如下代码是摘自 林锐 博士的 高质量C++编程指南 一文。
1 class String 2 { 3 public: 4 String(const char *str = NULL); // 普通构造函数 5 String(const String &other); // 拷贝构造函数 6 ~ String(void); // 析构函数 7 private: 8 char *m_data; // 用于保存字符串 9 }; 10 // String 的析构函数 11 String::~String(void) 12 { 13 delete [] m_data; 14 // 由于m_data 是内部数据类型,也可以写成 delete m_data; 15 } 16 17 // String 的普通构造函数 18 String::String(const char *str) 19 { 20 if(str==NULL) 21 { 22 m_data = new char[1]; // 若能加 NULL 判断则更好 23 *m_data = '\0'; 24 } 25 else 26 { 27 int length = strlen(str); 28 m_data = new char[length+1]; // 若能加 NULL 判断则更好 29 strcpy(m_data, str); 30 } 31 } 32 // 拷贝构造函数 33 String::String(const String &other) 34 { 35 int length = strlen(other.m_data); 36 m_data = new char[length+1]; // 若能加 NULL 判断则更好 37 strcpy(m_data, other.m_data); 38 }
关于虚析构
虚析构一般伴随着多态而产生,多态主要方式就是用基类的指针或引用指向或引用派生类,而形成多态。
但是这样就会存在一个问题,当我们析构的时候,由于是基类的指针,就会调用的是基类的构造函数,从而造成派生内存溢出。为了解决这个问题,引入了虚析构的概念。将基类的构造函数声明为虚,从而使其在调用析构函数的时候能够准确的调用派生类的析构函数。
如下代码必须用到虚析构才能准确的析构派生类,并释放其占有内存。
1 class Base 2 { 3 public: 4 Base(int b) : m_b(b) 5 { 6 } 7 //虚析构,使基类指针能准确的释放所指向的派生类里面的内容 8 virtual ~Base() 9 { 10 } 11 private: 12 int m_b; 13 }; 14 15 class Derived : public Base 16 { 17 public: 18 Derived(int b, char *pStr) : Base(b) 19 { 20 m_pStr = new char[strlen(pStr)+1]; 21 strcpy(m_pStr,pStr); 22 } 23 ~Derived() 24 { 25 delete m_pStr; 26 m_pStr = NULL; 27 } 28 private: 29 char *m_pStr; 30 }; 31 32 int main(void) 33 { 34 char *pStr = "abcdefg"; 35 Base *b = new Derived(1,pStr); 36 delete b; 37 38 return 0; 39 }
相关文章推荐
- C语言学习之——排序
- C++使用ODBC连接数据库时出现无法将SQLCHAR*转换为SQLWCHAR*
- C++ 迭代器介绍 [转摘]
- map双键-值对及特殊键值对
- C++类的大小
- C++类的大小
- C++ Primer 第三章 标准库类型vector+迭代器iterator 运算
- 深度探索C++对象模型——学习笔记3
- c语言描述的链队列的基本操作
- POJ3622 挑剔的美食家(重庆一中高2018级信息学竞赛测验5) 解题报告
- OC和C++混编 系统类NSObjCRuntime, NSZone等报错问题
- 文章标题
- 【NOIP2008普及组】排座椅
- 能让你成为更优秀程序员的10个C语言资源
- 能让你成为更优秀程序员的10个C语言资源
- 第二章 C++基础篇之最全面的C/C++编码规范总结
- C++学习笔记(一)
- C++虚函数、纯虚函数、虚基类
- C++函数库大全
- C++ STL--stack/queue 的使用方法