构造函数
创建对象时,自动调用的函数。函数名称与类名相同,没有返回值。
class complex
{
public:
complex(double r=0, double i=0) //参数可以有默认值(默认值不是构造函数特有)
: re(r), im(i) //构造函数特有的初值列
{}
double real() const {return re;} //函数定义
double imag() const {return im;} //函数定义
private:
double re, im;
}
一个变量数值的设定有两个阶段:初始化 → 赋值。
- 初始化阶段:
在初值列
【re( r), im(i) 】的时侯就初始化值了 - 赋值阶段:
在大括号中进行
如果在初值列中放弃了赋初值的操作,而在第二个阶段(大括号中)再赋初值,则效率会差一点。
换而言之,初值列
和下面的写法效果相同,但内部过程不一样。
complex(double r=0, double i=0)
{
re = r;
im = i;
}
创建对象的3种方式:
{
complex c1(2, 1);
complex c2; //如果没有指明参数,则使用默认的
complex* p= new complex(2, 1); //动态地创建对象,返回一个指针
}
构造函数重载
构造函数可以有很多个,即对象创建时有很多种初值的设定。但如下这种冲突的写法不行:
{
complex(double r=0, double i=0): re(r), im(i) {}
complex(): re(0), im(0) {}
}
构造函数放在private中
单例模式(Singleton)
函数放在 private 中,则外界不能调用该函数。若构造函数放在 private 中,则外界在创建该对象的时候无法调用该构造函数(即,无法在外界创建该对象)。
那为什么要这样设计呢?
static 静态成员数据和 static 静态成员函数每个对象共同拥有一份。所以就算多次调用该函数,还是只能有一个该类对象。由于 getInstance() 中创建了一个静态成员 a,所以外界需要使用时类 A 时,调用通过A::getInstance() 取得类 A 中创建的对象 a 。若要调用 setup() 方法,则使用 A::getInstance().setup()。
class A
{
public:
static A& getInstance();
setup(){...}
private:
A();
A(const A& rhs);
...
}
A& A::getInstance()
{
static A a;
return a;
}