构造函数和构析函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造函数和构析函数相关的知识,希望对你有一定的参考价值。
目前能想到的:
构造函数
在类对象被创建时候执行,名字与类名相同,不返回任何类型(即使void),可以用来给某些成员变量设置初始值。
不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。
构析函数在类对象被销毁时候执行释放内存等功能。
构造函数必须是 public 属性的,否则创建对象时无法调用。设置为 private、protected 属性也不会报错,但是没有意义。
构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,这意味着:
- 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
- 函数体中不能有 return 语句。
关于构造函数的含参初始化问题:
在栈上创建对象时,实参位于对象名后面,例如Student stu(“参数”)
在堆上创建对象时,实参位于类名后面,例如new Student
("参数")
如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。类名(){}
一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。
实际上编译器只有在必要的时候才会生成默认构造函数,而且它的函数体一般不为空。默认构造函数的目的是帮助编译器做初始化工作,而不是帮助程序员。这是C++的内部实现机制,这里不再深究,初学者可以按照上面说的“一定有一个空函数体的默认构造函数”来理解。
最后需要注意的一点是,调用没有参数的构造函数也可以省略括号。对于示例2的代码,在栈上创建对象可以写作Student stu()
或Student stu
,在堆上创建对象可以写作Student *pstu = new Student()
或Student *pstu = new Student
,它们都会调用构造函数 Student()
然后是调用顺序:
以及默认生成问题;
附上构造函数的示例
1 #include<iostream> 2 using namespace std; 3 class Line 4 { 5 public: 6 void setlength(double len); 7 double getlength(void); 8 Line();//构造函数 9 private: 10 double length; 11 }; 12 Line::Line(void) 13 { 14 cout<<"Object is being created"<<endl; 15 } 16 void Line::setlength(double len) 17 { 18 length=len; 19 } 20 double Line::getlength(void) 21 { 22 return length; 23 } 24 int main() 25 { 26 Line line; 27 //设置长度 28 line.setlength(6.0); 29 cout<<line.getlength()<<endl; 30 return 0; 31 }
然后是构析函数:
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。
析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
代码如下:
1 #include<iostream> 2 using namespace std; 3 class Line 4 { 5 public: 6 void setlength(double len); 7 double getlength(void); 8 Line();//构造 9 ~Line();//析构 10 private: 11 double length; 12 }; 13 //成员函数定义,构造和析构 14 Line::Line(void) 15 { 16 cout<<"Object is being created"<<endl; 17 } 18 Line::~Line(void) 19 { 20 cout<<"Object is being deleted"<<endl; 21 } 22 void Line::setlength(double len) 23 { 24 length=len; 25 } 26 double Line::getlength(void) 27 { 28 return length; 29 } 30 int main() 31 { 32 Line line; 33 line.setlength(6.0); 34 cout<<"Length of line"<<line.getlength()<<endl; 35 return 0; 36 }
然后几点要注意的地方:
以上是关于构造函数和构析函数的主要内容,如果未能解决你的问题,请参考以下文章