声明:代码出处http://www.weixueyuan.net/view/6339.html
构造函数是类中一种特殊的成员函数,其特殊之处有三点:
构造函数的函数名必须与类名相同;
构造函数无返回值;
当我们创建类对象的时候构造函数会被自动调用,而无需我们主动调用。
一个类中可以有多个构造函数,构造函数之间构成函数重载的关系。
通常如果在定义类的时候,程序设计人员没有主动声明任何一个构造函数的时候,系统会自动生成一个默认构造函数,默认构造函数就是不带任何参数的构造函数。
其它带参数的构造函数统称为带参构造函数。
我们创建了带参构造函数,默认构造函数不会被自动创建
在构造函数中还可以调用函数:
class book
{
public:
book(){}
book(char* a, double p){init(a,p);};
void setprice(double a);
double getprice();
void settitle(char* a);
char * gettitle();
void display();
void init(char* a, double p);
private:
double price;
char * title;
};
void book::init(char* a, double p)
{
title = a;
price = p;
}
//----------------------------------------------------------
一个带默认参数的构造函数
#include
usingnamespacestd;
classbook
{
public:
book(){}
book(char*a,doublep=5.0);
voiddisplay();
private:
doubleprice;
char*title;
};
book::book(char*a,doublep)//在定义函数的时候可以不指定默认参数
{
title=a;
price=p;
}
voidbook::display()
{
cout<<"The price of "<
}
intmain()
{
bookHarry("Harry Potter",49.9);
Harry.display();
bookGone("Gone with the Wind");
Gone.display();
return0;
}
需要说明的是带默认参数的构造函数,其默认参数必须置于参数列表的结尾。如果例1中带参构造函数 book(char* a, double p = 5.0); 被声明成 book(double p = 5.0, char* a); 则是无法通过编译的,因为默认参数不在参数列表的结尾。
确切的说是带默认参数的形参的右边 不能有没带参数的形参
目的是为了消除二义性
如:
book(double a,int b,int c):a(0),b(0),c(0);
book(double a = 1,int b,int c = 2);
如果定义 book b1(3); 编译器就不知道你要调用哪一个构造函数了。
//-------------------------------------
拷贝构造函数,顾名思义,就是通过拷贝对象的方式创建一个新对象。拷贝构造函数有两种原型
book(book&b);
book(constbook&b);
这两种原型都是book类对象的引用。
如果拷贝构造函数的参数不是对象的引用,则是不允许的。
拷贝构造函数除了能有对象引用这样的参数之外,同样也能有其它参数。但是其它参数必须给出默认值
book(constbook&b,price=5.0);
classbook
{
public:
book(){}
book(book&b);
book(char*a,doublep=5.0);
voiddisplay();
private:
doubleprice;
char*title;
};
book::book(book&b)
{
price=b.price;
title=b.title;
}
book::book(char*a,doublep)
{
title=a;
price=p;
}
voidbook::display()
{
cout<<"The price of "<
}
如果一个类中包含指向动态分配存储空间的指针类型的成员变量时,就应该为这个类设计一个拷贝构造函数,除了需要设计一个拷贝构造函数之外,还需要为它添加一个赋值操作符重载函数
#include
#include
using namespace std;
class Sample{
public:
Sample(){cout<<"Sample chuxian"<<++a<
~Sample(){cout<<"Sample likai"<<--a<
private:
static int a;
};
int Sample:: a = 0;
int main()
{
Sample a[2],*p[3],&b = a[1];
return 0;
}
构造函数 只用普通函数调用了构造函数 指针和引用都不会去调用构造函数