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;
}
Manager是Employee的派生类,在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不会报错。
问题三:使用”:”构造和使用函数体内赋值有什么不同?
使用”:“构造只调用了复制构造函数
使用函数体内复制则调用了构造函数和复制构造函数。
对于类的数据成员的初始化,可以采用”:“或者函数体内赋值两种方式。使用”:“效率要比使用函数题内赋值效率高。