C++中的构造函数-白话解读

Posted 嵌入式情报局

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中的构造函数-白话解读相关的知识,希望对你有一定的参考价值。

C++中的构造函数-白话解读
关注、星标公众号,直达精彩内容

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;
}


C++中的构造函数-白话解读

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++中的构造函数-白话解读


拷贝构造函数与构造函数一样,当用户没有提供对应的函数实现,C++会调用默认的拷贝函数,该默认拷贝函数会把所有成员进行对应赋值。

当然你可以定义自己的拷贝函数,形式如上面的demo所示,其形式与常规构造函数类似,只是参数为常引用,而该引用为赋值语句右侧对象,可以通过访问该对象来对当前左对象赋值。


4最后


这里小哥就分享了一下C++中构造函数的学习和使用,希望本文能够对你有帮助!

推荐好文  点击蓝色字体即可跳转


☞ C++中的构造函数-白话解读

☞ C++中的构造函数-白话解读

☞ C++中的构造函数-白话解读

☞ C++中的构造函数-白话解读

  
    
    
  


长按右侧二维码

即可获取更多精彩内容



以上是关于C++中的构造函数-白话解读的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读

C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读

c++ explicit关键字解读

为啥此 C++ 代码中的构造函数不明确,我该如何解决?

为啥要避免片段中的非默认构造函数?

无法解析片段中的 ViewModelProvider 构造?