您的位置:首页 > 编程语言 > C语言/C++

C++构造函数、拷贝构造函数

2016-07-28 11:26 323 查看
构造函数
,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: