一、构造函数
1.概念及特点概括
构造函数是一种特殊的成员函数,可以用来解决“类声明体中不能直接赋值”的问题。
它主要用于为对象分配空间,进行初始化。
特点;
- 必须与类名相同,不能任意命名。否则将会被当作一般函数成员来处理。
- 没有类型,也没有返回值。
- 它不能被显式地被调用,它是在定义对象的时候自动被调用,而且只执行一次。
二、构造函数的使用方法
1.初始化
先来说初始化的问题:
第一个:
通过直接传参的方式,在开始创造对象的时候将我们所需的值赋给数据成员
#include<iostream>
using namespace std;
class A{
public:
A(int x=0,int y=0);必须设定默认参数值,否则编译器会报错
void show_A();
private:
int a;
int b;
};
A::A(int x,int y){ //构造函数
a=x;
b=y;
}
void A::show_A(){
cout<<"a="<<a<<" b="<<b<<endl;
}
int main(){
A ex_1(1,2),ex_2(3),ex_3;
ex_1.show_A();
ex_2.show_A();
ex_3.show_A();
}
结果如下:
我们会发现:在定义对象ex_2时,我们只传递了一个参数,而这个参数传给了第一个形参。这说明参数的传递是从左向右的。
第二个:使用new运算符动态建立对象。
通过 new运算符开辟空间,在此空间中存放了一个无名对象,并将此对象的地址放入指针中,通过指针来访问对象。
#include<iostream>
using namespace std;
class A{
public:
A(int x=0,int y=0);
void show_A();
private:
int a;
int b;
};
A::A(int x,int y){
a=x;
b=y;
}
void A::show_A(){
cout<<"a="<<a<<" b="<<b<<endl;
}
int main(){
A *p;
p=new A(9,10);
p->show_A();
delete p;
return 0;
}
代码运行结果;
2.拷贝构造函数
1)第一种是很简单的情况,很容易理解,所以不多加解释
形如:
A ex_1(ex_2); 代入法
A ex_1=ex_2;赋值法
2)第二种是以“类”作为实参和形参来进行传递的。我们可以将这种类型看成第一种类型“代入法”的升级版。两者都有同样的过程。
#include<iostream>
using namespace std;
class A{
private:
int i;
public:
void show_A(){cout<<"i="<<i<<endl;}
A fun1(A p);
A fun2();
A(int b){ i=b;}
};
A fun1(A p){ //将“类”作为参数
p.show_A();
}
A fun2(){ //返回一个临时对象
A p2(4);
return p2;
}
int main(){
A p1(10);
fun1(p1);
A p3=fun2();
p3.show_A();
}
三、析构函数
相对于构造函数,析构函数相对更加简单,功能也更加单一。析构函数通常被由于撤销对象时的清理任务,比如释放被分配的空间。
- 从名字上来说:名字与析构函数相同,但开头多出了一个“~”。
- 析构函数为“三无人员 ”无参,无返回值,不能重载。
- 在撤销对象时,编译系统会自动调用析构函数。
默认析构函数已经能满足要求,自定义析构函数就是在图增烦恼,所以就不详细介绍了。
三、内联函数
内联函数与普通函数的区别在于:内联函数不需要寻址,只需要在被执行到内联函数时将此函数展开。执行多少次就被展开多少次。
普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。
还有其它不同,但是作为小白就先了解到这。如果还有兴趣,可以看下这篇文章:
https://blog.csdn.net/weixin_41786584/article/details/82756515