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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值