C++中的构造函数-白话解读
Posted 嵌入式情报局
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的构造函数-白话解读相关的知识,希望对你有一定的参考价值。
ID:嵌入式情报局
1构造的需求
前面小哥跟大家介绍了面向对象的思想,同时也介绍了class关键字来定义类,那么在C++中可以说所有的数据类型都可以看成是对象,比如int a;其中的a你就可以把其看做对象,而int看做对象的类型,使用class定义的类型就更不用多说了。
那么作为对象就会有产生和消亡,产生的过程势必要对相关属性进行初始化,否则对象处于一种不确定的状态,比如你的名字、你的性别等等。
消亡的时候也势必要做一些结束性的工作,所以C++为类安排了两个默认的过程"构造"和"析构",从字面上也很好理解,一个造-"创造",一个析-"释放",今天主要跟大家介绍一些构造函数等知识。
2构造函数
C++提供了一个默认的初始化调用接口 -- 构造函数,比如下面的构造函数:
#include <iostream>
#include <stdio.h>
//#define METHOD_2
class Test{
private:
int test;
public:
#ifdef METHOD_2
Test(int a); //构造函数
int GetTest(void);
#else
Test(int a) //构造函数
{
test = a;
}
int GetTest(void)
{
return test;
}
#endif
};
#ifdef METHOD_2
Test::Test(int a) //构造函数
{
test = a;
}
int Test::GetTest(void)
{
return test;
}
#endif
int main(int argc, char** argv) {
Test ctest(5);
printf("ctest.GetTest = %d
",ctest.GetTest());
return 0;
}
上面Test类中的Test函数就是其对应的构造函数,既可以在class类中定义,也可以在类外写成Test::Test(int a) 的形式来进行定义。
当然构造函数的形参可以根据自身需求进行定义,如果你没有定义构造函数系统也会调用默认的构造函数处理,不过其函数内部什么也不做。
同时注意如下几点:
1)构造函数的名称与类名要相同;
2)构造函数可以有参数,但不能有返回值,如果没有参数就调用对应的无参数构造函数;
3)构造函数一旦定义,在以后对象处使用就需要有匹配的构造函数类型。
4)构造函数会在对象产生处进行自动调用,一般是在定义处。如果你想主动调用也是OK的,比如写成Test ctest=Test(5);
5)类的成员函数和普通函数一样支持函数重载,同样对于构造函数也是可以根据参数进行相应重载的。(函数重载可以看往期文章,下面给了一个简单示例)
#include <iostream>
#include <stdio.h>
class Test{
private:
int test;
public:
Test(int a) //构造函数
{
printf("调用构造函数1
");
test = a;
}
Test(int a,int b) //构造函数
{
printf("调用构造函数2
");
test = a+b;
}
int GetTest(void)
{
return test;
}
};
int main(int argc, char** argv) {
Test ctest1(5);
Test ctest2(5,4);
printf("ctest.GetTest1 = %d
",ctest1.GetTest());
printf("ctest.GetTest2 = %d
",ctest2.GetTest());
return 0;
}
3
拷贝构造函数
在常规的变量类型,我们可以直接使用其他变量来进行初始化工作,那么两个变量的值应该是一致的,在C++中类也是有着同样的功能,但是其实是以一个特殊的函数构造函数来进行这一个过程。
下面这个小例子就能清晰的了解到什么是构造函数 :
#include <iostream>
#include <stdio.h>
class Test{
private:
int test;
public:
Test()//构造函数
{
printf("调用Test()构造函数
");
test = 10;
}
Test(const Test&a )//拷贝函数
{
printf("调用拷贝函数
");
test = a.test*10;
}
int GetTest(void)
{
return test;
}
};
int main(int argc, char** argv) {
Test ctest1; //调用构造函数
Test ctest2 = ctest1; //调用拷贝函数初始化 ctest2
printf("ctest.GetTest1 = %d
",ctest1.GetTest());
printf("ctest.GetTest2 = %d
",ctest2.GetTest());
return 0;
}
拷贝构造函数与构造函数一样,当用户没有提供对应的函数实现,C++会调用默认的拷贝函数,该默认拷贝函数会把所有成员进行对应赋值。
当然你可以定义自己的拷贝函数,形式如上面的demo所示,其形式与常规构造函数类似,只是参数为常引用,而该引用为赋值语句右侧对象,可以通过访问该对象来对当前左对象赋值。
4最后
推荐好文 点击蓝色字体即可跳转
☞
☞
☞
☞
长按右侧二维码
即可获取更多精彩内容
以上是关于C++中的构造函数-白话解读的主要内容,如果未能解决你的问题,请参考以下文章
C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读