C++中构造函数的手动和自动调用方式

论坛 期权论坛 期权     
C语言与C++编程   2019-7-8 05:49   4655   0
作者:子宇24
链接:https://www.cnblogs.com/dishengAndziyu/p/10904899.html
1、对象的构造通过构造函数来完成,和类名相同且没有返回值,这个时候只有参   数一个特性,构造函数可以自定义参数,这个参数一般而言就是对类进行初始  化来使用的;带有参数的构造函数的意义在于可以使得每个对象有不同的初始   化状态(生活中每个事物必然包含自己的初始化状态,不如人的出生,面向对   象用来将生活中的事物映射的程序设计领域,所以现实世界的情况都必须可以  用面向对象的语言来描述,因此带有参数的构造函数就是非常必要的);

2、带有参数的构造函数:

  • 构造函数可以根据需要定义参数;
  • 一个类中可以存在多个重载的构造函数;
  • 构造函数的重载遵循 C++ 重载的规则;
  • 代码示例:
  1. class Test
  2. {
  3. public:
  4.     Test(int v)
  5.     {
  6.         // use v to initialize member
  7.     }
  8. };
复制代码
   
3、对象定义和对象声明的区别:

  • 对象定义:申请对象的空间并调用构造函数;
    第一步,必须申请对象所占用的内存空间;
    第二步,调用构造函数;
  • 对象声明:告诉编译器存在这样一个对象;
    对象在哪里定义的不知道,链接的时候回去找;
    预处理,编译器对源代码进行检查并生成目标文件,链接器在各个目标文件中寻找目标文件存在的一些名字;
    对象声明时,没有对象定义时的两个步骤;
  • 代码示例:
  1. Test t;  // 定义对象并调用构造函数;
  2. Int main()
  3. {
  4.     // 告诉编译器存在名为 t 的Test对象;
  5.     extern Test t;
  6.     return 0;
  7. }
复制代码
  • 对象的声明中可以在构造函数参数中给出默认值,对象的定义中不能够在构 造函数参数中给出默认值;

4、构造函数的自动调用(第一种初始化对象方式):
  1. #include
  2. class Test
  3. {
  4. public:
  5.     Test()
  6.     {
  7.         printf("Test()\n");
  8.     }
  9.     Test(int v)
  10.     {
  11.         printf("Test(int v), v = %d\n", v);
  12.     }
  13. };
  14. int main()
  15. {
  16.     Test t;      // 调用 Test()
  17.     Test t1(1);  // 初始胡第一种方式的参数式自动调用,调用 Test(int v);这里也是定义对象,看上去非常像函数调用,但是这里是告诉编译器要调用带有参数的函数,由重载规则确定调用的是那个构造函数;
  18.     Test t2 = 2; // 初始化第一种方式的赋值式自动调用,调用 Test(int v);C 语言中初始化的方法,定义一个变量后,立即指明一个值,通过赋值符号指明;这在面向对象中其实也是对象的定义,并且指明想用右值初始化左值;
  19.     t = t2;  // 这是赋值操作,这里运行后不会调用构造函数,没有打印语句;初始化会调用构造函数,赋值则看后续课程;
  20.     int i = 1;  // 用 1 对 i 进行初始化;
  21.     i = 1;  // 用 1 对 i 进行赋值;赋值和初始化是不同的;在面向对象当中,不同在于初始化是要调用构造函数的;
  22.     int i(100);  // 初始化的第二种写法,同 int i = 100;;
  23.     printf("i = %d\n", i);
  24.     return 0;
  25. }
复制代码
  • 实验结果说明:
    初始化和赋值看上去相同之处在于当初始化用赋值符号表达的时候;
    不同之处在于初始化要调用构造函数,而赋值不会;
   
5、构造函数的调用:

  • 一般情况下,构造函数在对象定义时被自动调用;
  • 一些特殊情况下,需要手工调用构造函数:
    如何创建对象数组;

   
6、构造函数的手工调用(第二种初始化对象方式)编程实验:

[code]#include

class Test
{
private:
    int m_value;
public:
    Test()
    {
        printf("Test()\n");

        m_value = 0;
    }
    Test(int v)
    {
        printf("Test(int v), v = %d\n", v);

        m_value = v;
    }
    int getValue()
    {
        return m_value;
    }
};

int main()
{
    Test ta[3];  // 按照 C 语言的方法定义 3 个 Test 对象的数组 ta;结果调用了 3 个 Test() 函数;

    for(int i=0; i
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP