精华内容
下载资源
问答
  • 今天看了有关对象作为函数形参的实现的一些知识,下面谈一谈我的看法。 大家可以想一下基本类型的数据作为函数形参在底层的实现:主调函数将实参压入运行栈中的传参区域,进行形实结合调用被调函数,调用完成后...

    今天看了有关类的对象作为函数形参的实现的一些知识,下面谈一谈我的看法。

    大家可以想一下基本类型的数据作为函数形参在底层的实现:主调函数将实参压入运行栈中的传参区域,进行形实结合调用被调函数,调用完成后被调函数弹出运行栈,再调用下一个函数。

    类的对象作为形参的时候,也要用到运行栈,来看它的实现:首先将对象压入运行栈的传参区域,区别就在此产生,然后调用复制构造函数建立一个临时对象在传参区域,而基本类型的数据只需执行简单的写入内存即可,然后再执行被调函数的代码。注:调用复制构造函数是在进入被调函数地址入口之前就完成的。

    高级知识:

    不调用复制构造函数也能完成函数调用的情况:如果函数的实参是一个临时对象(比如类类型的转换产生的临时对象),那么这个临时对象就会压入运行栈的传参区域,此时就不用再调用复制构造函数了。

    展开全文
  • c++,对象作为形参时一定会调用复制构造函数吗? c++,对象作为形参时一定会调用复制构造函数吗?答:如果参数是引用传递,则不会调用任何构造函数;如果是按值传递,则调用复制构造函数,...

    c++,类的对象作为形参时一定会调用复制构造函数吗?

    c++,类的对象作为形参时一定会调用复制构造函数吗?

    答:如果参数是引用传递,则不会调用任何构造函数;如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在,函数执行结束之后调用析构函数。

    如果类中没有定义复制构造函数 那对象就不能作为形参?

    答:如果没有定义,编译器会自动为你定义一个,编译器自己定义的复制构造函数是按类成员变量的值复制的。有几个成员变量就重新创建一个对象,那个对象的成员变量和被复制的对象其成员变量的值相同。这里如果成员变量有指针的时候,就会出现多个指针指向同一个对象的问题。
    posted @ 2018-02-06 09:29 史D芬周 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 在以后要用的地方,声明一个对象,直接调用其中的成员函数。 但有一个问题是,我们经常需要把我们从数据库里面查询到的东西显示在我们的主窗口的界面上。这时,就是两个之间的数据交换的问题了。 关于这个问题。...

    在数据库的开发中,

    做c++开发的人,可能习惯这样做,写一个类,里面封装了所有需要的数据库操作函数。在以后要用的地方,声明一个对象,直接调用其中的成员函数。

    但有一个问题是,我们经常需要把我们从数据库里面查询到的东西显示在我们的主窗口的界面上。这时,就是两个类之间的数据交换的问题了。

    关于这个问题。我总结一下,有三种,当然,可能还有更多。

    1.一切如常,只是声明的类成员函数前,要加关键字static,//涉及的一些知识,__thiscall __cdecl等,略过。

    一个小例子:

    class CADO
    {

    public:
     bool RExecute(const _variant_t Source,void (*pfun)(_RecordsetPtr pRecord,DWORD lparam),DWORD lparam);

    ...

    };

    class CadoTextDlg : public CDialogEx
    {

    public:
      CADO m_ado;
      static void show(_RecordsetPtr pRecord,DWORD lparam);

    };

    void CadoTextDlg::show(_RecordsetPtr pRecord,DWORD lparam)
    {

     CadoTextDlg * pdlg=(CadoTextDlg*)lparam;
     ...
    };

    在CadoTextDlg中调用时用m_ado.xxx("SELECT *FROM xxx",&CadoTextDlg::show,(DWORD)this);

    2.使用的是c++中的类的多态。

    class CADO
    {

    public:
     bool RExecute(const _variant_t Source,void (*pfun)(_RecordsetPtr pRecord,DWORD lparam),DWORD lparam);

    virtual  void show(_RecordsetPtr pRecord,DWORD lparam)=0;

    ...

    };

    class CadoTextDlg : public CDialogEx,public CADO
    {

    public:
      //CADO m_ado;这里也不需要实例化对象了,使用时,直接调用即可。
      void show(_RecordsetPtr pRecord,DWORD lparam);//重写此函数的功能就行

    };

    3.第三种方法,来硬的,就是第一种方法中,不加关键字static。

    这种方法比较复杂一些,参考于Boost的泛型。正在研究,来日补上。

    有错误的地方,请读者指正。谢谢!

    
    展开全文
  • 上面两个的定义在两个头文件中,在main函数中包括 #include #include #include "Point.h" #include "triangle.h" using namespace std; int main(){ Point point(7, 11); Point p1(1,1), p2(5,1)...
  • 作为函数参数(形参结合): 主调函数调用被调函数时,主调函数已经被压入了运行栈中,首先将要传递的参数压入运行栈的一段特殊区域中(这段内存,主调函数和被调函数都可以访问到),再将被调函数压入运行栈中(被...

    一、普通数据作为函数参数的和返回值的传递方式:

    作为函数参数(形参结合):

    主调函数调用被调函数时,主调函数已经被压入了运行栈中,首先将要传递的参数压入运行栈的一段特殊区域中(这段内存,主调函数和被调函数都可以访问到),再将被调函数压入运行栈中(被调函数的形参此时才具有内存,且在此时将主调函数的实参赋值给形参)完成了形参结合。

    作为函数返回值:

    主调函数调用被调函数时,被调函数运行结束,返回需要返回的数据时,编译器先创建一个临时的局部变量,该变量被赋值为需要返回的值,这个变量没有名字且生存期很短,仅存在于主调函数的表达式中。如:

    cout<<add(3,4)<<endl;

    该句运行完毕,变量生命周期结束。

    二、对象作为函数参数

    1.作为函数参数:

    要传递的对象已经存在时:

    point a(1,2);
    fun1(a);

    在运行栈创建一个临时对象,将需要传递的对象赋值给临时对象,再将临时对象赋值给形参。完成形参结合

    当要传递的对象是临时创建时:

    fun1(point(4,5));

    直接将point对象创建在运行栈上,然后将这个对象赋值给形参,完成形参与实参的结合。

    2.作为函数返回值:

    主流编译器方法:主调函数创建一段内存空间用于存放返回的对象,主调函数调用被调函数时,将该内存空间作为参数传入被调函数中(编译器自动完成,无需程序员自己显性写出)。因此,返回值所生成的对象的内存分配和构造是分步执行的,在主调函数中分配内存,在被调函数中进行构造。

    比较老的编译器方法:

    将返回值所生成的临时对象也创建在运行栈的传参区域(主调函数和被调函数都能访问的内存空间),主调函数在调用被调函数时,在运行栈处留下一段内存空间,被调函数返回值的时候,往这段空间内存放返回值所生成的临时对象。

    当然,如果主调函数调用被调函数采用一下方式:

    Point p= fun2();

    直接在p的内存中存放返回的临时对象即可,无需为临时对象再创建空间

    展开全文
  • C++中对象作为函数形参时的构造函数和析构函数 构造函数和析构函数是C++重要概念。本文将简单讨论当对象作为函数形式参数时,构造函数和析构函数的调用情况。 1. 无拷贝构造函数的情况 这是最简单的情形,中没有...
  • 对象作为函数参数

    2020-12-15 09:31:01
    对象作为函数的参数时,其传递过程较为复杂,传递方式比较独特。其传参过程与数组不同:数组变量的名称代表数组的首地址,而对象的变量名称却不能代表对象的首地址。传参时不会像数组那样以首地址作为函数的参数传递...
  • 1、当临时函数对象作为函数参数时,记住一点:临时对象的返回值是右值,当然临时函数对象的返回值也是右值,此时的形参要么加const,要么用右值引用&&; 2、使用模版的文件组织:网上的说法是把的定义以及中...
  • 函数形参实参的理解

    2019-09-26 08:44:28
    在js中,函数本身属于对象的一种,因此可以定义、赋值,作为对象的属性或者成为其他函数的参数。函数名只是函数这个对象类的引用。 函数定义 一、3种函数定义方式 【1】函数声明语句使用function关键字,后跟一组...
  • 首先,函数形参和返回值如果在不使用引用...那么,当我们面对类型对象作为形参和返回值时,其构造函数及析构函数是如何运作的呢?下面通过一系列代码来进行追踪: 通过这个程序可以看到,我在主函数中定义了一个
  • 如何将一个类对象作为一个函数的参数呢? 按照以下格式即可: def 函数名(类名) 对,只需要将类名作为形参即可,实测有效。 这一点和C++其实有点像。 我这里是将另外一个文件编写的类作为本文件的类中函数的参数 ...
  • 将引用变量作为函数参数 使用引用作为形参,会改变对应实参的值以及左值的概念 将引用应用于结构 为何要使用引用 将引用用于对象 对象、继承和引用 何时使用按值传递、按指针传递和按引用传递 默认参数 ...
  • C++ 模板作为函数模板示例

    千次阅读 2014-03-06 17:20:56
    类模板作为函数参数 函数的形参类型可以是类模板或类模板的引用,对应的实参 应该是该类模板实例化的模板类对象。 带有类模板参数的函数必须是函数模板。 #include using namespace std; template class TClass2 {...
  • 模板作为函数参数

    千次阅读 2014-03-13 15:03:14
    友元函数形参类型可以是类模板或类模板的引用,对应的实参应该是该类模板实例化的模板类对象 对于带有类模板参数的友元函数必须是函数模板 #include using namespace std; template class TClass3{ T x; ...
  • 起因:在写模板时,有一个函数,其中的一个形参是自定义的引用,目的是作为返回数据,供调用者使用。 可是,有时候调用者并不需要使用这个返回值,纯粹是仅仅实现其过程即可。如果为了使用该函数,还不得不定义...
  • **前沿:**初始化列表就是构造函数的时候传入形参并对变量赋初值,类对象作为类成员就是创建Phone类,然后再创建Person类,并在Person类中实例化Phone对象。 废话不多说,贴上代码,注意看注释 //*****以下代码的...
  • 1.1成员函数的重载运算符左侧是一个类对象,而且与运算符函数类型相同。 因为必须通过类的对象去调用该类的成员函数,而且只有运算符重载函数和返回值类型相同,运算结果才有意义。 1.2将双目运算符重载为友元函数...
  • L4---C++,对象及特殊函数 一,【前言】 对象有什么关系呢? 它们内部又有什么样的特殊函数?在本博文中, 结合着C++考试真题中的知识点,我在这里进行... 3,用什么作为拷贝构造函数形参? 4,在还没有建立对象之前
  • (2)类对象作为函数形参以传值方式传递; (3)类对象作为函数的返回值以传值方式返回。 函数实参传递和返回值的语义就等同于初始化。 所以拷贝构造函数用于用一个已存在的类对象去构造另一个新的对象; 而赋值...
  • 可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real。上节中已说明,在将运算符函数重载为成员函数后,如果...
  • //原因就是A中的形参需要用到B中的对象 class B; //再定义A class A { public: void know(B mm); protected: }; class B { public: MM(string name, int age) :name(name), age(age){} friend void boy::know...
  • 可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real。上节中已说明,在将运算符函数重载为成员函数后,...
  • this作用域是在内部,当在的非静态成员函数中访问的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它...
  • 2.编译器会对成员函数进行处理,在对象调用成员函数的时候,对象地址作为实参传递给成员函数的第一个形参this指针。 3.this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数形参中添加this的...
  • 三种情况需要调用副本构造函数: (1)明确表示由一个对象初始化另一个对象...(2)当对象作为函数实参传递给函数作形参时; (3)当对象作为函数值进行返回时。  第一种比较好理解,这里不再陈述什么了;第二种情

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 685
精华内容 274
关键字:

类对象作为函数形参