2.7 C++构造函数
参考:http://www.weixueyuan.net/view/6339.html
总结:
如果在类中声明了任何一个构造函数,则系统不会自动生成默认构造函数。构造函数同样能够使用类中的成员变量。
构造函数就是用于初始化对象的,并且负责处理对象创建时需要处理的其它事务,在创建对象时会被自动调用。
构造函数除了自身独有的三个特性以外,其它与普通成员函数类似,可以完成普通函数能完成的所有功能,如函数调用、条件判断、循环、赋值等,如下例所示。
构造函数是类中一种特殊的成员函数,其特殊之处有三点:
一个类中可以有多个构造函数,构造函数之间构成函数重载的关系。
[例1] 构造函数举例:
本例中定义了一个book类,在该类中定义了两个private属性的成员变量price和title,定义的成员函数有6个,后面四个在前几节中已经介绍过了,两个函数book()和book(char * a, double p)即为需要介绍的构造函数。这两个函数无返回值,函数名与类名相同,这是构造函数最明显的特征。
构造函数与普通成员函数类似,可以在类内部定义,也可以在类外部定义。第一个没有参数的构造函数book(),其定义就在类内部;第二个构造函数book(char * a, double p)在类内部声明,类外部定义。
通常如果在定义类的时候,程序设计人员没有主动声明任何一个构造函数的时候,系统会自动生成一个默认构造函数,默认构造函数就是不带任何参数的构造函数。其它带参数的构造函数统称为带参构造函数。
如果在类中声明了任何一个构造函数,则系统不会自动生成默认构造函数。构造函数同样能够使用类中的成员变量。
构造函数的作用在本例中也可以很清楚的看出来。构造函数就是用于初始化对象的,并且负责处理对象创建时需要处理的其它事务,在创建对象时会被自动调用。
本例中的主函数中,先定义了一个Alice对象,该对象其实在创建的时候已经自动调用了默认的构造函数的。若我们在类定义的时候不定义默认构造函数,则book Alice;这一句创建对象的语句则会出现编译错误,因为我们创建了带参构造函数,故默认构造函数不会被自动创建,因此在用book Alice;语句创建对象的时候无相应的构造函数能够调用,因此会初始化对象出错。
在主函数中,当我们创建Harry对象时,其后还跟有一个括号,里面还有两个参数,这一句创建对象会自动调用book(char * a, double p)构造函数进行对象的初始化,初始化之后,Harry.price = 49.9,而Harry.title = “Harry Potter”,因此在调用Harry.display()函数的时候,能够打印出“The price of Harry Potter is $49.9”也是不足为奇的。
构造函数除了自身独有的三个特性以外,其它与普通成员函数类似,可以完成普通函数能完成的所有功能,如函数调用、条件判断、循环、赋值等,如下例所示。
[例2] 在构造函数中调用函数:
- 构造函数的函数名必须与类名相同;
- 构造函数无返回值;
- 当我们创建类对象的时候构造函数会被自动调用,而无需我们主动调用。
一个类中可以有多个构造函数,构造函数之间构成函数重载的关系。
[例1] 构造函数举例:
#include<iostream> using namespace std; class book { public: book(){} book(char* a, double p); void setprice(double a); double getprice(); void settitle(char* a); char * gettitle(); void display(); private: double price; char * title; }; book::book(char* a, double p) { title = a; price = p; } void book::display() { cout<<"The price of "<<title<<" is $"<<price<<endl; } void book::setprice(double a) { price = a; } double book::getprice() { return price; } void book::settitle(char* a) { title = a; } char * book::gettitle() { return title; } int main() { book Alice; Alice.settitle("Alice in Wonderland"); Alice.setprice(29.9); Alice.display(); book Harry("Harry Potter", 49.9); Harry.display(); return 0; }
构造函数与普通成员函数类似,可以在类内部定义,也可以在类外部定义。第一个没有参数的构造函数book(),其定义就在类内部;第二个构造函数book(char * a, double p)在类内部声明,类外部定义。
通常如果在定义类的时候,程序设计人员没有主动声明任何一个构造函数的时候,系统会自动生成一个默认构造函数,默认构造函数就是不带任何参数的构造函数。其它带参数的构造函数统称为带参构造函数。
如果在类中声明了任何一个构造函数,则系统不会自动生成默认构造函数。构造函数同样能够使用类中的成员变量。
构造函数的作用在本例中也可以很清楚的看出来。构造函数就是用于初始化对象的,并且负责处理对象创建时需要处理的其它事务,在创建对象时会被自动调用。
本例中的主函数中,先定义了一个Alice对象,该对象其实在创建的时候已经自动调用了默认的构造函数的。若我们在类定义的时候不定义默认构造函数,则book Alice;这一句创建对象的语句则会出现编译错误,因为我们创建了带参构造函数,故默认构造函数不会被自动创建,因此在用book Alice;语句创建对象的时候无相应的构造函数能够调用,因此会初始化对象出错。
在主函数中,当我们创建Harry对象时,其后还跟有一个括号,里面还有两个参数,这一句创建对象会自动调用book(char * a, double p)构造函数进行对象的初始化,初始化之后,Harry.price = 49.9,而Harry.title = “Harry Potter”,因此在调用Harry.display()函数的时候,能够打印出“The price of Harry Potter is $49.9”也是不足为奇的。
构造函数除了自身独有的三个特性以外,其它与普通成员函数类似,可以完成普通函数能完成的所有功能,如函数调用、条件判断、循环、赋值等,如下例所示。
[例2] 在构造函数中调用函数:
- 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;
- }