一、构造函数
class NoName {
public:
NoName();
explicit NoName(const char *);
NoName(const char *, int);
NoName(const char *, int, double);
NoName(const NoName&);
virtual ~NoName();
protected:
char *pstr;
int ival;
double dval;
private :
void initNoName(const char *ps);
};
void NoName::initNoName(const char *ps) {
if (ps) {
pstr = new char[strlen(ps)+1];
strcpy(pstr, ps);
} else {
pstr = new char[1];
*pstr = '\0';
}
}
NoName::NoName() {
pstr = new char[1];
*pstr = '\0';
ival = 0;
dval = 0;
}
NoName::NoName(const char *ps) {
initNoName(ps);
ival = 0;
dval = 0;
}
NoName::NoName(const char *ps, int i) {
initNoName(ps);
ival = i;
dval = 0;
}
NoName::NoName(const char *ps, int i, double d) {
initNoName(ps);
ival = i;
dval = d;
}
NoName::NoName(const NoName &rhs) {
initNoName(rhs.pstr);
ival = rhs.ival;
dval = rhs.dval;
}
NoName::~NoName() {
delete pstr;
pstr = 0;
}
使用带缺省值的构造函数:
class NoName {
public:
NoName(const char *ps=0, int i =0, double d=0);
NoName(const NoName&);
virtual ~NoName();
protected:
char *pstr;
int ival;
double dval;
private :
void initNoName(const char *ps);
};
void NoName::initNoName(const char *ps) {
if (ps) {
pstr = new char[strlen(ps)+1];
strcpy(pstr, ps);
} else {
pstr = new char[1];
*pstr = '\0';
}
}
NoName::NoName(const char *ps, int i, double d) {
initNoName(ps);
ival = i;
dval = d;
}
NoName::NoName(const NoName &rhs) {
initNoName(rhs.pstr);
ival = rhs.ival;
dval = rhs.dval;
}
NoName::~NoName() {
if (pstr) {
delete pstr;
pstr = 0;
}
}
二、初始化
// C++的数据成员中,只允许const static的数据成员在定义时被初始化
/*
class Test {
private:
//int i = 0; // error
//const int i = 0; // error
//static int i = 0; // error
const static int i = 0; // ok
};
*/
/*
class MyMember1 {
public :
MyMember1(){} // 有默认构造函数
};
class MyMember2 {
public :
MyMember2(int i){}; // 没有默认构造器
};
// c++ 类的初始化分为隐式初始化、显示初始化、和计算部分(构造函数体内的所有语句)
// 隐式初始化包括: 1.调用所有父类的默认构造器 2.调用所有类成员的默认构造器
// 显示初始化,通过成员列表进行的初始化(推荐这样做)
// 计算部分,即位于构造器内部的所有语句
// 初始化顺序按照成员声明的顺序,而非初始化列表中的顺序。所以为了方便理解,我们要以成员声明的顺序去进行初始化
class MyClass {
public:
MyClass(){} // 没有成员列表初始化
private :
MyMember1 m1; // ok。能通过
MyMember2 m2; // error。对于没有默认构造器的类成员,只能通过成员列表进行初始化
};
*/
/*
class MyMember1 {
public:
MyMember1(int i){}
};
// 只能通过列表初始化的方式去初始化的情况:
// 1. const(非static)的成员
// 2. 引用成员
// 3. 没有默认构造函数的那些类成员
class MyClass {
public:
MyClass() :i(100), ri(i), ci(200), m1(3){}
private:
int i;
int &ri;
const int ci;
MyMember1 m1;
};
*/