c++中构造的函数

leveldb源码中的Slice数据结构中的一段代码

Slice() : data_(""), size_(0) { }

  // Create a slice that refers to d[0,n-1].
Slice(const char* d, size_t n) : data_(d), size_(n) { }

  // Create a slice that refers to the contents of "s"
Slice(const std::string& s) : data_(s.data()), size_(s.size()) { }

  // Create a slice that refers to s[0,strlen(s)-1]
Slice(const char* s) : data_(s), size_(strlen(s)) { }

这个是Slice.h中的一段代码,在classSlice{}的开头,Slice类中有两个私有变量data_size_。根据构造函数的定义,Slice()是构造函数,根据以上可以看出,Slice可以接收自定义长度和非自定义长度的constchar*,string

上面的构造函数等价于


Slice(){
   data_=   ;
   size_=   ;
}

c++中初始化的方法。


问题一:

对于派生类的构造函数,我们应该怎么办呢?

测试用例:

/*************************************************************************

	> File Name: test4.cpp

	> Author: 1world0x00

	> Mail: 1world0x00@gmail.com

	> Created Time: 2015年03月15日 星期日 23时11分15秒

 ************************************************************************/

#include<iostream>

#include<string>

using namespace std;

class Employee{

    string first_name,family_name;

    short department;

    public:

      Employee(const string &n,int d):first_name(n),department(d){}

      string getFirst(){return first_name;}

      short  getDepart(){return department;}

     // string getN(){return n;}

};

class Manager:public Employee{

    short level;

    public:

      Manager(const string &n,int d,int lvl):Employee(n,d),level(lvl){}

      short getLevel(){return level;}

};

int main(){

    Employee Emp("123 i2",12);

    Manager Man("1234",123,12);

   // cout<<Emp.getFirst();

    //cout<<Emp.getDepart();

    cout<<Man.getLevel();

    return 0;

}

ManagerEmployee的派生类,在Employee类中有个构造函数,我们使用构造函数的时候也可以使用来给私有变量赋值。然而在Manager的构造函数中,我们要先用调用其基类的构造函数即Employee的构造函数。因为类对象的构造顺序是,基类-->成员--->派生类本身,销毁顺序相反。所以,我们要在派生类中构造基类,不然,派生类的存在是毫无意义的。

问题二:
对于类中有常量变量,即有
const类型的变量,我们应该写构造函数?

测试用例:

/*************************************************************************

	> File Name: test4.cpp

	> Author: 1world0x00

	> Mail: 1world0x00@gmail.com

	> Created Time: 2015年03月15日 星期日 23时11分15秒

 ************************************************************************/



#include<iostream>

#include<string>

using namespace std;

class A{

    const int x;

    int a;

    public:

    A(int a,const int b):x(b){}

    int getA(){return x;}



};

int main(){

    A test(2,3);

    cout<<test.getA();

    return 0;

}

在测试用例中,我们可知,我们只能使用方式来对常量变量进行构造,这是为什么呢?因为我们知道const便来那个是不可变更变量,我们不知道直接对其赋值。而当我们使用时,只调用了复制构造函数,而没有调用构造函数。复制构造函数的作用只是将各种变量copy,还不会改变其本身,所以const不会报错。



问题三:使用:”构造和使用函数体内赋值有什么不同?


使用构造只调用了复制构造函数

使用函数体内复制则调用了构造函数和复制构造函数。


对于类的数据成员的初始化,可以采用或者函数体内赋值两种方式。使用效率要比使用函数题内赋值效率高。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值