zoukankan      html  css  js  c++  java
  • (已解决一部分)哪位对类的构造函数内的成员变量的初始化过程比较熟悉~帮忙看个问题

    一个类A定义如下:

    template <typename valType>

    class A {

    private:

      valType _val;

    };

    然后主要的问题是下面两个拷贝构造函数的区别:

      第一种构造:

      template <typename valType>

      inline

      A<valType>::A( const valType &val )

      {

        _val = val;

      }

      第二种构造:

      template <typename valType>

      inline

      A<valType>::A( const valType &val ) : _val( val ) {}

    针对这两种拷贝构造:

    1、A<int> a(1);时这两种没什么区别

    2、但如果是A<Matrix> a( refMatrix );//这里Matrix是一个class对象

      Essential C++ P174说这里这两个效率就有高下之分了。因为,constructor函数主题内对_val 的赋值操作可分解为两个步骤:(1) 函数主题执行前,Matrix's default constructor 会先作用于_val 身上;(2) 函数主题内会以copy assignment operator 将val 复制给_val。但如果我们采用上述第二种方法,在constructor的member initilization list中将_val 初始化,那么只需一个步骤就可完成工作:以copy constructor 将val 复制给_val。

    问题:

    这里的红色标记地方我就不懂了。我的理解是A<Matrix> a( refMatrix );是声明a并定义a。在定义过程中会对a进行初始化,如果采用上述第一种构造方法,此时_val是一个class对象,而_val尚未进行定义,因此_val = val;是以Matrix类的copy constructor来进行的。

    哪位能给解释解释上面其他颜色标记的那段话?

      

     --------------------

    一堆问题:这个看不懂,就又想起之前的Essential C++ P105

    class A {

    public:

      A();

      A( int len );

      A( int len, int beg_pos );

    private:

      int _length;

      int _beg_pos;

    };

    A ta = 8;

    上述语句是调用constructor还是assignment operator?答案是constructor

    群里朋友的一种解释是:_val是class object,在_val = val;之前尚未进行定义,所以这里会先调用默认构造函数,然后再进行赋值。

    最后自己测试了一下:

    BaseClass.h
     1 #pragma once
    2 #include <iostream>
    3
    4 class BaseClass
    5 {
    6 public:
    7 BaseClass(void) ;
    8 BaseClass(const BaseClass& rhs) { _iBase = rhs._iBase; std::cout << "copy constructor" << std::endl; }
    9 BaseClass& operator=(const BaseClass& rhs) { _iBase = rhs._iBase; std::cout << "assignment constructor" << std::endl; return *this;}
    10 ~BaseClass(void);
    11
    12 private:
    13 int _iBase;
    14 };
    BaseClass.cpp
     1 #include "StdAfx.h"
    2 #include "BaseClass.h"
    3
    4 BaseClass::BaseClass(void)
    5 {
    6 _iBase = 0;
    7 std::cout << "default constructor" << std::endl;
    8 }
    9
    10 BaseClass::~BaseClass(void)
    11 {
    12 }
     1 #pragma once
    2 #include "BaseClass.h"
    3
    4 class TestClass
    5 {
    6 public:
    7 TestClass(void);
    8 // TestClass( const BaseClass& val ) { _val = val; }
    9 TestClass( const BaseClass& val) : _val( val ) {}
    10 ~TestClass(void);
    11
    12 private:
    13 BaseClass _val;
    14 };
    TestClass.cpp(无增加代码)
    #include "StdAfx.h"
    #include "TestClass.h"

    TestClass::TestClass(void)
    {
    }

    TestClass::~TestClass(void)
    {
    }

    main函数主题:

      BaseClass bc;
       TestClass tc(bc);

    运行结果:

      default constructor
      copy constructor
      请按任意键继续. . .

    我现在自己对这个问题的解释倾向于:_val在构造函数主体内尚未定义,所以会调用默认构造函数。

      PPS:

    构造函数执行过程是先执行初始化列表,然后是函数体内的代码。初始化列表的形式其实是调用的对应的构造函数。然后函数体内的_val = val; 这里是显示调用=操作符。但由于_val还没有定义,所以要先调用默认构造函数。。


    2012/3/22增加:

    本以为已经懂了,但昨晚聊天的最后之前的群里朋友又说:

    string s1;

    string s3 = s1;// 这一句直接调用copy构造。。

    这里还是不理解,先标记红色。(在C++ Primer里没找到相关内容~string的文件里也没找到operator=)

  • 相关阅读:
    eCryptfs文件系统测试
    体验企业级网络管理软件(图片加视频)
    基于Linux2.6内核的加密容器法保护文件方法
    Orion Network Performance Monitor 软件在网络管理中的应用
    两款硬件代理服务器产品之比较
    3Com Network Supervisor与IBM Tivoli NetView两款网管软件操作视频
    成为IBM精英讲师-一分耕耘 一份收获 同时也多了一份责任!
    Hp Open View安装使用视频
    在Fedora 14 alpha 下测试Kvm情况(视频)
    ACM模板——分数类
  • 原文地址:https://www.cnblogs.com/ziyoudefeng/p/2410728.html
Copyright © 2011-2022 走看看