对象引用和对象指针

发布于 2024-12-10 05:27:31 字数 228 浏览 0 评论 0原文

在复制构造函数的情况下,如果我在参数中使用指针而不是引用变量,会发生什么?例如。

class MyClass
{
private: int a;
         char *str;
public:...
       ...
       MyClass(MyClass *pObj)
       {
          ....
          ....
       }
};

What happens, in case of copy constructor, if I use pointer in the parameter instead of reference variable? for ex.

class MyClass
{
private: int a;
         char *str;
public:...
       ...
       MyClass(MyClass *pObj)
       {
          ....
          ....
       }
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

⒈起吃苦の倖褔 2024-12-17 05:27:31

MyClass(MyClass *pObj)

不是复制构造函数,它是重载构造函数。

复制构造函数引用与参数相同的类型。前任:

MyClass(MyClass &)

如果您不提供自己的版本,编译器会隐式为您的类生成一个复制构造函数。
当编译器需要生成对象的副本时,将调用此复制构造函数。

上面所说的重载构造函数只有在显式调用时才会被调用。

代码示例

#include<iostream>

class MyClass
{
    private: int a;
             char *str;
    public:   
           MyClass(){}        
           MyClass(MyClass *pObj)
           {
               std::cout<<"\ninside *";
           }
           MyClass(MyClass &pObj)
           {
              std::cout<<"\ninside &";
           }    
           void doSomething(MyClass obj)
           {
               std::cout<<"\ndoSomething";
           }
};

int main()
{
      MyClass ob,ob2;
      MyClass obj2(&ob);   //Explicitly invoke overloaded constructor

      ob.doSomething(ob2); //Calls copy constructor to create temp copy of object
      return 0;
}

请注意输出为:

inside *
inside &
doSomething

MyClass(MyClass *pObj)

Is not a Copy Constructor, it is an Overloaded Constructor.

The copy constructor takes reference to the same type as argument. Ex:

MyClass(MyClass &)

The compiler generates an copy constructor for your class implicitly if you do not provide your own version.
This copy constructor will be called when compiler needs to generate a copy of an object.

The overloaded constructor said above will only be called when you explicitly call it.

Code Sample:

#include<iostream>

class MyClass
{
    private: int a;
             char *str;
    public:   
           MyClass(){}        
           MyClass(MyClass *pObj)
           {
               std::cout<<"\ninside *";
           }
           MyClass(MyClass &pObj)
           {
              std::cout<<"\ninside &";
           }    
           void doSomething(MyClass obj)
           {
               std::cout<<"\ndoSomething";
           }
};

int main()
{
      MyClass ob,ob2;
      MyClass obj2(&ob);   //Explicitly invoke overloaded constructor

      ob.doSomething(ob2); //Calls copy constructor to create temp copy of object
      return 0;
}

Note the output is:

inside *
inside &
doSomething
行至春深 2024-12-17 05:27:31

根据定义,复制构造函数是具有指向同一类的 const 引用参数的构造函数。
任何其他构造函数定义都不是“复制构造函数”,因此当您编写以下内容时,编译器不会调用它:

MyClass x = y;

MyClass x( y );

By definition, a copy constructor is a constructor with a const reference parameter to the same class.
Any other constructor definition is not a "copy constructor", so it won't be invoked by the compiler when you write something like:

MyClass x = y;

or

MyClass x( y );
虐人心 2024-12-17 05:27:31

复制构造函数应该从对象而不是指针复制。
为什么按引用传递而不是按值传递?因为如果不这样做,复制构造函数将创建参数的副本,这将是一个无限循环。

Copy constructor is supposed to make a copy from an object and not from pointer.
Why pass by Reference and not by value? Because if you don't do so, the copy constructor will go in creation of the copy of the argument and it will be an endless loop.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文