<C++>11.构造函数

来源:互联网 发布:linux网络运维 编辑:程序博客网 时间:2024/06/07 12:21

11.构造函数

一、概述

当声明一个类对象时,编译程序需要为对象分配存储空间,为数据成员赋初值,即进行必要的初始化。但是类申明体中不能给数据成员直接赋初值,这就需要利用类的构造函数来初始化类的成员。

构造函数是一种特殊的成员函数,它的主要作用就是为类的对象分配空间,进行初始化

注意:

1、构造函数的函数名必须与类名相同。

2、构造函数可以有任意类型的参数,但是不能有返回值。

3、构造函数不需要调用,在建立对象时,系统会自动执行。

例:

#include <iostream>using namespace std;// 类class data{public:data();// 声明构造函数void showdata();private:int x, y, z;};// 定义构造函数,不能有返回值data::data(){x=1;y=2;z=3;}void data::showdata(){cout<<x<<endl;cout<<y<<endl;cout<<z<<endl;}int main(void){data getnu;getnu.showdata();return 0;}

结果:

1

2

3

 

二、采用构造函数给数据成员赋初值的两种形式

1、类名 对象名[(实参表)]

“实参表”是为构造函数提供的实际参数。

例:

#include <iostream>using namespace std;// 类class data{public:data();// 声明构造函数void showdata();private:int x, y, z;};// 定义构造函数,不能有返回值data::data(){x=1;y=2;z=3;}void data::showdata(){cout<<x<<endl;cout<<y<<endl;cout<<z<<endl;}int main(void){data getnu;getnu.showdata();return 0;}

结果:

1

2

3

 

2、类名 *指针变量名=new类名[(实参表)]

这是使用new运算符动态建立对象的一种方式。

例:

#include <iostream>using namespace std;// 类class data{public:data(int a, int b, int c);// 声明构造函数void showdata();private:int x, y, z;};// 定义构造函数,不能有返回值data::data(int a, int b, int c){x=a;y=b;z=c;}void data::showdata(){cout<<x<<endl;cout<<y<<endl;cout<<z<<endl;}int main(void){data *ptr = new data(1, 2, 3);// 此对象没有名字,称为无名对象,但是此对象有地址,这个地址存放在指针变量ptr中。ptr->showdata();// 使用->符号访问成员函数return 0;}

结果:

1

2

3

编译系统开辟了一段内存空间,并在此空间中存放了一个data类对象,同时调用了该类的构造函数给数据成员赋初值。发表访问应new动态建立的对象一般不用对象名,而是通过指针访问。

 

三、成员初始化列表

除了上述在构造函数中用赋值语句进行初始化外,还可以用成员初始化列表来实现堆数据成员的初始化。

形式:

类名::构造函数名([参数表])[:(成员初始化列表)]

{

构造函数体

}

成员初始化列表:

数据成员名(初始值), ...

例:

#include <iostream>using namespace std;class data{public:data(int a, int b):x(a),  y(b),  z(10)// 定义带有成员初始化列表的构造函数{cout<<"我是构造函数!"<<endl;}void show(){cout<<x<<endl;cout<<y<<endl;cout<<z<<endl;}private:int x, y, z;};int main(void){data num(1, 2);// 定义对象并通过成员初始化列表来初始化成员数据num.show();return 0;}

结果:

1

2

10

 

四、总结说明

1、构造函数名必须与类名相同,否则编译器会把它当作一般函数处理。


2、构造函数没有返回值,在定义构造函数时,不能说明它的类型,即使是void型也不行。


3、与普通的成员函数一样,构造函数的定义既可以写在类内,也可以写在类外。若写在类外,必须声明。若使用默认参数,声明的时候写明默认参数即可,无需在定义的时候写明。


4、构造函数一般声明为公有成员,但是它不能像其它成员函数那样显式调用,它在定义完对象之后被自动调用,而且只执行一次。


5、构造函数既可带参数,也可不带参数。`

 

原创粉丝点击